آشنایی با HAproxy و مفاهیم Load Balancing
HAproxy
HAproxy مخفف High Availability Proxy است که یکی از محبوب ترین نرم افزارهای Load Balancing است که می تواند روی سیستم عاملهای Linux ،Solaris و FreeBSD اجرا شود. Load Balancer با پخش کردن load روی سرورها باعث افزایش کارایی و دردسترس بودن سرورهای شما میشود.HAproxy در بسیاری از محیطهایی با درخواست بالا نظیر GitHub ، Imgur، Instagramو Twitter استفاده میشود. در این مقاله با اصول و مفاهیم Load Balancer و پیادهسازی Load Balancer های Active/Passive آشنا میشویم.
انواع Load Balancing
No Load Balancing
یک نرم افزار ساده تحت وب بدون Load Balancer به شکل زیر عمل میکند است.
در این مثال کاربران مستقیما به وب سرور متصل میشوند و هیچ نوع Load Balancer وجود ندارد. اگر وب سرور ما متوقف شود، نرم افزار تحت وب ما دیگر کار نخواهد کرد و کاربر نمی تواند به آن متصل شود. اگر هم تعداد درخواستها بسیار بالا برود وب سرور نمیتواند به خوبی پاسخگو باشد و مشکل کندی سرویس به وجود میآید و یا ممکن است سرور Crash کند و از دسترس خارج شود.
Load Balancing لایه 4
ساده ترین راه Load Balancing ترافیک سرورها، استفاده از Load Balancing لایه 4 است. در این روش با توجه با IP Range و Port ترافیک کاربر ابتدا به Load Balancer میرسد و سپس به وب سرورها تحویل داده میشود. همانطور که در شکل مشاهده میکنید هر دو وب سرور باید به یک Database متصل باشند یا Database ها باهم sync باشند تا از نگاه کاربر تفاوتی نداشته باشد که به کدام وب سرور متصل میشود و باید اطلاعات هر دو وب سرور یکسان باشد.
Load Balancing لایه 7
راه پیچیده تری برای Load Balancing استفاده از Load Balancing لایه 7 میباشد. با استفاده از این نوع Load Balancing می توانید بر اساس محتوای درخواستی کاربران، آنها را به سرورهای مختلف ارجاع دهید.
در این مثال اگر کاربر شما دامنه xaas.ir/content/magazine/all را وارد کند توسط Load Balancer به سرور blog-backend فرستاده میشود و بقیه درخواست ها به سرور web-backend فرستاده میشوند که سرویس دیگری روی آن درحال اجرا است. در این سناریو ما هر دو وب سرور را به یک Database متصل کرده ایم.
الگوریتم های Load Balancing
الگوریتمهای Load Balancing مشخص میکنند که کدام سرور در هنگام Load Balancing انتخاب شود. HAproxy الگوریتم های زیادی را پشتیبانی میکند. ما در اینجا به چند مورد متداول از الگوریتم ها میپردازیم:
Roundrobin
در این روش به نوبت درخواستها به سرورها هدایت میشوند. مثلا درخواست 1 به سرور 1 و درخواست 2 به سرور 2 و به همیت ترتیب به صورت نوبتی درخواستها بین سرورها تقسیم میشوند.
Least connection
وقتی این حالت روی Load Balancer تنظیم شده باشد، درخواست به سروری ارجاع داده میشود که کمترین connection را از سمت کاربر دارد. این روش برای سرویسهایی که نیاز به ارتباط طولانی دارند توصیه میشود.
source
این الگوریتم بر اساس hash IP مبدا انتخاب میکند که کاربر به کدام سرور متصل شود. این روش تضمین میکند که کاربر با IP یکسان همواره به یک سرور متصل شود.
ارتباط چسبناک (Sticky Sessions)
ممکن است این نیاز را داشته باشید کاربری که به یک سرور متصل شد همواره به آن وصل باشد. با استفاده از قابلیت Sticky Session این امکان فراهم میشود. شاید فکر کنید که قابلیت Sticky Sessions چه تفاوتی با الگوریتم Source دارد؟ در اینجا باید به این نکته توجه داشته باشیم که الگوریتم Source بر اساس IP کار میکند و IP کاربران تغییر میکند در صورتی که با Sticky Sessions همواره یک کاربر درخواستش به یک سرور مشخص میرسد.
تست سلامت (Health Check)
HAproxy برای اینکه بداند کدام یک از سرورها سالم هستند و آیا میتواند درخواستها را به آنها بفرستد یک Health Check با تمام سرورها انجام میدهد که اگر آنها در دسترس نباشند دیگر به آن سرورها درخواست نمیفرستد تا زمانی که دوباره در دسترس قرار بگیرند و این کار را به صورت خودکار انجام میدهد. مسلما اگر تمام سرور ها از دسترس خارج شوند، دیگر سرویس کار نخواهد کرد تا حداقل یکی از سرورها به مدار بازگشت داده شود.
High Availability
در تمامی سناریوهایی که بررسی کردیم اگر سرورLoad Balancer شما از دسترس خارج شود نه تنها عملLoad Balancing صورت نمیگیرد بلکه دسترسی به وب سرور های شما نیز قطع شده و سرویس به طور کامل از دسترس خارج میشود.
مکانیزم High Availability) HA) یک زیرساخت بسیار دردسترس و بدون قطع شدن سرورها را برای ما فراهم میکند. این مکانیزم با استفاده از ایجاد چندین سرور این امکان را فراهم میکند که اگر یکی از سرورها به هر علتی از دسترس خارج شد، سرور دیگر جایگزین شده و تا زمانی که سرور اصلی بازگردد کار را انجام میدهد و شما فرصت دارید که سرور اصلی را بررسی کنید و سرور دیگر در حال سرویس دهی است.
یک Load Balancer این مکانیزم را برای سرورهای Backend انجام میدهد ولی برای خود Load Balancer هم باید این کار انجام شود.
در سناریو بالا با ایجاد کردن چند Load Balancer (یکی Active و دیگری Passive) پشت سر یک Virtual IP) IP مجازی) – که امکان این را دارد بین دو سرور تغییر کند – ، مکانیزم HA پیاده سازی شده است.
کاربران با وارد کردن IP به سمت Active Load Balancer میروند و سپس به یکی از وب سرورها متصل میشوند. حال اگر یکی از Load Balancerها fail شود، به صورت خودکار با استفاده از مکانیزم HA که پیاده سازی شده است Virtual IP به سمت سرور دیگر میرود و سرویسدهی ادامه پیدا میکند.