
موازن تحميل من الطبقة 4 قابل للتوسع أفقيًا باستخدام Direct Server Return لنظام لينكس بتقنية XDP/eBPF
يتم حالياً تحديث ملف README هذا ليعكس التغييرات الأخيرة - قد لا تعكس بعض المعلومات قاعدة الشيفرة الحالية. هذا الإصدار من الشيفرة ليس جاهزاً بعد للاستخدام الإنتاجي - استخدم إصدار v0.2 للإنتاج
موازن تحميل من الطبقة الرابعة (L4LB) قابل للتوسع أفقياً مع إرجاع الخادم المباشر (DSR) لنظام Linux باستخدام XDP/eBPF.
إذا كنت تعتقد أن هذا قد يكون مفيداً أو لديك أي أسئلة/اقتراحات، فلا تتردد في الاتصال بي على [email protected] أو إنشاء مشكلة على GitHub.
الآن يدعم IPv6 والتوزيع في الطبقة الثالثة (المعروفة أيضاً باسم النفق)! تم تحديث مكتبة XVS لتشمل هذه الميزات، كما أنها تستغني عن الحاجة إلى تشغيل فحوصات الصحة من مساحة اسم شبكة، مما يبسط الشيفرة بشكل كبير. سينهي هذا شرط أن تشارك جميع الخوادم الخلفية شبكة VLAN مع موازن التحميل.
القيود الحالية في الشيفرة تعني أن تمكين النفق على
أساس كل خدمة غير مدعوم. استخدام الخيار -tunnel يسمح بتفعيل النفق في الطبقة الثالثة
عالمياً باستخدام مخطط واحد
(IP-in-IP، GRE، FOU أو GUE). مستقبلاً، سيتم تحديث الشيفرة
للسماح بتكوين النفق على مستوى الخدمة.
سيظل موازنة التحميل في الطبقة الثانية مدعومة - السبب الرئيسي لبدء المشروع هو عدم وجود دعم للطبقة الثانية في موازن تحميل Katran من Facebook.
يتم تضمين ملف تكوين عينة لـ IPv6/L3 - ستتبع وثائق أفضل قريباً.
VC5 هو موازن تحميل شبكي مصمم للعمل كبديل
لأجهزة الأجهزة التقليدية. يسمح بتوزيع الخدمات ذات عناوين IP الافتراضية (VIPs)
على مجموعات من الخوادم الخلفية ("الحقيقية"). قد تقوم الخوادم الحقيقية بتشغيل الخدمات
بأنفسها أو تعمل كوكلاء لطبقة أخرى من الخوادم (مثل HAProxy يعمل كموجه HTTP
في الطبقة 7 / تفريغ SSL عندما تحتاج إلى اتخاذ قرارات على طبقة التطبيق).
الشرط الوحيد هو أن يتم تكوين عناوين VIP على جهاز حلقة (loopback) على كل خادم حقيقي، على سبيل المثال: ip addr add 192.168.101.1/32 dev lo
يتم تحديد الخدمات والخوادم الحقيقية في ملف تكوين، إلى جانب تعريفات فحوصات الصحة. عندما تجتاز الخوادم الخلفية الفحوصات ويتوفر عدد كافٍ لتقديم خدمة، يتم الإعلان عن عناوين IP الافتراضية للموجهات عبر BGP.
أصبح توزيع حركة المرور في كل من الطبقة الثانية والطبقة الثالثة مدعوماً الآن. يتطلب التوزيع في الطبقة الثانية أن تشترك الخوادم الحقيقية في شبكة VLAN مع موازن التحميل؛ عند استلام حزمة لتوزيعها، يقوم موازن التحميل بتحديث عناوين الأجهزة الإيثرنت في الحزمة لاستخدام عنوان MAC للخادم الحقيقي كوجهة وعنوان MAC الخاص به كمصدر، ويعيد توجيه الحزمة عبر الواجهة المناسبة، مع تحديث معرف VLAN 802.1Q إذا كانت الحزم موسومة بـ VLAN.
يتطلب التوزيع في الطبقة الثالثة تغليف الحزم في بروتوكول نفق موجه إلى IP الخادم الحقيقي وإعادة توجيهها عبر موجه (إلا إذا كان الخادم وموازن التحميل يشتركان في شبكة VLAN). إذا، عند التغليف، تجاوزت حزمة الحجم الأقصى للإرسال في الشبكة، يتم إرسال رسالة ICMP إلى المصدر بنصيحة حول MTU المناسب للاستخدام. تحتاج الخوادم الخلفية فقط إلى فك تغليف الحزم - التوجيه ثنائي الاتجاه مع موازنات التحميل غير مطلوب.
يجب أن يكون خادم واحد بواجهة شبكة 10Gbit/s قادراً على دعم خدمة HTTP يزيد عرض النطاق الترددي للخروج عن 100Gbit/s بسبب الطبيعة غير المتماثلة لمعظم حركة مرور الإنترنت. للخدمات الأصغر، من المحتمل أن يتعامل جهاز افتراضي متواضع أو اثنان مع خدمة تولد عدة غيغابت/ثانية من حركة مرور الخروج.
إذا لم تكن نسخة واحدة كافية، يمكن إضافة المزيد من الخوادم لتوسيع السعة أفقياً (وتوفير التكرار) باستخدام ميزة ECMP للموجه الخاص بك. يتم دعم واجهات bonded 802.3ad و VLAN trunking 802.1Q (انظر دليل examples/).
لا حاجة لوحدات kernel أو إعدادات معقدة، على الرغم من أنه للحصول على أفضل أداء، يُوصى باستخدام بطاقة شبكة مع دعم وضع XDP الأصلي (مثل: mlx4، mlx5، i40e، ixgbe، ixgbevf، nfp، bnxt، thunder، dpaa2، qede). قائمة كاملة متاحة في صفحة دعم برامج تشغيل مشروع XDP.
للحصول على أفضل النتائج، يجب تعطيل/إلغاء تثبيت irqbalance.
ستحتاج إلى تحديد IP أساسي لتمريره إلى الموازن. يتم استخدام هذا كمعرف موجه BGP.
مثال بسيط على خادم بواجهة إيثرنت واحدة غير موسومة:
apt-get install git make libelf-dev golang-1.20 libyaml-perl libjson-perl ethtool (أو ما يعادله في توزيعتك)ln -s /usr/lib/go-1.20/bin/go /usr/local/bin/go (تأكد من وجود ثنائي Go في مسارك)git clone https://github.com/davidcoles/vc5.gitcd vc5/cmdcp config.sample.yaml config.yaml (قم بتحرير config.yaml ليتوافق مع متطلباتك)make (يسحب مكتبة libbpf، ويبني الثنائي وملف تكوين JSON)./vc5 10.1.10.100 config.json eth0 (عدّل لاستخدام عنوان IP لخادمك وواجهة إيثرنت)ip addr add 192.168.101.1/32 dev lo)من الأسهل بالتأكيد استخدام الثنائي من أحدث إصدار Github (المجمّع لـ x86-64). سيكون هذا قد تم اختباره في الإنتاج لذا يجب أن يكون موثوقاً. تأكد من أن تكوينك متوافق مع هذا الإصدار باستخدام script config.pl من الإصدار الموسوم (أو، بالطبع، يمكنك بناء تكوين JSON الخاص بك كما تفضل).
إذا قمت بتحديث ملف تكوين YAML وأعدت توليد JSON (make config.json) يمكنك إعادة تحميل التكوين الجديد عن طريق إرسال
SIGINT (Ctrl-C) أو SIGUSR2 إلى العملية. SIGQUIT (Ctrl-\) أو SIGTERM
سيؤدي إلى إنهاء العملية بأناقة عن طريق إغلاق اتصالات BGP
والخروج.
مثال أكثر تعقيداً مع جهاز إيثرنت bonded LACP يتكون من واجهتين (Intel X520 10Gbps على خادم الاختبار الخاص بي)، مع تمكين وضع برنامج تشغيل XDP الأصلي و VLANs موسومة:
config.yaml إدخال vlans:
vlans:
10: 10.1.10.0/24
20: 10.1.20.0/24
30: 10.1.30.0/24
سطر الأوامر:
./vc5 -n 10.1.10.100 config.json enp130s0f0 enp130s0f1
سيكتشف الثنائي واجهات VLAN الخاصة بك بالبحث عن أجهزة تحتوي على عناوين IP موجودة في بادئات VLAN في ملف التكوين. إذا كنت تستخدم واجهات فيزيائية غير موسومة منفصلة ، فيجب أن يعمل هذا الآن بشفافية دون أي إعداد إضافي، فقط قم بإدراج جميع الواجهات في سطر الأوامر حتى يتم تحميل شيفرة eBPF في كل منها.
نظراً لأن حالة الاتصال يتم تتبعها على أساس كل نواة (BPF_MAP_TYPE_LRU_PERCPU_HASH)، يجب التأكد من أن RSS (Receive Side Scaling) سيوجه الحزم الخاصة بتدفق باستمرار إلى نفس نواة CPU في حالة اختيار المحول لواجهة مختلفة عند تغير طوبولوجيا LACP. قم بتعطيل irqbalance، وتأكد من أن إعدادات القناة متماثلة على كل واجهة (ethtool -l/-L) وأن توزيع تجزئة تدفق RSS متطابق (ethtool -x/-X).