موازن التحميل لأنظمة الأوركسترا

موازن التحميل في أنظمة تزامن (Kubernetes و Nomad وغيرها) لها متطلبات أكثر من مجرد موازنة التحميل. أولاً ، يجب أن يكون Load Balancer قادرًا على قراءة دليل يتضمن قائمة بالخدمات التي يجب إعادة توجيه حركة المرور إليها (أو ، كخيار ، تمكين الخدمات من التسجيل لإدراجها في حركة المرور). ثانيا ، القيام بذلك بشكل حيوي ، لأنه يمكن لأنظمة الأوركسترا في أي وقت زيادة أو تقليل عدد النسخ المتماثلة للخدمة ، أو نقلها إلى عناوين أخرى على الشبكة. وثالثا ، القيام بذلك دون توقف حركة المرور.

في منشور اليوم ، سوف أصف العمل مع اثنين من موازن التحميل - Traefik و HAProxy. هذه موازن التحميل لديها القدرة على العمل مع قائمة رائعة من أدوات التنسيق. سوف تصف الأمثلة كيفية العمل مع نظام تزامن البدوي.

في آخر مشاركة أعطيت بالفعل مثالا على Load Balancers - Fabio. حدوده: يعمل فقط مع بروتوكولات http / https ، ويعمل فقط مع القنصل. على عكس Fabio ، يعمل Load Balancers Traefik مع عدد مثير للإعجاب من الأنظمة المختلفة. فيما يلي قائمة جزئية مأخوذة من موقع المطور: Docker ، Swarm mode ، Kubernetes ، Marathon ، Consul ، Etcd ، Rancher ، Amazon ECS ، ...

سأواصل المثال من المنشور السابق ، حيث تم إنشاء عدة نسخ متماثلة من خدمة django.

يمكن تنزيل Traefik من موقع المطور كملف قابل للتنفيذ لأنظمة التشغيل الأكثر شيوعًا. للتكامل مع البدوي (في الواقع مع القنصل) ، تحتاج إلى إنشاء ملف تكوين:

[entryPoints] [entryPoints.http] address = ":5001" [web] address = ":8080" [consulCatalog] endpoint = "127.0.0.1:8500" domain = "consul.localhost" exposedByDefault = false prefix = "traefik" 

ثم قم بتشغيل الأمر باستخدام ملف التكوين المحدد:

 traefik -c nomad/traefik.toml 

بعد ذلك ، سيكون UI Traefik متاحًا على المنفذ 8080 ، والذي لم ينشر أي خدمات بعد. هناك عدة طرق لنشر الخدمات ، والتي تؤدي في النهاية نفس الشيء - فهي تقوم بتحميل بيانات المفتاح / القيمة في نظام Traefik. سننتهز الفرصة لتعيين أزواج المفاتيح / القيمة من خلال علامات الخدمة. دعونا توسيع ملف تكوين خدمة django مع المعلمة العلامات:

 job "django-job" { datacenters = ["dc1"] type = "service" group "django-group" { count = 3 restart { attempts = 2 interval = "30m" delay = "15s" mode = "fail" } ephemeral_disk { size = 300 } task "django-job" { driver = "docker" config { image = "apapacy/tut-django:1.0.1" port_map { lb = 8000 } } resources { network { mbits = 10 port "lb" {} } } service { name = "django" tags = [ "traefik.enable=true", "traefik.frontend.entryPoints=http", "traefik.frontend.rule=Host:localhost;PathStrip:/test", "traefik.tags=exposed" ] port = "lb" check { name = "alive" type = "http" path = "/" interval = "10s" timeout = "2s" } } } } } 

في هذا المثال ، سيتم نشر الخدمة على مضيف المضيف المحلي وتثبيتها على / اختبار المسار. قام Traefik بتطوير نظام مرن وكامل لقواعد تكوين المسارات ، بما في ذلك العمل باستخدام التعبيرات المعتادة. قائمة المعلمات للقواعد في وثائق المطور.

بعد تشغيل nomad job run nomad/django.conf يتم تطبيق القواعد وسيتم توجيه حركة المرور من Load Balancer إلى الخدمة. وفقًا لذلك ، يمكنك تغيير هذه المعلمات ، ونشر خيار خدمة جديد باستخدام nomad job run nomad/django.conf ، والذي سيتم nomad job run nomad/django.conf ، وسيتم تطبيق جميع التغييرات دون إيقاف حركة المرور بشكل مزعج.

عيب Traefik هو أنه يعمل مع بروتوكولات عائلة http / https (فقط في حالة ، لاحظت أن هذه العائلة تحتوي أيضًا على مآخذ ويب). ولكن لا يزال هناك احتمال أن تكون هناك حاجة للعمل مع البروتوكولات الأخرى. لذلك دعونا ننتقل إلى الحل الأوسع المقبل الذي يعتمد على HAProxy. منذ بعض الوقت ، واجهت HAProxy مشكلات في التحميل الناعم ، مما جعل من الصعب استخدامه مع أنظمة التزامن (أثناء إعادة التشغيل ، كان من الضروري إيقاف حركة الحزم على مستوى الشبكة). الآن هذه لم تعد مشكلة.

تحتاج أولاً إلى تثبيت haproxy على جهاز الكمبيوتر الخاص بك. هنا ، لن يعمل خيار التثبيت داخل الحاوية. في haproxy ، أصبح من الممكن مؤخرًا إعادة تشغيل العملية في الوضع "اللين" ، ولكن في نفس الوقت تتوقف حاوية عامل النقل على أي حال ، حيث أن العملية الثانية مع haproxy تبدأ فعليًا ، فقط تغييرها يحدث في وضع الاستعداد - والذي لا يعمل مع عامل الإرساء ومبدأه "واحد" الحاوية هي عملية واحدة. "

لكي يعمل haproxy ، يجب أن يكون لديك ملف تكوين يحتوي على القواعد اللازمة. يستخدم البدوي (في الواقع في القنصل) نظام القوالب الذي يمكن أن يولد التكوينات:

 global debug defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 frontend http_front bind *:5001 stats uri /haproxy?stats default_backend http_back backend http_back balance roundrobin{{range service "django"}} server {{.Node}} {{.Address}}:{{.Port}} check{{end}} 

تعمل الكلمة الأساسية range في هذه الحالة كمكرر. بالنسبة إلى خدمات "django" الثلاث ، سيتم إنشاء ملف التكوين التالي:

 global debug defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 frontend http_front bind *:5001 stats uri /haproxy?stats default_backend http_back backend http_back balance roundrobin server 228.195.86.224 127.0.0.1:21469 check server 228.195.86.224 127.0.0.1:25872 check server 228.195.86.224 127.0.0.1:25865 check 

تستخدم مكتبة https://github.com/hashicorp/consul-template لبدء عملية التوليد وفقًا للقالب أثناء الطيران. من مورد المطور ، يمكنك تنزيل الملف القابل للتنفيذ لجميع أنظمة التشغيل الشائعة ، وبدء العملية نيابة عن مستخدم غير مصرح له باستخدام الأمر:

 consul-template -template="haproxy/haproxy.cfg.tmpl:haproxy/haproxy.cfg:./haproxy/haproxy.reload.sh" 

تحتوي المعلمة -template على معلمات -template بنقطتين 1) اسم القالب ، 2) اسم ملف التكوين الناتج 3) الأمر الذي يتم تنفيذه بعد إنشاء الملف. سيتم إنشاء الملف تلقائيًا في حالة تغيير المتغيرات المضمنة في القالب (على سبيل المثال ، يتم تغيير عدد النسخ المتماثلة لخدمة django).

بعد بدء تشغيل محرك القالب الذي سينشئ التكوين الأول ، يمكنك تشغيل haproxy:

 haproxy -D -f haproxy/haproxy.cfg -p `pwd`/haproxy.pid 

نحدد ملف pid بشكل صريح حتى نتمكن من إرسال إشارة إلى التحميل الزائد haproxy "الناعم":

 haproxy -D -f ./haproxy/haproxy.cfg -p `pwd`/haproxy.pid -sf $(cat `pwd`/haproxy.pid) 

في هذا المثال ، يتم نشر الخدمة على المنفذ 5001. على نفس المنفذ ، يمكنك عرض إحصائيات haproxy نفسها على العنوان /haproxy?stats .

تم التحديث بتاريخ 2014/02/24 10:43 م

وفقًا لتعليق @ usego ، تم إجراء تنقيح إضافي لتشغيل haproxy في حاوية عامل النقل ، وخاصة وفقًا للجزء من github.com/neo4j/docker-library-docs/tree/master/haproxy#relownload-config

إعادة تحميل التكوين

إذا كنت تستخدم أداة ربط ربط للتهيئة وقمت بتحرير ملف haproxy.cfg ، فيمكنك استخدام ميزة إعادة التحميل الرشيقة لـ HAProxy بإرسال SIGHUP إلى الحاوية:

$ docker kill -s HUP my-running-haproxy

يقوم البرنامج النصي لنقطة الإدخال في الصورة بالتحقق من تشغيل الأمر haproxy واستبداله بـ haproxy-systemd-wrapper من HAProxy upstream والذي يعتني بمعالجة الإشارات للقيام بإعادة التحميل الرشيقة. تحت الغطاء ، يستخدم هذا الخيار -sf الخاص بـ haproxy ، لذا "هناك نافذتان صغيرتان لكل منهما بضعة مللي ثانية حيث يمكن ملاحظة بعض حالات فشل الاتصال أثناء الأحمال العالية" (انظر إيقاف HAProxy وإعادة تشغيله).


مع هذا النهج ، يتم إعادة تحميل التكوين حقًا ، ولكن كنتيجة لانقطاع العملية الحالية. وهذا يعني أن الخدمات ستتوفر ، على الرغم من أنها غير ذات أهمية كبيرة ، ولكن مع ذلك فترة من عدم الوصول وقد يلاحظ بعض العملاء رسالة خطأ. لكن في بعض الأحيان ليس هذا هو معيار الاختيار الرئيسي. لذلك ، سأقدم بالإضافة إلى ذلك تكوين docker-compose.yml لإطلاق haproxy في docker:

 version: '3' services: haproxy_lb: image: haproxy volumes: - ./haproxy:/usr/local/etc/haproxy network_mode: host 


سيتم تغيير الأمر الذي يؤدي إلى زيادة التحميل على تكوين haproxy:

 consul-template -template="haproxy/haproxy.cfg.tmpl:haproxy/haproxy.cfg:docker kill -s HUP $(docker-compose ps -q haproxy_lb)" 


تشمل مزايا هذا التطبيق القدرة على العمل دون تثبيت haproxy.

نموذج التعليمة البرمجية متاح في المستودع.

روابط مفيدة:

1.www.haproxy.com/blog/haproxy-and-consul-with-dns-for-service-discovery
2.m.mattmclaugh.com/traefik-and-consul-catalog-example-2c33fc1480c0
3.www.hashicorp.com/blog/load-balancing-strategies-for-consul

apapacy@gmail.com
24 فبراير 2019

Source: https://habr.com/ru/post/ar441534/


All Articles