توضیح Load Balancing به زبان ساده

لود‌بالانسینگ (متعادل نمودن بار ترافیکی) یه مؤلفه‌ی کلیدی در زیرساخت‌های با دسترس‌پذیری بالاست که معمولا ازش استفاده میشه تا کارایی (performance) و قابلیت اطمینان (reliability) وب‌سایت‌ها، اپلیکیشن‌ها، دیتابیس‌ها و انواع دیگه‌ی سرویس‌ها، با توزیع کردن حجم کار روی چندین سرور، بالا بره.

یه زیرساخت وب که هیچ لود‌بالانسینگی نداره احتمالا چیزی شبیه به تصویر زیره:

توی این مثال، کاربر به طور مستقیم و از دامنه‌ی yourdomain.com به وب‌سرور متصل میشه. اگه این یک وب‌سرور از دسترس خارج بشه، کاربر دیگه نمیتونه به وب‌سایت دسترسی داشته باشه. علاوه‌بر این، اگه تعداد بیشتری کاربر تلاش کنن که به طور همزمان به سرور دسترسی داشته‌باشن و سرور نتونه به حجم درخواست‌ها رسیدگی کنه، کاربرها ممکنه با کاهش سرعت لود شدن و یا اساسا ناتوانی در اتصال به سرور مواجه بشن.

مشکل این یک وب‌سرور، که نقطه‌ی حساسیه که میتونه باعث از کار افتادن کل سیستم بشه (single point of failure)، رو میشه با استفاده از یک load balancer و حداقل یک وب‌سرور اضافه‌ی دیگه در بک‌اند حل کرد. معمولا به این شکله که تمام سرورهای بک‌اند محتوای یکسانی رو به عنوان پاسخ درخواست به کاربر برمیگردونن تا کاربر همیشه محتوای سازگار و یکسانی رو فارق از سروری که به اون درخواست داده، دریافت کنه.

در مثال بالا، ابتدا کاربر درخواستش رو به لود‌بالانسر میده که سپس لود‌بالانسر درخواست کاربر رو به یکی از سرورها در بک‌اند منتقل میکنه و بعد از اون سرور پاسخ درخواست کاربر رو به طور مستقیم میده. در مثال بالا، نقطه‌ای که میتونه به شکست کل سیستم منجر بشه، خود load balancer هست. این مشکل رو میشه با معرفی یک load balancer دوم حل کرد. اما قبل از اون بیاید تا ببینیم لود‌بالانسرها چجوری کار میکنن.

لودبالانسر‌ها چه نوع ترافیکی رو میتونن مدیریت کنن؟

ادمین‌های load balancer یک سری از قوانین فوروارد (forwarding rules) رو برای چهار نوع اصلی از ترافیک تعریف میکنن:

  • پروتکل HTTP - این کار با هدایت کردن درخواست‌ها برپایه‌ی مکانسیم‌های استاندارد HTTP انجام میگیره. لودبالانسر هدر‌های X-Forwarded-For، X-Forwarded-Proto و X-Forwarded-Port رو تنظیم میکنه تا به بک‌اند اطلاعات لازم درمورد درخواست اصلی رو منتقل کنه.
  • پروتکل HTTPS - بالانس کردن درخواست‌های HTTPS دقیقا شبیه به HTTP عمل میکنه با این تفاوت که رمزگزاری رو هم داخلش داره. رمزگزاری با یکی از این دو راه انجام میشه: یا با SSL passthrough ‌که رمزگزاری رو توی تمام مسیر تا بک‌اند برقرار میکنه و یا با SSL termination که مسئولیت رمزگشایی رو به دوش load balancer میذاره و ترافیکی که از لود‌بالانسر به بک‌اند میره رمزگزاری نشده است.
  • پروتکل TCP - برای اپلیکیشن‌هایی که از HTTP یا HTTPS استفاده نمی‌کنن، ترافیک TCP رو نیز میشه بالانس کرد. برای مثال، میشه ترافیک یک کلاستر دیتابیس رو روی تمام سرورها پخش کرد.
  • پروتکل UDP - به تازگی، بعضی از لودبالانسرها از پروتکل‌های هسته‌ی اینترنت مثل DNS و syslogd، که با UDP کار میکنن، هم پشتیبانی میکنن.

قوانین فوروارد (forwarding rules) پروتکل و پورت روی خود لودبالانسر رو تعریف میکنن و اون‌ها رو نگاشت (map) میکنن روی پروتکل و پورتی که لودبالانسر از اون استفاده میکنه برای هدایت ترافیک در بک‌اند.

چگونه load balancer سرور بک‌اند رو انتخاب میکنه؟

لودبالانسرها برپایه‌ی ترکیب دو فاکتور انتخاب میکنن که درخواست رو به چه سروری منتقل کنن. load balancerها اول مطمئن میشن که سروری که میخوان انتخاب کنن میتونه به درستی به درخواست‌ها جواب بده و سپس از یک قانون از پیش‌تعیین‌شده برای انتخاب از بین سرورهای سالم استفاده میکنن.

تست‌های سلامتی

لودبالانسرها باید ترافیک رو فقط به سرورهای بک‌اند «سالم» ارسال کنن. برای مانیتور کردن سلامتی سرور بک‌اند، تست‌های سلامتی (health checks) به طور منظم تلاش میکنن تا با پورت و پروتکل تعریف شده در قوانین فوروارد، به سرورهای بک اند وصل بشن و مطمئن بشن که سرورها در حال گوش‌دادن برای درخواست هستند. اگه یه سرور تست سلامتی رو با موفقیت نگذرونه، و در نتیجه نتونه به درخواست‌ها رسیدگی کنه، به طور خودکار از استخر (pool) [مترجم: مجموعه‌ی سرورها] حذف میشه و دیگه ترافیکی به اون منتقل نمیشه تا زمانیکه دوباره به تست‌های سلامتی پاسخ بده.

الگوریتم‌های Load Balancing

از الگوریتم load balancingی که تعیین شده استفاده میشود تا از بین سرورهای سالم در بک‌اند یکی انتخاب بشه. چندتایی از الگوریتم‌های متداول عبارتند از:

الگوریتم Round Robin - این الگوریتم سرورها رو به ترتیب انتخاب میکنه. لودبالانسر برای اولین رکوئست، اولین سرور رو در لیست انتخاب میکنه و برای دومین رکوئست دومی رو و به همین ترتیب جلو میره و وقتی به آخر لیست رسید دوباره از اول شروع میکنه.

الگوریتم Least Connections (کمترین اتصال‌ها) - این الگوریتم اول سروری رو انتخاب میکنه که در حال حاضر کمترین اتصال ممکن بهش انجام شده و استفاده از این الگوریتم زمانی توصیه میشه که ترافیک به نحویه که زمان اتصال رکوئست‌ها زیاده.

الگوریتم Source (منبع) - لودبالانسر با این الگوریتم، برپایه‌ی هش IP منبع رکوئست، سرور رو انتخاب میکنه. این متد تضمین میده که یک کاربر مشخص، همواره به یک سرور یکسان وصل بشه.

الگوریتم‌هایی که ادمین امکان استفاده ازشون رو داره، براساس نوع تکنولوژی load balancerی که ازش استفاده میکنه، میتونه متفاوت باشه.

چجوری لودبالانسر stateها رو مدیریت میکنه؟

بعضی از اپلیکیشن‌ها نیاز دارن تا کاربر همواره به یک سرور یکسان در بک‌اند متصل بشه. یک راه، استفاده از یک الگوریتم Source هست که نوعی وابستگی رو بین اطلاعات IP کاربر و سروری که بهش متصل میشه ایجاد میکنه. راه دیگه برای حل این مشکل در سطح اپلیکیشن وب، اسمش sticky sessions هست. در این روش، لود بالانسر یک cookie مخصوص رو ست میکنه و با استفاده از اون همه‌ی درخواست‌های اون session به یک سرور فیزیکی یکسان فرستاده میشن.

لودبالانسر‌های اضافی

برای این که load balancer در سیستم به نقطه‌ی شکست تبدیل نشه، یک load balancer دوم رو اضافه میکنیم تا با اولی تشکیل یه خوشه (cluster) بدهند. در این طراحی، هر لودبالانسر، وضعیت سلامتی دیگری رو زیرنظر داره و هرکدوم از اون‌ها به طور یکسان قابلیت تشخیص شکست و بهبود دارند.

در صورتیکه لودبالانسر اصلی از کار بیافته، DNS مسئول اینه که کاربرها رو به لودبالانسر دوم هدایت کنه. از اونجایی که اعمال تغییرات DNS در اینترنت میتونه زمان قابل توجهی رو بگیره و برای این که حل مشکلِ از کارافتادنِ لودبالانسر به طور اتوماتیک انجا بشه، خیلی از ادمین‌ها از سیستم‌هایی مثل IPهای شناور (floating IPs) استفاده میکنن که اجازه‌ میدن نگاشتِ آدرس‌های IP به طور منعطف انجام بشه. با اینکار، در صورت نیاز سیستمِ نگاشت ِآدرس‌هایِ IP، پروسه‌ی تکثیر (propagation) و caching که در ذات تغییرات DNS هست رو با انتصاب یک IP استاتیک، که در صورت نیاز به آسانی قابل تغییره، حل میکنه. نام دامنه همیشه به یک IP یکسان متصله و تنها خود آدرس IP بین سرورها جابه‌جا میشه.

در زیر، میتونید یک زیرساخت با دسترس‌پذیری بالا رو که از IPهای شناور استفاده میکنه، مشاهده کنید:

منبع: https://www.digitalocean.com/community/tutorials/what-is-load-balancing
لینک نوشته در وبلاگ شخصی من: mahdavipanah.com/blog/load-balancing