موازنة الأحمال (Load Balancing) باستخدام HAProxy


موازنة الأحمال (Load Balancing) باستخدام HAProxy

مرحباً يا شباب! اليوم رح نتكلم عن موضوع حيوي جداً لأي مهندس أنظمة: موازنة الأحمال (Load Balancing). وبالتحديد، رح نركز على واحد من أفضل وأشهر الأدوات لهذا الغرض: HAProxy.

إيش هي موازنة الأحمال وليش نحتاجها؟

ببساطة، موازنة الأحمال تعني توزيع طلبات المستخدمين (Traffic) على مجموعة من الخوادم (Servers) بدلاً من خادم واحد. تخيل عندك موقع عليه زحمة، لو كل الطلبات راحت لخادم واحد، رح ينهار بسرعة. هنا يجي دور Load Balancer اللي يوزع الشغل على عدة خوادم.

ملاحظة: الهدف الأساسي هو تحسين الأداء، زيادة التوفر (High Availability)، وقابلية التوسع (Scalability). يعني لو خادم طاح، البقية تشيل الشغل بداله، وتقدر تضيف خوادم جديدة بسهولة لما يزيد الحمل.

ليش HAProxy بالذات؟

HAProxy أداة مفتوحة المصدر ومشهورة جداً في عالم Linux. أسباب استخدامها كثيرة:

  • أداء عالي: مصممة للتعامل مع عدد ضخم من الاتصالات المتزامنة.
  • موثوقية: مستقرة جداً وتعمل بكفاءة في بيئات الإنتاج الحرجة.
  • مرونة: تدعم خوارزميات توزيع أحمال متعددة، وفحوصات صحة للخوادم (Health Checks)، وميزات متقدمة أخرى.
  • سهولة الإعداد: ملف الإعدادات بسيط ومفهوم نسبياً.

تثبيت HAProxy

التثبيت سهل جداً على أغلب توزيعات Linux. هنا مثال على Ubuntu/Debian و CentOS/RHEL:

على Ubuntu/Debian:

sudo apt update
sudo apt install haproxy

على CentOS/RHEL:

sudo yum install haproxy
# أو على الإصدارات الأحدث
sudo dnf install haproxy

بعد التثبيت، تقدر تتأكد من حالته بـ sudo systemctl status haproxy.

ملف الإعدادات الأساسي (haproxy.cfg)

القلب النابض لـ HAProxy هو ملف الإعدادات، واللي غالباً تلقاه في /etc/haproxy/haproxy.cfg. خلونا نشوف إعداد أساسي لموازنة أحمال HTTP بين خادمين ويب.

رح تلاقي الملف مقسم لأقسام رئيسية:

  • global: إعدادات عامة لعملية HAProxy نفسها.
  • defaults: إعدادات افتراضية تطبق على كل الـ frontend والـ backend ما لم يتم تجاوزها.
  • frontend: تعرف فيه كيف يستقبل HAProxy الطلبات (البورت، البروتوكول، إلخ).
  • backend: تعرف فيه مجموعة الخوادم اللي رح يوزع عليها HAProxy الطلبات.

هذا مثال لإعداد بسيط:

# إعدادات عامة لـ HAProxy
global
    log /dev/log    local0
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

# إعدادات افتراضية تنطبق على كل الـ frontend والـ backend
defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5000ms  # مهلة الاتصال بالخادم الخلفي
    timeout client  50000ms # مهلة انتظار العميل
    timeout server  50000ms # مهلة انتظار الخادم الخلفي

# الواجهة الأمامية (Frontend) - تستقبل الطلبات
frontend http_front
    bind *:80           # استمع على جميع الايبيهات على البورت 80
    mode http           # تعامل مع الطلبات كـ HTTP
    default_backend http_back # أرسل جميع الطلبات إلى الـ backend المسمى 'http_back'

# الواجهة الخلفية (Backend) - مجموعة الخوادم
backend http_back
    mode http
    balance roundrobin  # خوارزمية توزيع الأحمال: Round Robin (دائري)
    server web1 192.168.1.10:80 check # الخادم الأول: اسمه web1، عنوانه IP:Port، مع فحص صحة
    server web2 192.168.1.11:80 check # الخادم الثاني: اسمه web2، عنوانه IP:Port، مع فحص صحة

بعد ما تعدل الملف، لازم تعيد تشغيل HAProxy عشان تطبق الإعدادات:

sudo systemctl restart haproxy

خوارزميات موازنة الأحمال (Load Balancing Algorithms)

في قسم الـ backend، سطر balance هو اللي يحدد كيف يوزع HAProxy الطلبات. أشهر الخوارزميات:

  • roundrobin: (الافتراضي) يوزع الطلبات بالتساوي بين الخوادم بالترتيب. بسيط وفعال لمعظم الحالات.
  • leastconn: يرسل الطلبات للخادم اللي عنده أقل عدد من الاتصالات النشطة. مفيد لما تكون مدة معالجة الطلبات مختلفة بين الخوادم.
  • source: يستخدم عنوان IP للعميل لتحديد الخادم. هذا يضمن أن نفس العميل يرجع لنفس الخادم، وهو مفيد لـ "الجلسات اللصقة" (Sticky Sessions) بدون إعدادات إضافية معقدة.

فحوصات الصحة (Health Checks)

ميزة قوية في HAProxy هي قدرته على فحص صحة الخوادم الخلفية. لو خادم طاح أو صار بطيء، HAProxy رح يوقفه مؤقتاً عن استقبال الطلبات لحد ما يرجع طبيعي. هذا هو دور كلمة check في تعريف الخادم:

server web1 192.168.1.10:80 check

تقدر تحدد تفاصيل أكثر للفحص، مثلاً: check inter 2s fall 3 rise 2 (افحص كل ثانيتين، لو فشل 3 مرات اعتبره ميت، لو نجح مرتين اعتبره حي).

صفحة إحصائيات HAProxy (Stats Page)

HAProxy يوفر صفحة ويب مدمجة تعرض إحصائيات حية عن حالة الخوادم، عدد الاتصالات، ومعدل نقل البيانات. مفيدة جداً للمراقبة.

لتمكينها، أضف هذا القسم لملف haproxy.cfg:

listen stats
    bind *:8080
    mode http
    stats enable
    stats uri /haproxy?stats # المسار اللي رح توصل منه للصفحة
    stats realm HAProxy\\ Statistics # اسم المجال في صفحة تسجيل الدخول
    stats auth admin:password123 # اسم المستخدم وكلمة المرور للدخول
    stats refresh 10s

بعد إعادة تشغيل HAProxy، تقدر تدخل على الصفحة من خلال متصفحك: http://<عنوان_IP_HAProxy>:8080/haproxy?stats

ملاحظات إضافية (خيارات متقدمة)

  • إنهاء SSL (SSL Termination): HAProxy يقدر يتعامل مع شهادات SSL ويفك تشفير الاتصال، ويرسل الطلب للخوادم الخلفية بصيغة HTTP عادية. هذا يريح الخوادم الخلفية من عبء التشفير.
  • الجلسات اللصقة (Sticky Sessions): في بعض التطبيقات، تحتاج أن يبقى العميل متصلاً بنفس الخادم الخلفي طوال مدة جلسته. HAProxy يوفر آليات لتحقيق ذلك (مثل استخدام الكوكيز).
  • قوائم التحكم بالوصول (ACLs): تسمح لك باتخاذ قرارات توجيه معقدة بناءً على معايير مختلفة (مثل عنوان IP للعميل، المسار في URL، نوع المتصفح، إلخ).

الخلاصة

HAProxy أداة قوية جداً وأساسية لأي بنية تحتية ويب حديثة. سواء كنت تدير موقع صغير أو تطبيق كبير، HAProxy رح يساعدك على ضمان توفر عالي، أداء ممتاز، وقابلية توسع سلسة. الإعدادات الأساسية سهلة، ومع التعمق فيها رح تكتشف قوة رهيبة لخدمة تطبيقاتك.

طبقوا الأمثلة، جربوا بأنفسكم، ورح تكتشفون قد إيش HAProxy مفيد!