موازنة الحمل بـHAProxy: توزيع الطلبات وفحص الصحة عملياً
HAProxy موازن حمل يجلس أمام عدة سيرفرات تطبيق، يوزّع الطلبات بينها بخوارزمية تختارها، ويفحص صحتها باستمرار فيُخرج المعطوب تلقائياً. يمنحك سعة أعلى وتحمّلاً للأعطال دون توقف يراه الزائر.
الجواب المباشر: HAProxy برنامج موازنة حمل يجلس بوابةً أمام عدة سيرفرات تطبيق، يستقبل كل طلبات الزوار على عنوان واحد، ثم يوزّعها على السيرفرات الخلفية بخوارزمية تختارها، مع فحص صحة كل سيرفر باستمرار فيتوقّف فوراً عن إرسال الطلبات لأي سيرفر يتعطّل ويعيده حين يتعافى. الفائدتان الكبريان: سعة أعلى لأن الحمل يتوزّع على عدة أجهزة بدل جهاز واحد يختنق، وتحمّل للأعطال لأن سقوط سيرفر واحد لا يوقف الخدمة، فالموازن يوجّه الزوار للسيرفرات السليمة دون أن يلاحظ الزائر شيئاً. تضع HAProxy على خادم أمامي، وخلفه سيرفرا تطبيق أو أكثر، فتحوّل نقطة فشل واحدة إلى بنية صامدة.
الإعداد العملي أبسط مما يبدو. تعرّف مجموعة سيرفرات خلفية (backend)، تختار خوارزمية التوزيع، تضبط فحص الصحة، وتفتح واجهة استماع أمامية (frontend) تستقبل الزوار. من اللحظة الأولى تحصل على توزيع حمل حقيقي ومراقبة صحة تلقائية. الخوارزمية الأشهر round-robin توزّع بالتناوب، وleastconn ترسل للسيرفر الأقل انشغالاً، وsource تثبّت كل زائر على سيرفر واحد حسب عنوانه. كل خيار يناسب حالة، والقرار بينها يقوده نوع تطبيقك وكيف يدير الجلسات.
كيف يوزّع HAProxy الطلبات فعلاً
عند وصول طلب، يقرّر HAProxy وجهته حسب الخوارزمية المضبوطة. round-robin أبسطها: يرسل الطلب الأول للسيرفر الأول، الثاني للثاني، ثم يعود بالدور، فيوزّع بالتساوي حين تتماثل قدرات السيرفرات وتتقارب مدد الطلبات. leastconn أذكى للأحمال المتفاوتة: يرسل كل طلب جديد للسيرفر صاحب أقل عدد اتصالات نشطة حالياً، فيمنع تكدّس الطلبات الطويلة على سيرفر بينما آخر فارغ. source يحسب قيمة من عنوان الزائر ويثبّته على سيرفر بعينه، وهذا يفيد التطبيقات التي تحفظ الجلسة على السيرفر نفسه.
الاختيار عملي لا نظري. إن كانت سيرفراتك متماثلة وطلباتك متقاربة الطول، round-robin يكفي ويبسّط. إن تفاوتت مدد الطلبات كثيراً، leastconn يوازن أفضل. إن احتاج تطبيقك بقاء الزائر على سيرفره، source أو الجلسات اللاصقة هي الحل، وسنأتي لها.
فحص الصحة وإخراج المعطوب تلقائياً
أهم ما يميّز موازن الحمل ليس التوزيع بل فحص الصحة. يرسل HAProxy فحصاً دورياً لكل سيرفر خلفي، طلباً بسيطاً على منفذ أو مسار محدّد، وينتظر رداً سليماً. حين يفشل السيرفر في الرد عدداً من المرات المتتالية، يعتبره HAProxy معطوباً ويوقف إرسال الطلبات إليه فوراً، فيوجّه كل الحمل للسيرفرات السليمة. حين يعود السيرفر للرد الصحيح، يعيده HAProxy للخدمة تدريجياً. هذا كله آلي بلا تدخّل، فالزائر لا يرى صفحة خطأ لأن طلبه لا يصل أصلاً للسيرفر المعطوب.
هذه الآلية تحوّل الصيانة من كابوس لعملية عادية. تحتاج تحديث سيرفر تطبيق؟ أخرجه من التوزيع، حدّثه، أعده، وكرّر مع الثاني، فتبقى الخدمة تعمل طوال الوقت على السيرفر الآخر. الفحص الصحيح يفرّق بين توقّف يراه العميل وصيانة لا يشعر بها أحد.
| الخوارزمية | كيف توزّع | الأنسب لها |
|---|---|---|
| round-robin | بالتناوب على السيرفرات | سيرفرات متماثلة وطلبات متقاربة الطول |
| leastconn | للسيرفر الأقل اتصالات نشطة | طلبات متفاوتة المدة |
| source | تثبيت الزائر على سيرفر حسب عنوانه | تطبيقات تحفظ الجلسة محلياً |
الجلسات اللاصقة ومتى تحتاجها
بعض التطبيقات تحفظ جلسة المستخدم في ذاكرة السيرفر الذي خدمه أول مرة، فإذا وجّه الموازن طلبه التالي لسيرفر آخر، فقد الجلسة وطُلب منه تسجيل الدخول مجدّداً. الحل الجلسات اللاصقة: يثبّت HAProxy كل زائر على السيرفر الذي بدأ معه طوال جلسته، إما بخوارزمية source أو بكوكي يزرعه الموازن. هذا يحلّ المشكلة لكنه يقلّل مرونة التوزيع، لأن زائراً كثيف الطلبات يبقى على سيرفر واحد.
الحل الأنظف على المدى البعيد هو جعل تطبيقك عديم الحالة (stateless)، بحفظ الجلسات في مخزن مشترك مثل Redis أو قاعدة بيانات يصله كل السيرفرات، فيصبح أي طلب صالحاً على أي سيرفر ويتوزّع الحمل بحرية كاملة. الجلسات اللاصقة حلّ سريع، والمخزن المشترك حلّ صحيح. ابدأ باللاصقة إن لزم، وخطّط للمخزن المشترك حين تكبر.
بنية عملية على كلاود
البنية النموذجية للبداية: خادم أمامي يشغّل HAProxy، وخلفه سيرفرا تطبيق متماثلان، وقاعدة بيانات مشتركة يصلها كلاهما. الموازن نفسه خفيف الموارد لأنه يمرّر الطلبات لا يعالجها، فباقة أساس أو نمو تكفيه غالباً، بينما سيرفرا التطبيق يحتاجان موارد على قدر حملك. توزّع الحمل على جهازين، فترفع السعة وتكسب صموداً أمام أعطال جهاز واحد.
تفعيل كل خادم تلقائي خلال ثوانٍ بعد الدفع، فتبني هذه البنية في دقائق، وترقّي موارد أي سيرفر فوراً حين يكبر الحمل بلا إعادة بناء. جرّب البدء بموازن وسيرفري تطبيق على خادم سحابي داخل الرياض بزمن استجابة نحو 8ms لزوارك. راجع الأسعار والباقات لمطابقة موارد كل طبقة مع حملك الفعلي، فالموازن خفيف والتطبيق حسب حاجتك.
جمال هذه البنية أنها تنمو أفقياً بسهولة. حين يكبر حملك ولا يكفي سيرفرا التطبيق، تضيف سيرفراً ثالثاً ورابعاً وتسجّلها في مجموعة الخلفية، فيبدأ الموازن بتوزيع الطلبات عليها فوراً بلا تغيير يراه الزائر. هذا النمو الأفقي، إضافة أجهزة متوسطة بدل تضخيم جهاز واحد، غالباً أوفر وأصمد: عشرة سيرفرات متوسطة تتحمّل سقوط أحدها بخسارة عُشر السعة فقط، بينما جهاز عملاق واحد سقوطه توقّف كامل. القاعدة العملية: كبّر بإضافة أجهزة للمجموعة قبل أن تفكّر في جهاز واحد أضخم، فالتوزيع نفسه هو مصدر الصمود. أبقِ سيرفرات التطبيق متماثلة قدر الإمكان ليسهل التوزيع وتقدير السعة.
إنهاء TLS ومراقبة ما يجري
الموازن موقع مثالي لإدارة التشفير. بدل أن يحمل كل سيرفر تطبيق شهادة TLS ويصرف موارده على فكّ التشفير، يتولّى HAProxy إنهاء اتصال TLS عند البوابة، فيستقبل الزائر مشفّراً ويمرّر الطلب للسيرفرات الخلفية داخل شبكتك الخاصة. هذا يبسّط إدارة الشهادات في مكان واحد، ويخفّف الحمل عن سيرفرات التطبيق. يمكنك أيضاً إعادة تشفير المرور بين الموازن والخلفية إن تطلّب أمنك ذلك، فالخيار بيدك حسب حساسية بياناتك.
الجانب الآخر المهم هو المراقبة. HAProxy يوفّر صفحة إحصاءات حيّة تُظهر حالة كل سيرفر خلفي: أهو سليم أم معطوب، كم اتصالاً نشطاً عليه، وكم طلباً خدمه. هذه النافذة تكشف الاختناق قبل أن يصبح عطلاً، فترى مثلاً سيرفراً يقترب من حدّه فتضيف ثالثاً قبل أن يسقط. اربط سجلّات HAProxy بنظام مراقبة يجمع المقاييس عبر الوقت، فتحصل على صورة تاريخية لا لقطة لحظية، وتضبط تنبيهاً يصلك حين يتعطّل سيرفر خلفي أو يرتفع الحمل فوق عتبة. الموازن بلا مراقبة يعمل، لكن المراقبة تحوّله من صندوق أسود إلى بنية تفهمها وتتحكّم فيها.
نقطة الفشل الواحدة في الموازن نفسه
سؤال منطقي: إن كان الموازن بوابة كل الحمل، أليس هو نفسه نقطة فشل واحدة؟ نعم، وهذا يُعالَج في البنى الأكثر نضجاً بموازنين اثنين بترتيب عالي التوفّر، بحيث يتولّى الثاني إن سقط الأول عبر عنوان افتراضي ينتقل بينهما. للبداية، موازن واحد يحسّن الوضع كثيراً مقارنة بسيرفر تطبيق وحيد، فهو أبسط وأخفّ وأقل عرضة للسقوط من سيرفر تطبيق يحمل منطقك كله. أضف الموازن الثاني حين يبرّر حجمك التعقيد الإضافي، لا قبله.
خطوات البدء
- جهّز خادماً أمامياً للموازن وسيرفري تطبيق متماثلين، فهي أبسط بنية موازنة مفيدة.
- عرّف مجموعة السيرفرات الخلفية في HAProxy، واختر الخوارزمية: round-robin للتماثل، leastconn للطلبات المتفاوتة.
- اضبط فحص الصحة على مسار حقيقي في تطبيقك، فهو ما يخرج المعطوب تلقائياً.
- عالج الجلسات: لاصقة كحلّ سريع، أو مخزن مشترك مثل Redis كحلّ صحيح للمدى البعيد.
- اختبر بإيقاف سيرفر خلفي عمداً وراقب أن الموازن نقل الحمل للآخر دون توقف يراه الزائر.
الخلاصة أن HAProxy يحوّل بنية بسيطة معرّضة للتوقف إلى بنية توزّع الحمل وتصمد أمام الأعطال، فيرفع سعتك ويجعل صيانتك بلا توقف يراه الزائر. ابدأ بموازن وسيرفري تطبيق، اضبط الفحص الصحي جيداً على مسار حقيقي، اختر الخوارزمية المناسبة لطبيعة طلباتك، خطّط لجلسات عديمة الحالة عبر مخزن مشترك، ووسّع أفقياً بإضافة سيرفرات ثم بموازن ثانٍ عالي التوفّر حين يكبر حجمك ويبرّر التعقيد الإضافي.


