موازنة الأحمال (Load Balancing) باستخدام HAProxy
مقدمة
تُعد موازنة الأحمال باستخدام HAProxy من أهم التقنيات التي تُستخدم لرفع الاعتمادية وتحسين الأداء عند تشغيل التطبيقات والخدمات على أكثر من خادم. الفكرة الأساسية تقوم على توزيع الطلبات الواردة على مجموعة من الخوادم الخلفية بدل تركيز الحمل على خادم واحد فقط، ما يقلل احتمالية التوقف ويحسن تجربة المستخدم.
هذه التقنية ترتبط مباشرة بمفاهيم الشبكات والخوادم، لذلك من المفيد الإلمام بأساسيات مثل أساسيات شبكات لينكس: العناوين، المنافذ، والبروتوكولات (IP, SSH, DNS)، وكذلك فهم دور الخادم العكسي Reverse Proxy كما في مقال إعداد وتكوين خوادم الويب (Nginx/Apache) وتحسين أدائها (Reverse Proxy). وعند استخدام HAProxy بشكل صحيح، يصبح من الممكن إدارة المرور بكفاءة عالية حتى مع ازدياد عدد الزوار.
ما هو HAProxy ولماذا يُستخدم؟
HAProxy هو اختصار لـ High Availability Proxy، وهو برنامج مفتوح المصدر متخصص في موازنة الأحمال والعمل كوسيط أمامي للتطبيقات والخدمات، خصوصاً تطبيقات الويب. يشتهر بثباته العالي، وأدائه الممتاز، وقدرته على التعامل مع أعداد كبيرة من الاتصالات المتزامنة.
من أبرز استخداماته:
- توزيع الطلبات بين عدة خوادم
Backend. - رفع التوافرية عبر استبعاد الخوادم المتعطلة تلقائياً.
- العمل كـ
Reverse Proxyأمام التطبيقات. - تنفيذ فحوصات صحية
Health Checksللخوادم. - التحكم في الجلسات، والرؤوس
Headers، وسياسات التوجيه.
كيف تعمل موازنة الأحمال؟
عند وصول طلب من المستخدم إلى عنوان الموقع، يصل أولاً إلى خادم HAProxy. بعد ذلك يقرر البرنامج أي خادم خلفي سيتولى معالجة هذا الطلب اعتماداً على خوارزمية توزيع محددة. يمكن أن تكون هذه الخوارزمية بسيطة مثل roundrobin أو أكثر دقة مثل leastconn.
إذا تعطل أحد الخوادم الخلفية، يكتشف HAProxy ذلك عبر الفحص الصحي، ثم يتوقف عن إرسال الطلبات إليه حتى يعود للعمل. هذه الآلية تجعل البنية أكثر مرونة واستقراراً في بيئات الإنتاج.
أشهر خوارزميات التوزيع
roundrobin: يوزع الطلبات بالتناوب على الخوادم.leastconn: يرسل الطلب إلى الخادم الأقل في عدد الاتصالات الحالية.source: يربط العميل بنفس الخادم اعتماداً على عنوانIP.
تثبيت HAProxy على لينكس
قبل البدء، تأكد من تحديث النظام ومعرفة أساسيات إدارة الحزم من خلال إدارة الحزم البرمجية وتحديث النظام (APT, YUM/DNF, Pacman). كما ستحتاج أحياناً إلى تحرير ملفات الإعداد عبر أدوات مثل nano أو vim كما في أدوات عرض ومعالجة النصوص (cat, nano, vim, less, tail).
على توزيعات Debian وUbuntu يمكن التثبيت بالأمر التالي:
sudo apt update
sudo apt install haproxy -y
أما على توزيعات RHEL أو Rocky Linux أو AlmaLinux:
sudo dnf install haproxy -y
ملف الإعداد الأساسي
غالباً يوجد ملف الإعداد الرئيسي في المسار /etc/haproxy/haproxy.cfg. وهذا يرتبط بمفاهيم هيكلية ملفات لينكس (Filesystem Hierarchy Standard – FHS) لأن فهم أماكن ملفات الخدمة يسهل إدارتها وصيانتها.
فيما يلي مثال بسيط لإعداد موازنة أحمال لخادمين ويب:
global
log /dev/log local0
log /dev/log local1 notice
daemon
defaults
mode http
log global
option httplog
timeout connect 5s
timeout client 30s
timeout server 30s
frontend http_front
bind *:80
default_backend web_servers
backend web_servers
balance roundrobin
option httpchk GET /
server web1 192.168.1.10:80 check
server web2 192.168.1.11:80 check
شرح الإعداد السابق
- قسم
globalيحتوي الإعدادات العامة مثل التسجيل والتشغيل كخدمة. - قسم
defaultsيحدد القيم الافتراضية للمهلات والسجلات. - قسم
frontendيستقبل الطلبات من العملاء على المنفذ80. - قسم
backendيضم الخوادم الفعلية التي ستخدم الطلبات. - الكلمة
checkتفعّل الفحص الصحي لكل خادم.
التحقق من الإعداد وتشغيل الخدمة
بعد تعديل الملف، من الضروري اختبار الصياغة قبل إعادة التشغيل حتى لا تتسبب أخطاء بسيطة في توقف الخدمة. يمكنك التحقق بالأمر التالي:
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
إذا كانت النتيجة سليمة، فعّل الخدمة وأعد تشغيلها باستخدام systemctl، ويمكنك الرجوع إلى إدارة الخدمات باستخدام (systemd) و (systemctl) لفهم التعامل مع الخدمات بشكل أوسع:
sudo systemctl enable haproxy
sudo systemctl restart haproxy
sudo systemctl status haproxy
احرص على فتح المنفذ المناسب في الجدار الناري قبل اختبار الخدمة من خارج الخادم، وإلا قد يبدو لك أن الإعداد معطل بينما المشكلة الحقيقية في قواعد الوصول.
الجدار الناري والسجلات واستكشاف الأخطاء
في البيئات الحقيقية، لا يكفي أن تعمل الخدمة داخلياً فقط، بل يجب ضبط الجدار الناري والسجلات بشكل صحيح. لهذا يفيد الرجوع إلى جدار الحماية (Firewall) وتأمين النظام (UFW, Firewalld, Iptables)، وكذلك مراقبة السجلات (Logs) وتحليل الأخطاء (journalctl, /var/log).
مثال على فتح خدمة الويب باستخدام UFW:
sudo ufw allow 80/tcp
sudo ufw reload
ولعرض آخر سجلات الخدمة:
sudo journalctl -u haproxy -n 50 --no-pager
أفضل الممارسات عند استخدام HAProxy
- استخدم أكثر من خادم خلفي حقيقي لتجنب نقطة الفشل الواحدة
Single Point of Failure. - فعّل الفحوصات الصحية دائماً ولا تعتمد على التوزيع دون مراقبة.
- اختر خوارزمية التوزيع بحسب طبيعة التطبيق وعدد الجلسات.
- راقب استهلاك الموارد والأداء بالاستفادة من فهم العمليات (Processes) ومراقبة استهلاك الموارد (top, htop, ps, kill).
- اختبر الإعدادات الجديدة في بيئة تجريبية قبل تطبيقها على الإنتاج.
إذا كان تطبيقك يعتمد على الجلسات المحلية داخل الخادم نفسه، فقد تحتاج إلى إعداد
session persistenceأو نقل الجلسات إلى مخزن مركزي مثلRedisلتفادي سلوك غير متوقع عند تنقل المستخدم بين الخوادم.
خاتمة
يوفر HAProxy حلاً عملياً واحترافياً لموازنة الأحمال ورفع جاهزية الخدمات، خصوصاً في المواقع والتطبيقات التي تشهد نمواً في عدد الزيارات أو تحتاج إلى استقرار عالٍ. ومن خلال إعداد بسيط ومدروس، يمكن توزيع الطلبات بكفاءة، اكتشاف الأعطال بسرعة، وتحسين أداء البنية ككل.
كلما كان فهمك أقوى للشبكات، السجلات، إدارة الخدمات، وتأمين الخوادم، أصبحت قدرتك أكبر على تشغيل HAProxy بصورة مستقرة وآمنة. لذلك فإن دمج هذه الأداة ضمن بنية لينكس مدروسة يمثل خطوة مهمة نحو بناء منصات أكثر تحملاً واحترافية.
4 comments