التوسّع وموازنة الأحمال

موازنات التحميل: ما هي ولماذا نستخدمها

18 دقيقة الدرس 3 من 10

موازنات التحميل: ما هي ولماذا نستخدمها

تخيّل أن تطبيقك تعرّض فجأة لـ50,000 مستخدم متزامن بعد انتشار منشور على وسائل التواصل الاجتماعي. إذا اصطدم كل هذا الحمل بخادم واحد، فسوف يستنزف موارد المعالج والذاكرة وحيّز الشبكة في غضون ثوانٍ — يرى المستخدمون رسائل انتهاء المهلة، يتعطّل الخادم، وتتبخّر الإيرادات. موازن التحميل هو شرطي المرور الذي يقف أمام مجموعة خوادمك، ويوزّع الطلبات الواردة بذكاء، ويمنع أي جهاز منفرد من أن يصبح عنق الزجاجة.

ما هو موازن التحميل؟

موازن التحميل هو مكوّن شبكي — عتاديًا أو برمجيًا أو مُدارًا سحابيًا — يقبل الاتصالات الواردة ويحيلها إلى أحد الخوادم الخلفية الكثيرة (المعروفة بـمجمع الخوادم أو مجموعة المنبع). من الخارج، يرى العملاء نقطة نهاية واحدة (عنوان IP أو اسم مضيف واحد). خلف تلك النقطة، تعمل مجموعة من الخوادم بالتوازي لأداء العمل الفعلي.

بالإضافة إلى التوزيع البسيط للطلبات، يوفر موازن التحميل الحديث أيضًا:

  • فحص الصحة — يُزيل الخوادم غير السليمة تلقائيًا من دائرة الخدمة.
  • إنهاء SSL/TLS — يفكّ تشفير حركة HTTPS مرة واحدة، لتعمل الخوادم الخلفية على HTTP العادي، مما يوفّر دورات المعالج على كل خادم.
  • إعادة استخدام الاتصالات (تجميع keep-alive) — يحتفظ باتصالات دائمة مع الخلفيات، مما يقلل من الحمل الإضافي لمصافحة TCP.
  • قابلية الرصد — يسجّل زمن الاستجابة ومعدلات الأخطاء والبايتات المُرسَلة لكل مصدر خلفي، مانحًا إياك نقطة مراقبة مركزية.
فكرة أساسية: يجب ألّا يتحوّل موازن التحميل نفسه إلى نقطة إخفاق وحيدة. في بيئات الإنتاج تعمل دائمًا موازنَتَا تحميل في وضع نشط-سلبي أو نشط-نشط، مُرقَّيتَان عبر عنوان IP افتراضي مشترك (VIP) باستخدام بروتوكولات مثل VRRP، أو عبر موازن التحميل المُدار من مزوّد السحابة الذي يوفّر تكرارًا داخليًا.
Load balancer distributing traffic across a server pool Client A Browser Client B Mobile App Client C API Consumer Load Balancer Single public endpoint e.g. api.example.com App Server 1 10.0.0.11 App Server 2 10.0.0.12 App Server 3 10.0.0.13 All traffic enters via one endpoint — LB fans it out across the pool
يعرض موازن التحميل نقطة نهاية عامة واحدة بينما يوزّع الطلبات على مجمع من الخوادم الخلفية.

موازنة التحميل على الطبقة 4 مقابل الطبقة 7

تعمل موازنات التحميل على طبقات مختلفة من نموذج OSI. إن فهم الطبقة التي يعمل عليها موازنك يحدد المعلومات التي يمكنه التصرف بناءً عليها والميزات التي يمكنه تقديمها.

الطبقة 4 — طبقة النقل

يتخذ موازن التحميل L4 قرارات التوجيه بناءً فقط على رؤوس TCP/UDP: عنوان IP المصدر، عنوان IP الوجهة، والمنفذ. لا يفحص الحمولة أبدًا — بل يُحيل تدفقات البايتات ببساطة. نظرًا لأنه لا يُحلّل HTTP، فهو سريع للغاية ويضيف زمن استجابة ضئيلًا جدًا (كثيرًا ما يكون أقل من 100 ميكروثانية). هذا يجعل L4 مثاليًا لـ:

  • البروتوكولات غير HTTP: SMTP وDNS وخوادم الألعاب TCP الخام وبروكسيات قواعد البيانات.
  • سيناريوهات الإنتاجية العالية جدًا حيث تهمّ حتى الميكروثواني.
  • ربط IP-hash البسيط (يُوجَّه عنوان IP للعميل دائمًا إلى نفس الخادم الخلفي).

المقايضة هي أن موازنات L4 عمياء أمام محتوى التطبيق. لا يمكنك توجيه /api/* إلى مجموعة خوادم ومجموعة أخرى لـ/static/*. كل الطلبات تبدو متطابقة على طبقة النقل.

الطبقة 7 — طبقة التطبيق

يُنهي موازن التحميل L7 اتصال TCP، ويُحلّل طلب HTTP (أو gRPC أو WebSocket وغيره) بالكامل، ثم يفتح اتصالًا جديدًا مع خادم خلفي مختار. لأنه يقرأ الرؤوس والمسارات والكوكيز وحتى أجسام الطلبات، يمكنه اتخاذ قرارات توجيه واعية بالمحتوى:

  • التوجيه المستند إلى المسار: /checkout ← خوشة خدمة الدفع؛ /images/* ← خوادم الوسائط.
  • التوجيه المستند إلى المضيف: api.example.com ← مجمع API؛ www.example.com ← مجمع الويب.
  • التوجيه المستند إلى الرأس: X-Beta-User: true ← خوادم النشر التجريبي.
  • إنهاء SSL: فكّ التشفير مرة واحدة على الموازن، واستخدام HTTP العادي داخليًا.
  • الجلسات اللاصقة عبر الكوكيز: حقن كوكيز توجيه حتى تصل جلسة المستخدم دائمًا إلى نفس الخادم.
  • تحديد المعدل وجدار حماية تطبيقات الويب (WAF): فحص الطلبات الخبيثة ورفضها قبل أن تصل إلى أي خادم.

الثمن هو زمن استجابة أعلى قليلًا (عادةً 0.5–2 ملّي ثانية إضافية لتحليل HTTP) ومعالج أكثر من L4. عمليًا، لمعظم خدمات الويب هذا العبء ضئيل مقارنةً بوقت معالجة التطبيق.

قاعدة عامة: استخدم L7 افتراضيًا لواجهات برمجة التطبيقات ومعماريات الخدمات الصغيرة — قوة التوجيه وإنهاء TLS يستحقان التكلفة فورًا. انزل إلى L4 فقط لبروتوكولات TCP الخام أو حين تحتاج إلى عبء موازنة أقل من ميلي ثانية.
L4 vs L7 load balancer comparison: information available and routing capabilities L4 — Transport Load Balancer Sees only: • Source IP / Destination IP • TCP/UDP port number • TCP flags (SYN, ACK, FIN…) Routing decisions: • Round-robin by IP • IP-hash stickiness • Least connections Characteristics: ✓ Extremely fast (<100 µs overhead) ✓ Works with any TCP/UDP protocol ✗ Cannot inspect HTTP content ✗ No path/host/header routing L7 — Application Load Balancer Sees everything: • HTTP method, URL path, query string • Request headers, Host, Cookie • TLS SNI, gRPC service name Routing decisions: • Path: /api/* → API pool • Host: cdn.example.com → media pool • Header: X-Canary → beta servers Characteristics: ✓ Content-aware routing ✓ TLS termination, WAF, rate-limit ✗ ~0.5–2 ms extra latency vs L4 ✗ More CPU to parse HTTP
مقارنة جنبًا إلى جنب: ما يمكن لكلٍّ من L4 وL7 رؤيته والتصرف بناءً عليه.

المعمارية الواقعية: الموازنة متعددة الطبقات

تستخدم الأنظمة الكبيرة في الغالب كلتا الطبقتين معًا. يجلس موازن تحميل L4 عالي الأداء (مثل AWS Network Load Balancer أو Maglev من Google) على حافة الإنترنت، يستوعب اتصالات TCP الخام ويوزّعها على مجموعة من بروكسيات L7 (مثل NGINX أو HAProxy أو AWS Application Load Balancer). تُجري طبقة L7 بعد ذلك توجيهًا بالمحتوى إلى عشرات مجموعات الخدمات الصغيرة خلفها.

يجمع هذا التصميم بين سرعة L4 الخام وذكاء L7، ويعني أن طبقة L7 لن تكون أبدًا النقطة الوحيدة لاستقبال حركة الإنترنت.

أمثلة عملية حسب التقنية المستخدمة

  • AWS: Network Load Balancer (L4) ← Application Load Balancer (L7) ← مهام ECS/EC2
  • الاستضافة الذاتية: NGINX (L7) أو HAProxy (L4 + L7) أمام خوادم التطبيق — كلاهما مجاني ومُختبر في الميدان ويعالج ملايين الطلبات في الثانية على أجهزة متواضعة
  • Kubernetes: وحدة تحكم Ingress (مثل NGINX Ingress أو Traefik) هي موازن تحميل L7؛ كائنات Service من النوع LoadBalancer تُوفّر نقطة دخول L4 من مزوّد السحابة
  • Cloudflare/Fastly: موازنة L7 عالمية على الحافة مع حماية DDoS مدمجة وتخزين مؤقت — غالبًا الطبقة الأولى قبل أي بنية تحتية خاصة بك
فخ شائع — الجلسات اللاصقة على L7: عندما تحقن كوكيز توجيه لضمان الالتصاق بالجلسة، فإنك تتراجع جزئيًا عن توزيع الحمل. إذا تعامل خادم "لاصق" مع مستخدمين ثقيلين، فقد لا يزال يُصبح مُثقلًا. يُفضَّل تصميم تطبيق عديم الحالة (تخزين الجلسات في Redis أو قاعدة البيانات) حتى يتمكن أي خادم خلفي من خدمة أي طلب، مما يمنحك توزيعًا موحدًا حقيقيًا.

المقاييس الرئيسية للمراقبة

بمجرد تفعيل موازن التحميل، راقب هذه المقاييس لكل خادم خلفي:

  • الطلبات في الثانية (RPS) — هل التوزيع موحد فعلًا؟
  • الاتصالات النشطة — تكشف الخوادم البطيئة التي تتراكم فيها الأعمال.
  • زمن الاستجابة (p50 / p95 / p99) — ارتفاعات زمن p99 تكشف العُقد غير السليمة قبل أن تُشغَّل فحوصات الصحة.
  • معدل الأخطاء (5xx) — يبدأ الإزالة التلقائية عبر فحص الصحة؛ راقب أيضًا الإيجابيات الكاذبة.
  • عمق قائمة انتظار الخادم الخلفي — إذا أخّر الموازن الطلبات انتظارًا لخانة اتصال حرة، فأنت بحاجة إلى طاقة استيعابية أكبر.
توضيح مصطلحات: كثيرًا ما يُستخدم مصطلحا "البروكسي العكسي" و"موازن التحميل" بشكل متبادل. تقنيًا، البروكسي العكسي هو أي مكوّن يُعيد توجيه الطلبات نيابةً عن جانب الخادم (ويمكنه التخزين المؤقت والضغط وإنهاء TLS). أما موازن التحميل فهو بروكسي عكسي مهمته الأساسية توزيع الطلبات. NGINX المُهيَّأ في وضع upstream هو الاثنان في آنٍ واحد.