امروزه هرکسی که با وبسایتها و اپلیکیشنهای بزرگ سروکار داره، میدونه که یکی از بزرگترین چالشها، مدیریت ترافیک و بالا نگه داشتن سرورهاست. وقتی تعداد کاربران زیاد میشه، اگر نتونی درست ترافیک رو بین سرورهات پخش کنی، دیر یا زود زیر فشارشون له میشی! اینجا جاییه که HAProxy به عنوان یه قهرمان مخفی وارد بازی میشه.
اما چرا HAProxy؟ چرا از ابزارهایی مثل Nginx یا Traefik استفاده نکنیم؟ بیاید یه مقایسه ریز و جذاب داشته باشیم و بعد بریم سراغ اینکه HAProxy چیه و چرا انقدر تو این حوزه محبوبه.
خب، اگه داری از خودت میپرسی چرا HAProxy رو انتخاب کنیم و مثلاً Nginx یا Traefik بهتر نیستن، باید بگم که همه این ابزارها توی دنیای خودشون کاربردهای فوقالعادهای دارن. بیاید یه نگاه سریع بندازیم:
وقتی حرف از Load Balancing پیش میاد، HAProxy یکی از قدرتمندترین و قدیمیترین ابزارهای این حوزه به حساب میاد. توی دنیایی که هر روز درخواستها و ترافیک بیشتری به سمت سرورها روانه میشه، HAProxy با عملکرد بینقص و ویژگیهای پیشرفتهاش، بهترین انتخاب برای کنترل و توزیع ترافیکه.
وقتی صحبت از میلیونها درخواست در لحظه به میونه، HAProxy بدون هیچ لغزشی ترافیک رو به بهترین شکل بین سرورها پخش میکنه. مهم نیست چندتا سرور داری، HAProxy مطمئن میشه که هرکدوم به درستی و با بهینهترین حالت ممکن درخواستها رو پاسخ بدن.
علاوه بر اینها، HAProxy با داشتن قابلیتهای پیشرفته زیر، به یه ابزار قدرتمند تبدیل شده:
/blog
رو به یه سری سرورهای خاص بفرستی و بقیه درخواستها رو به سرورهای دیگهاین ابزار توی لایههای 4 (لایه TCP) و 7 (لایه اپلیکیشن) شبکه کار میکنه و میتونه هم ترافیک TCP و هم ترافیک HTTP/HTTPS رو مدیریت کنه. هرکدوم از اینها برای یه نوع سناریو و نیاز خاص طراحی شدن. حالا بیایید ببینیم که هر کدوم چی هستن و کجاها به درد میخورن.
تصور کن که یه سایت داری و هیچ Load Balancer ای هم استفاده نکردی. یعنی کاربر مستقیم میاد روی سرورت و درخواستش رو میفرسته. خب، همهچی خوبه تا اینکه سرورت بخواد از کار بیفته! اون وقت چی؟ هیچی، کاربر توی حسرت میمونه و سایتت بالا نمیاد.
یا حتی اگه ترافیک بالا باشه، سرورت میتونه زیر بار درخواستها به زانو دربیاد. در این حالت، کاربرا یا باید ساعتها منتظر بمونن تا صفحه لود بشه، یا کلاً بیخیال سایتت بشن.
نتیجه: بدون Load Balancer، آینده تاریکه!
خب، وقتی تصمیم میگیری کمی حرفهایتر بشی، وارد Load Balancing لایه 4 میشی. توی این حالت، HAProxy یا هر Load Balancer دیگه، درخواستهای کاربرا رو براساس آدرس IP و پورت مدیریت میکنه.
یعنی چی؟ یعنی هر درخواست که برای سایتت میاد، Load Balancer براساس IP و پورت، اون رو به یکی از سرورهای بکاند میفرسته. مثلاً اگه کسی آدرس http://Hosseinjafari.com رو بزنه، ترافیک روی پورت 80 میره به یکی از سرورهای بکاند.
یه مثال سادهاش اینه:
توی لایه 4 معمولاً همه سرورها باید محتوای یکسان ارائه بدن، چون اگه نه، ممکنه کاربرها صفحات مختلف و عجیبی رو ببینن.
خب، اگه بخوای یه قدم جلوتر بری و ترافیک رو براساس محتوای درخواستها مدیریت کنی، باید بری سراغ Load Balancing در لایه 7. این لایه دقیقاً همون جاییه که HAProxy میتونه باهوشتر بشه و براساس URLها، هدرهای HTTP و حتی کوکیها، درخواست رو به سرورهای مختلف بفرسته.
مثلاً فرض کن یه سایت داری که هم یه بخش وبلاگ داره و هم یه اپلیکیشن. حالا میخوای هرکی وارد وبلاگ شد بره به یه سری سرور که فقط بلاگ رو سرو کنن و اگه کسی وارد بخش اپلیکیشن شد، بره به یه سرور دیگه.
مثال کد پیکربندی این شکلی میشه:
frontend http bind *:80 mode http acl url_blog path_beg /blog use_backend blog-backend if url_blog default_backend web-backend
اینجا، ACL ها تعیین میکنن که اگه کسی وارد blog/ شد، ترافیک بره سمت blog-backend. اگه وارد چیز دیگهای شد؟ خب، ترافیک به web-backend میره.
اینجوری میتونی به راحتی یه سایت چندمنظوره رو مدیریت کنی و هر بخشش رو به سرورهای مختلف بفرستی.
خب، اگه تاحالا با HAProxy کار کرده باشی، میدونی که همهچیز توی یه فایل به اسم haproxy.cfg
تنظیم میشه. این فایل کلیدی همه رفتارهای HAProxy رو کنترل میکنه، از دریافت ترافیک تا فرستادنش به سرورهای بکاند. اما صبر کن، فقط با frontend و backend کار تموم نمیشه! باید تنظیمات بیشتری مثل global، defaults و حتی listen رو هم درست کنی. این یه قالب کلی از haproxy.cfg هست و در ادامه کامل توضیح میدم هر کدوم چی هست
global # process-level settings go here defaults # default settings go here frontend listener # a frontend that accepts requests from clients backend webservers # servers that fulfill the requests
پس بیایید با هم ببینیم که این اجزا چی هستن و هرکدوم چه نقشی دارن. و البته، قول میدم که خستهکننده نباشه و حسابی فان بنویسم!
Global در واقع همونجاییه که تنظیمات همهچیز رو تعیین میکنی. این بخش حکم مرکز فرماندهی HAProxy رو داره. هرچیزی که توی بخش global تنظیم میکنی، روی کل HAProxy اعمال میشه. مثلاً میتونی کاربر و گروه رو تنظیم کنی، یا تعیین کنی HAProxy کجا لاگهاش رو بنویسه
global
log /dev/log local0
log /dev/log local1 notice
user haproxy
group haproxy
daemon
توضیح بخشهای بالا:
syslog
).خب، حالا که تنظیمات global رو انجام دادی، میرسیم به defaults. این بخش مثل یه راهنمای عمومی برای همهی frontend و backend ها عمل میکنه. یعنی هر تنظیماتی که توی defaults بنویسی، بهصورت پیشفرض روی همه بخشها اعمال میشه، مگه اینکه خودت اون رو برای یه frontend یا backend خاص تغییر بدی.
defaults log global mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms
توضیح بخشهای بالا:
خب، بریم سراغ بخش جذاب! Frontend مثل دروازهبان تیم فوتباله. هر ترافیکی که از سمت کاربرا به سرور تو میاد، اول از این دروازه عبور میکنه. توی بخش frontend مشخص میکنی که درخواستهای ورودی روی چه پورتی بیان و به کجا هدایت بشن.
frontend http-in
bind *:80
default_backend servers
توضیح بخشهای بالا:
servers
.خب، حالا که ترافیک از دروازه رد شد، وقتشه که تصمیم بگیریم کجا بره. Backend دقیقا همونجاییه که درخواستهای ورودی به سرورهای بکاند هدایت میشن. اینجا میتونی لیست سرورها رو مشخص کنی و حتی تعیین کنی که از چه الگوریتم Load Balancing استفاده بشه.
backend servers
balance roundrobin
server server1 127.0.0.1:8080 maxconn 32
server server2 127.0.0.1:8081 maxconn 32
توضیح بخشهای بالا:
server1
و server2
هرکدوم روی یه پورت خاص گوش میدن و maxconn تعیین میکنه که حداکثر چندتا کانکشن رو میتونن همزمان هندل کنن.Listen در HAProxy ترکیبی از بخشهای frontend و backend هست. وقتی میخوای هم ورودیها رو مدیریت کنی و هم ترافیک رو به سرورهای بکاند هدایت کنی، از Listen استفاده میکنی. این بخش میتونه همزمان درخواستها رو دریافت و به سرورهای درست مسیریابی کنه.
مانیتورینگ در HAProxy با Listen Stats
یکی از مهمترین بخشهای HAProxy برای محیط Production قابلیت مانیتورینگ هست. بخش Stats یا همون Statistics بهت این امکان رو میده که وضعیت سلامت سرورها، تعداد اتصالات، ترافیک دریافتی و خیلی چیزهای دیگه رو بهصورت لحظهای بررسی کنی. این بخش بهت کمک میکنه تا مشکلات رو سریع تشخیص بدی و کارایی سرورهات رو بررسی کنی
مثال برای مانیتورینگ با Listen:
listen stats bind *:8080 mode http stats enable stats uri /stats stats auth admin:password
توضیح بخشهای بالا:
admin
و پسورد password
).HAProxy یه جعبه ابزار پر از الگوریتمهای مختلف برای Load Balancing داره که هرکدوم برای شرایط و سناریوهای خاصی بهینهسازی شدن. بسته به اینکه میخوای ترافیک رو چطور پخش کنی و اولویتهات چی هست، میتونی از این الگوریتمها استفاده کنی. حالا بیایید همه این الگوریتمها رو بهصورت کامل بررسی کنیم:
1. Round-Robin
2. Least Connections
3. Source IP Hash
4. URI Hash
5. HTTP Header Hash
6. Static-rr (Weighted Round-Robin)
7. First
8. Random with Weight
جمعبندی – کدوم الگوریتم برای تو مناسبه؟
انتخاب الگوریتم مناسب Load Balancing بستگی به نیاز و سناریوی کاری داره. اگر همه سرورات مشابه هستن و ترافیک یکنواخت داری، Round-Robin کافیه. اگه نیاز داری که بار کاری سرورها متعادل بشه، Least Connections عالیه. برای Session Persistence هم حتماً از Source IP Hash استفاده کن.
هرکدوم از این الگوریتمها نقاط قوت و ضعف خودشون رو دارن، پس براساس شرایط و نیازات انتخاب کن تا بهترین کارایی رو از HAProxy بگیری!
فرض کن یه سایت داری که باید از HTTPS استفاده کنه و میخوای فشار پردازش SSL رو از روی سرورهای بکاند برداری. با HAProxy این کار خیلی سادهست:
cat /etc/letsencrypt/archive/example.com/fullchain1.pem /etc/letsencrypt/archive/example.com/privkey1.pem > /etc/haproxy/haproxy.pem
تنظیم frontend و backend:
frontend https-in bind *:443 ssl crt /etc/haproxy/haproxy.pem default_backend servers backend servers balance roundrobin server server1 127.0.0.1:8080 check server server2 127.0.0.1:8081 check
ابزار HAProxy یه ابزار قدرتمند و حرفهای برای مدیریت ترافیک و Load Balancingه که توی هر شبکهای که نیاز به مقیاسپذیری و عملکرد بالا داره، میدرخشه. با قابلیتهایی مثل SSL termination، Rate Limiting و ACLها، این ابزار به یکی از مهمترین انتخابها برای مدیران شبکه و DevOps تبدیل شده.
اگه میخوای ترافیکت رو بهصورت حرفهای مدیریت کنی و همیشه مطمئن باشی که سرورهات بهدرستی کار میکنن، HAProxy انتخاب بینظیریه!