SLB عبارة عن موازن تحميل بدون جلسة لحركة مرور UDP، ويحل المشكلات المتأصلة في استخدام موازن التحميل التقليدية (الغنية بالميزات) لمثل هذه الحركة.
بالنسبة لبروتوكولات UDP البسيطة وعديمة الحالة، لا توجد ميزة في محاولة الحفاظ على "التقارب" (المعروف أيضًا باسم "الجلسات") بين العملاء والمثيلات الخلفية. تفترض موازنات التحميل التقليدية أن التقارب مفيد، ولذلك سيحاولون توجيه الحزم من العميل إلى خادم خلفي متسق. على النقيض من ذلك، يقوم SLB بتوزيع الحزم بالتساوي (عشوائيًا) واحدًا تلو الآخر على جميع النهايات الخلفية المتاحة. يؤدي هذا إلى تحميل موحد للواجهات الخلفية، وتحسين المتانة عند فشل مثيل واحد للواجهة الخلفية (ستكون هناك زيادة في فقدان الحزمة لجميع العملاء بدلاً من فقدان إجمالي لحركة المرور لبعض العملاء).
افتراضيًا، سوف يستمع SLB على المنفذين 1812
و 1813
لحزم UDP الواردة وينقلها إلى أهداف خلفية عشوائية يعرفها. يمكن استخدام المنافذ التي يستمع إليها باستخدام خيار --server-port-range
، الذي يقبل منفذًا واحدًا (على سبيل المثال 541
) أو مجموعة من المنافذ (على سبيل المثال 4000-5000
).
لتوعية SLB بالواجهات الخلفية، يتطلب الأمر إرسال حزم "المراقبة" (المعروفة أيضًا باسم "البقاء على قيد الحياة") إلى منفذ الإدارة (المزيد حول هذا أدناه). افتراضيًا، يكون منفذ الإدارة هو 1111
، ولكن يمكن تهيئته باستخدام خيار --admin-port
. في حالة وجود بطاقات شبكة متعددة في نظامك، يمكنك تحديد عنوان IP باستخدام خيار --admin-ip
. إذا كان عنوان IP المحدد بـ --admin-ip
موجودًا في نطاق CIDR متعدد البث ( 244.0.0.0/4
) فسوف ينضم SLB تلقائيًا إلى مجموعة البث المتعدد هذه (المزيد حول هذا أدناه).
يتم وصف الخيارات الأخرى في تعليمات الأمر:
SimplestLoadBalancer:
Sessionless UDP Load Balancer sends packets to backends without session affinity.
Usage:
SimplestLoadBalancer [options]
Options:
--server-port-range <server-port-range> Set the ports to listen to and forward to backend targets
(default "1812-1813") [default: 1812-1813]
--admin-ip <admin-ip> Set the IP to listen on for watchdog events [default is first private IP]
--admin-port <admin-port> Set the port that targets will send watchdog events [default: 1111]
--client-timeout <client-timeout> Seconds to allow before cleaning-up idle clients [default: 30]
--target-timeout <target-timeout> Seconds to allow before removing target missing watchdog events [default: 30]
--default-target-weight <default-target-weight> Weight to apply to targets when not specified [default: 100]
--unwise Allows public IP addresses for targets [default: False]
--stats-period-ms <stats-period-ms> Sets the number of milliseconds between statistics messages printed to the
console (disable: 0, max: 65535) [default: 1000]
--default-group-id <default-group-id> Sets the group ID to assign to backends that when a registration packet doesn't
include one, and when port isn't assigned a group [default: 0]
--version Show version information
-?, -h, --help Show help and usage information
لم يتم تكوين الواجهات الخلفية في سطر الأوامر. بدلاً من ذلك، يتم تسجيلها ديناميكيًا وإلغاء تسجيلها باستخدام حزم UDP الدورية المرسلة إلى منفذ الإدارة ( --admin-port
). قد يختلف محتوى هذه الحزم بناءً على كيفية استخدامك لـ SLB في بيئتك.
إذا كنت تقوم بتشغيل خادم SLB واحد، فيمكن تكوين الواجهات الخلفية لإرسال حزم إلى عنوان IP هذا وعلى منفذ الإدارة. هذا هو أبسط السيناريو. سترسل كل واجهة خلفية رسائل تحتوي على "بايتتين سحريتين" للإشارة إلى "تسجيل الواجهة الخلفية" للمحتوى:
0x11 0x11
سوف يفسر SLB مثل هذه الحزمة على أنها "تسجيل المرسل كواجهة خلفية". اختياريًا، يمكن أن تحتوي الرسائل على بايت واحد أو اثنين إضافيين (الوزن ومعرف المجموعة) والذي سيتم مناقشة الغرض منه بمزيد من التفاصيل أدناه.
0x11 0x11 [X] [X]
^ ^
| |
| one byte for group id
|
one byte for weight
في بعض البيئات، لن يتم إرسال حزم التسجيل من الواجهات الخلفية نفسها، ويدعم SLB حالات الاستخدام هذه. عندما يتم إرسال حزمة تسجيل من "طرف ثالث"، سيحتاج المحتوى إلى تضمين عنوان IP الخاص بالواجهة الخلفية التي يتم تسجيلها:
0x11 0x11 X X X X [X] [X]
^ ^ ^
| | |
| | one byte for group id
| |
| one byte for weight
|
four bytes for ip to add
مرة أخرى، قد يتم إلحاق الوزن ومعرف المجموعة بشكل اختياري.
عندما تكون هناك حاجة إلى نشر HA أكثر قوة مع SLBs متعددة، يمكن تبسيط الاتصال بين الواجهات الخلفية وSLB باستخدام عنوان IP لمجموعة البث المتعدد. يعد هذا مفيدًا نظرًا لأن كل SLB يجب أن يكون على دراية بكل واجهة خلفية. في مثل هذه الحالة، يجب على خوادم SLB استخدام خيار --admin-ip
لتحديد عنوان البث المتعدد الذي سيؤدي إلى انضمام SLBs إلى مجموعة البث المتعدد وبالتالي يتلقى الجميع أي رسالة مرسلة إلى عنوان IP هذا. يمكن تكوين الواجهات الخلفية باستخدام عنوان IP الفردي هذا، مما يقلل من عبء العمل الخاص بها ويبسط تكوينها (خاصة عندما يتم تدوير SLBs داخل الخدمة وخارجها بسبب القياس التلقائي و/أو استخدام المثيلات الموضعية).
لاحظ أن استخدام عنوان IP للبث المتعدد يتطلب إما محولاً يدعم البث المتعدد، أو (على الأرجح) تشغيله في AWS VPC الذي تم تكوينه باستخدام مجال البث المتعدد.
تعد تنسيقات حزم المسؤول بسيطة جدًا اعتبارًا من الإصدار 2.0. في أبسط حالة استخدام لـ SLB واحد، قد لا تتكون حزمة التسجيل من الواجهة الخلفية من أكثر من وحدتي بايت سحريتين ( 0x11
0x11
). اختياريًا، يمكن أن تأتي الحزم من مصدر مختلف (على سبيل المثال، خادم إدارة) وتتضمن أربع بايتات لتحديد عنوان IPv4 للواجهة الخلفية. في كلتا الحالتين، قد يتم إلحاق وحدتي بايت اختياريتين إضافيتين "لوزن" حركة المرور بالنسبة إلى الواجهات الخلفية الأخرى، ولمجموعة "المجموعة" المخصصة للواجهة الخلفية (المزيد حول المجموعات أدناه). في فن ASCII:
0x11 0x11 [X X X X] [X] [X]
^ ^ ^
| | |
| | one byte for group id
| |
| one byte for weight
|
four bytes for ip to add
لإزالة هدف على الفور، أرسل حزمة تحتوي على 0x86
باعتبارها البايت الأول بدلاً من 0x11
(إذا تم إرسالها من خادم إدارة، قم بإلحاق عنوان IP الخاص بالواجهة الخلفية المراد إزالتها):
0x86 0x11 [X X X X]
^
|
four bytes for ip to remove
تُستخدم الأوزان للتحكم في المقدار النسبي لحركة المرور التي يتم تسليمها إلى كل واجهة خلفية. إذا لم يتم تحديد أي وزن، فسيتم تطبيق القيمة الافتراضية 100 (القابلة للتكوين باستخدام --default-target-weight
) على الواجهة الخلفية، وسيتلقى كل منها نفس حجم الحزم. ومع ذلك، من المتوقع (والمستحسن) أن تقوم الواجهة الخلفية بضبط قيمة الوزن في حزم الإدارة الخاصة بها بناءً على قدرتها على التعامل مع حركة المرور (ربما تنخفض عندما تكون وحدة المعالجة المركزية عالية، ويتم تطبيق التحديثات، وما إلى ذلك). على سبيل المثال:
100
و 50
و 50
على التوالي، فستتلقى الأولى 50% من حركة المرور بينما سيحصل كل من الثانية والثالثة على 25%.31
و 31
على التوالي، فسيتلقى كل منهما 50% من حركة المرور.عند استخدام المجموعات، يتم تقييم الأوزان النسبية مقابل الواجهات الخلفية الأخرى في نفس المجموعة (وليس عبر جميع المجموعات).
من المهم إرسال حزم الإدارة بشكل موثوق وبإيقاع كافٍ. في كل مرة يتم فيها استلام حزمة بواسطة SLB، يتم تحديث وقت "آخر ظهور" للواجهة الخلفية. إذا مرت 30 ثانية (قابلة للتكوين باستخدام
--target-timeout
) دون رؤية الواجهة الخلفية، فستتم إزالتها ولن يتم إرسال أي حركة مرور أخرى إليها.
افتراضيًا، سيتم استخدام جميع الواجهات الخلفية لخدمة جميع المنافذ التي يخدمها موازن التحميل.
ومع ذلك، من الممكن تعيين منافذ فردية لمجموعات فرعية من الواجهات الخلفية باستخدام رسائل تعيين منفذ SLB وتوفير معرفات المجموعة في رسائل التسجيل. ضع في اعتبارك، على سبيل المثال، أنك ترغب في الحصول على حركة مرور موازنة تحميل SLB للمنافذ 1812-1813 ولكن قم بتعيين حركة المرور التي تصل إلى كل منفذ لمجموعة مختلفة من الخوادم. للقيام بذلك:
x66 x11
) مع رقم المنفذ (بايتتين) ومعرف المجموعة (بايت واحد). لا يلزم تكرار هذه الرسائل، ويمكن إرسالها عند الرغبة في إجراء تغيير في تعيينات مجموعة المنافذ (ومع ذلك، ليس هناك أي ضرر في تكرارها، وهو ما قد يكون مناسبًا لضمان تعيين المنافذ بشكل صحيح للمجموعات بعد إعادة تشغيل الخدمة). 0x66 0x11 X X X
^ ^
| |
| one byte for group ID
|
two bytes for port number, litten endian
باستخدام Linux bash
، من السهل إرسال حزم الإدارة. يمكن القيام بذلك باستخدام الأمر netcat
( nc
) أو نظام الملفات /dev/udp
. على سبيل المثال، إذا كان موازن التحميل الخاص بك يستمع على منفذ الإدارة الافتراضي 1111
وتريد إضافة هدف باستخدام IP 192.168.1.22
:
$ echo -e $( echo " x11x11 $( echo " 192.168.1.22 " | tr " . " " n " | xargs printf ' \x%02X ' ) " ) > /dev/udp/127.0.0.1/1111
نظرًا لأنه قد يكون أمرًا شاقًا إرسال هذه الحزم يدويًا للحفاظ على تسجيل مجموعة من الأهداف، فيمكنك إنشاء برنامج نصي صغير، على سبيل المثال lb.sh
:
#! /bin/bash
echo -ne $( echo " x11x11 $( echo " 192.168.1.22 " | tr " . " " n " | xargs printf ' \x%02X ' ) " ) > /dev/udp/127.1.1.1/1111
echo -ne $( echo " x11x11 $( echo " 192.168.1.23 " | tr " . " " n " | xargs printf ' \x%02X ' ) " ) > /dev/udp/127.1.1.1/1111
echo -ne $( echo " x11x11 $( echo " 192.168.1.24 " | tr " . " " n " | xargs printf ' \x%02X ' ) " ) > /dev/udp/127.1.1.1/1111
echo -ne $( echo " x11x11 $( echo " 192.168.1.25 " | tr " . " " n " | xargs printf ' \x%02X ' ) " ) > /dev/udp/127.1.1.1/1111
echo -ne $( echo " x11x11 $( echo " 192.168.1.26 " | tr " . " " n " | xargs printf ' \x%02X ' ) " ) > /dev/udp/127.1.1.1/1111
echo -ne $( echo " x11x11 $( echo " 192.168.1.27 " | tr " . " " n " | xargs printf ' \x%02X ' ) " ) > /dev/udp/127.1.1.1/1111
ثم استخدم أمر watch
لاستدعاء هذا البرنامج النصي كل بضع ثوانٍ:
$ watch -n10 ./lb.sh
الثنائيات المعدة مسبقًا لنظامي التشغيل Linux وWindows x64 وLinux ARM متاحة كإصدارات GitHub. هذا مشروع .Net 8.0 بسيط جدًا، لذا قم بتشغيله لإنشائه (بافتراض تثبيت dotnet-sdk-8.0):
dotnet build
قد ترغب على الأرجح في إنشاء ملف ثنائي أصلي قابل للتنفيذ، وهو أمر مناسب ويقدم بعض فوائد الأداء.
لنظام التشغيل Linux:
dotnet publish -o ./ -c Release -r linux-x64 /p:PublishSingleFile=true /p:PublishTrimmed=true --self-contained
لنظام التشغيل Windows:
dotnet publish -o ./ -c Release -r win10-x64 /p:PublishSingleFile=true /p:PublishTrimmed=true --self-contained
وبالمثل، من السهل التشغيل باستخدام dotnet run
في دليل المشروع:
$ dotnet run
أو، إذا قمت بإنشاء ملف قابل للتنفيذ أصلي:
$ ./SimplestLoadBalancer
لا تتردد في إنشاء مشكلات هنا على GitHub لطرح الأسئلة وتقارير الأخطاء. لم يتم توفير نموذج أو متطلبات ولكن يرجى محاولة أن تكون وصفيًا قدر الإمكان - فهذا سيساعد على ضمان قدرتنا على الاستجابة بطريقة معقولة. أنظر أيضا، المساهمة.
يتمتع!