Polar Proxy؛ استفادهٔ دوباره از connection با تطبیق دقیق و کاهش کار تکراری

چرا مهم است

اگر با connection pool کار می‌کنی، این طراحی نشان می‌دهد آزاد بودن connection برای استفادهٔ دوباره کافی نیست. در Polar Proxy،؜ سازگاری startup و هویت client هم بخشی از تصمیم‌اند و هزینهٔ انتخاب connection جدا از اجرای query بررسی می‌شود.

قبل از خواندن، این‌ها را بدان۵ مفهوم
cache

محلی برای نگهداری موقت داده یا منابع قابل استفادهٔ دوباره، به‌جای دریافت یا آماده‌سازی مجدد آن‌ها.

بیشتر: cache

event loop

چرخه‌ای که رویدادها و کارهای آماده را پی‌درپی پردازش می‌کند و می‌تواند پیشرفت چندین connection را مدیریت کند.

بیشتر: event loop

connection pool

مجموعه‌ای از connection‌های باز که برای درخواست‌های بعدی دوباره استفاده می‌شوند تا هر درخواست نیازمند ساخت connection تازه نباشد.

در حال نگارش: connection pool

mutex

ابزاری برای محدود کردن دسترسی به یک بخش مشترک، به‌طوری که در هر لحظه فقط یک thread وارد بخش محافظت‌شده شود.

در حال نگارش: mutex

power-of-two-choices

روشی برای توزیع بار که دو گزینه را به‌صورت تصادفی انتخاب و سپس گزینهٔ کم‌بارتر را از میان آن دو تعیین می‌کند.

در حال نگارش: power-of-two-choices

پس از انتخاب server برای یک read،؜ پیدا کردن connection مناسب هم می‌تواند زیر بار زیاد به گلوگاه تبدیل شود. مقالهٔ Polar Proxy توضیح می‌دهد که بررسی مکرر فهرست connection‌ها، به‌روزرسانی شمارنده‌های مشترک و رقابت بر سر lock چگونه به هزینهٔ هر query اضافه می‌کنند و این پروژه چه تغییرهایی در این مسیر داده است.

استفادهٔ دوباره از connection صرفاً به آزاد بودن آن وابسته نیست. در این طراحی، چهار بخش باید دقیقاً تطبیق داشته باشند: نسل startup profile،؜ hash مربوط به user و database،؜ هویت startup سمت client و startup options. هویت client فقط وقتی مقایسه می‌شود که startup profile آن را همراه داشته باشد؛ در وضعیت فعلی، endpoint بخشی از این هویت است. مقاله می‌گوید pool عمومی ProxySQL نمی‌تواند همهٔ نیازهای PolarDB،؜ از جمله state مربوط به LSN و transaction،؜ را در بررسی سازگاری بیان کند.

در طراحی Polar Proxy،؜ connection pool مرکزی تنها مالک connection‌های قابل استفادهٔ دوباره برای read است. reader pool فقط server و سیاست‌هایی مثل LSN target،؜ سقف lag و warmup را انتخاب می‌کند. برای هر server،؜ یک index با کلید تطبیق دقیق وجود دارد و جابه‌جایی connection میان فهرست‌های FREE و USED،؜ همراه با تغییر index و شمارنده‌ها، زیر یک mutex انجام می‌شود.

هر worker می‌تواند connection استفاده‌شده را در یک cache از نوع thread-local نگه دارد؛ به‌صورت پیش‌فرض فقط تا پایان همان دور event loop. read بعدی روی همان server،؜ در صورت تطبیق، بدون مراجعه به pool مشترک از آن استفاده می‌کند. این cache مالک دوم connection نیست و connection همچنان در فهرست USED حساب می‌شود. اگر worker دیگری منتظر همان کلید باشد، connection سازگار به pool مشترک برمی‌گردد؛ connection ناسازگار از بین می‌رود.

برای انتخاب میان بیش از دو reader،؜ روش power-of-two-choices یا P2C بار نسبی دو گزینه را مقایسه می‌کند. رسیدن به LSN target جداگانه بررسی می‌شود. در حالت مشخصی با حداقل سه reader هم‌وزن، انتخاب می‌تواند به همان دو گزینه محدود بماند؛ اما اگر شرط‌های لازم برقرار نباشند، بررسی به کل فهرست گسترش پیدا می‌کند.

نکته کلیدی

cache محلی worker را با مالکیت مستقل connection یکی نگیر. در این طراحی، connection محلی همچنان در USED حساب می‌شود؛ برای درک مسیر استفادهٔ دوباره، هم کلید تطبیق دقیق را دنبال کن و هم قواعد برگشت به pool مشترک را.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۴)