(الجزء الأول هنا: https://habr.com/en/post/456446/ )
CEPH
مقدمة
نظرًا لأن الشبكة هي أحد العناصر الرئيسية لـ Ceph ، وهي محددة قليلاً في شركتنا ، فسوف نخبرك أولاً قليلاً عنها.
سيكون هناك عدد أقل بكثير من أوصاف Ceph نفسها ، وبصورة أساسية البنية التحتية للشبكة. سيتم وصف خوادم Ceph فقط وبعض ميزات خوادم Proxmox الافتراضية.
لذلك: طوبولوجيا الشبكة نفسها مبنية على شكل أوراق الشجر. البنية الكلاسيكية ثلاثية الطبقات هي شبكة حيث يوجد Core (أجهزة توجيه أساسية) ، Aggregation (أجهزة توجيه التجميع) ومتصلة مباشرة مع عملاء Access (أجهزة توجيه الوصول):
مخطط ثلاثة مستويات

يتكون طبولوجيا الأوراق-العمود الفقري من مستويين: العمود الفقري (بالمعنى الرئيسي للكلمة الرئيسية) والورق (الفروع).
مخطط مستويين

كل التوجيه الداخلي والخارجي مبني على BGP. النظام الرئيسي الذي يتعامل مع التحكم في الوصول والإعلانات والمزيد هو XCloud.
يتم توصيل خوادم حجز القناة (وكذلك لتوسيعها) بمحولين L3 (معظم الخوادم متصلة بمفاتيح التبديل Leaf ، ولكن بعض الخوادم التي لديها زيادة في حمل الشبكة متصلة مباشرة بـ Spine للمحول) ، ومن خلال BGP تعلن عن عنوانها أحادي الإرسال ، بالإضافة إلى عنوان anycast للخدمة إذا كانت هناك عدة خوادم تخدم حركة مرور الخدمة وموازنة ECMP كافية لهم. هناك ميزة منفصلة لهذا المخطط ، والتي سمحت لنا بالحفظ على العناوين ، ولكنها تتطلب أيضًا من المهندسين التعرف على عالم IPv6 ، وهي استخدام BGP غير المعياري المعتمد على RFC 5549. لبعض الوقت ، تم استخدام Quagga للخوادم في BGP لهذا المخطط للخوادم وبشكل دوري كانت هناك مشاكل مع فقدان الأعياد والاتصال. ولكن بعد التبديل إلى FRRouting (التي يعد المساهمون النشطون فيها موردو معدات الشبكات لدينا: Cumulus و XCloudNetworks) ، لم نلاحظ مثل هذه المشكلات بعد الآن.
للراحة ، نحن نسمي هذا المخطط العام بأكمله "مصنع".
البحث عن وسيلة
خيارات تكوين شبكة الكتلة:
1) الشبكة الثانية على BGP
2) الشبكة الثانية على اثنين من مفاتيح منفصلة مكدسة مع LACP
3) الشبكة الثانية على اثنين من مفاتيح منفصلة معزولة مع OSPF
اختبارات
أجريت الاختبارات في نوعين:
أ) شبكة تستخدم أدوات iperf و qperf و nuttcp
ب) الاختبارات الداخلية Ceph cob-gobench ، rados bench ، إنشاء rbd واختبارها باستخدام dd في واحد أو عدة مؤشرات ترابط ، باستخدام fio
تم إجراء جميع الاختبارات على أجهزة الاختبار باستخدام أقراص SAS. لم يتم النظر إلى الأرقام في أداء rbd كثيرًا ، لقد تم استخدامها فقط للمقارنة. مهتم بالتغييرات اعتمادًا على نوع الاتصال.
الخيار الأول
يتم توصيل بطاقات الشبكة إلى المصنع ، تكوين BGP.
لا يعتبر استخدام هذا المخطط للشبكة الداخلية هو الخيار الأفضل:
أولاً ، العدد الزائد من العناصر الوسيطة في شكل مفاتيح تعطي زمن انتقال إضافي (كان هذا هو السبب الرئيسي).
ثانياً ، في البداية ، لإظهار الإحصائيات من خلال s3 ، استخدموا عنوان أي بث تم رفعه على العديد من الأجهزة باستخدام radosgateway. وقد أدى ذلك إلى حقيقة أن حركة المرور من الآلات الأمامية إلى RGW لم يتم توزيعها بالتساوي ، ولكن مرت على أقصر الطرق - وهذا يعني أن واجهة Nginx الأمامية تتحول دائمًا إلى نفس العقدة مع RGW التي كانت مرتبطة بورقة مشتركة معها (هذا ، بالطبع ، كان ليس الحجة الرئيسية - لقد رفضنا في وقت لاحق من عناوين anycast للعودة ثابتة). لكن من أجل نقاء التجربة ، قرروا إجراء اختبارات على مثل هذا المخطط من أجل الحصول على بيانات للمقارنة.
كنا خائفين من إجراء اختبارات للنطاق الترددي بأكمله ، نظرًا لأن المصنع يستخدم بواسطة خوادم prod ، وإذا قمنا بحظر الروابط بين الأوراق والعمود الفقري ، فإن هذا سيضر ببعض المبيعات.
في الواقع ، كان هذا سببًا آخر لرفض مثل هذا المخطط.
تم استخدام اختبارات Iperf بحد أقصى قدره 3bbps من BW من 1 و 10 و 100 تدفقات للمقارنة مع مخططات أخرى.
أظهرت الاختبارات النتائج التالية:

في 1 دفق تقريبًا 9.30 - 9.43 غيغابت / ثانية (في هذه الحالة ، يزداد عدد عمليات إعادة الإرسال بقوة ، إلى 39148 ). الرقم الذي تبين أنه قريب من الحد الأقصى للواجهة الواحدة يوحي باستخدام واحد من الاثنين. عدد مرات إعادة الإرسال حوالي 500-600.
10 تدفقات تبلغ 9.63 جيجابت / ثانية لكل واجهة ، بينما ارتفع عدد عمليات إعادة الإرسال إلى متوسط 17045.
في 100 موضوع ، كانت النتيجة أسوأ من 10 ، بينما كان عدد عمليات إعادة الإرسال أقل: متوسط القيمة هو 3354
الخيار الثاني
LACP
كان هناك اثنين من مفاتيح جونيبر EX4500. قاموا بجمعها على المكدس ، وربطوا الخادم بالوصلات الأولى لمفتاح واحد ، والثاني إلى الثاني.
كان إعداد الربط الأولي كما يلي:
root@ceph01-test:~# cat /etc/network/interfaces auto ens3f0 iface ens3f0 inet manual bond-master bond0 post-up /sbin/ethtool -G ens3f0 rx 8192 post-up /sbin/ethtool -G ens3f0 tx 8192 post-up /sbin/ethtool -L ens3f0 combined 32 post-up /sbin/ip link set ens3f0 txqueuelen 10000 mtu 9000 auto ens3f1 iface ens3f1 inet manual bond-master bond0 post-up /sbin/ethtool -G ens3f1 rx 8192 post-up /sbin/ethtool -G ens3f1 tx 8192 post-up /sbin/ethtool -L ens3f1 combined 32 post-up /sbin/ip link set ens3f1 txqueuelen 10000 mtu 9000 auto bond0 iface bond0 inet static address 10.10.10.1 netmask 255.255.255.0 slaves none bond_mode 802.3ad bond_miimon 100 bond_downdelay 200 bond_xmit_hash_policy 3 #(layer3+4 ) mtu 9000
أظهرت اختبارات iperf و qperf أن وزن الجسم يصل إلى 16 جيجابت / ثانية. قررنا مقارنة أنواع مختلفة من وزارة الدفاع:
ص ص ، التوازن xor و 802.3ad. لقد قارنا أيضًا أنواعًا مختلفة من التجزئة 2 + 3 و layer3 + 4 (على أمل الحصول على ميزة في حوسبة التجزئة).
لقد قارنا أيضًا النتائج الخاصة بقيم sysctl المختلفة للمتغير net.ipv4.fib_multipath_hash_policy ، (جيدًا ، لقد لعبنا قليلاً مع net.ipv4.tcp_congestion_control ، على الرغم من أنه لا علاقة له بالترابط . يوجد مقال جيد حول ValdikSS لهذا المتغير)).
لكن في جميع الاختبارات ، لم ينجح ذلك في تجاوز عتبة 18 جيجابت / ثانية (تم تحقيق هذا الرقم باستخدام الميزان xor و 802.3ad ، ولم يكن هناك فرق كبير بين نتائج الاختبار) وقد تم تحقيق هذه القيمة "في القفز" بواسطة رشقات نارية.
الخيار الثالث
OSPF
لتكوين هذا الخيار ، تمت إزالة LACP من المحولات (تم ترك التراص ، ولكن تم استخدامه فقط للإدارة). على كل رمز تبديل ، قاموا بجمع شبكة محلية ظاهرية منفصلة لمجموعة من المنافذ (مع مراعاة المستقبل الذي سيتم فيه تعليق خوادم QA و PROD في نفس المحولات).
تكوين شبكتين خاصة مسطحة لكل شبكة محلية ظاهرية (واجهة واحدة لكل رمز التبديل). في أعلى هذه العناوين ، يتم الإعلان عن عنوان آخر من الشبكة الخاصة الثالثة ، وهي شبكة المجموعة لـ CEPH.
نظرًا لأن الشبكة العامة (التي نستخدم من خلالها SSH) تعمل على BGP ، فقد استخدمنا frr لتكوين OSPF ، الموجود بالفعل على النظام.
10.10.10.0/24 و 20.20.20.0/24 - شبكتان ثابتتان على المفاتيح
172.16.1.0/24 - شبكة للإعلان

إعداد الجهاز:
واجهات ens1f0 ens1f1 ننظر إلى شبكة خاصة
واجهات ens4f0 ens4f1 ننظر إلى الشبكة العامة
يبدو تكوين الشبكة على الجهاز كما يلي:
oot@ceph01-test:~# cat /etc/network/interfaces # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback auto ens1f0 iface ens1f0 inet static post-up /sbin/ethtool -G ens1f0 rx 8192 post-up /sbin/ethtool -G ens1f0 tx 8192 post-up /sbin/ethtool -L ens1f0 combined 32 post-up /sbin/ip link set ens1f0 txqueuelen 10000 mtu 9000 address 10.10.10.1/24 auto ens1f1 iface ens1f1 inet static post-up /sbin/ethtool -G ens1f1 rx 8192 post-up /sbin/ethtool -G ens1f1 tx 8192 post-up /sbin/ethtool -L ens1f1 combined 32 post-up /sbin/ip link set ens1f1 txqueuelen 10000 mtu 9000 address 20.20.20.1/24 auto ens4f0 iface ens4f0 inet manual post-up /sbin/ethtool -G ens4f0 rx 8192 post-up /sbin/ethtool -G ens4f0 tx 8192 post-up /sbin/ethtool -L ens4f0 combined 32 post-up /sbin/ip link set ens4f0 txqueuelen 10000 mtu 9000 auto ens4f1 iface ens4f1 inet manual post-up /sbin/ethtool -G ens4f1 rx 8192 post-up /sbin/ethtool -G ens4f1 tx 8192 post-up /sbin/ethtool -L ens4f1 combined 32 post-up /sbin/ip link set ens4f1 txqueuelen 10000 mtu 9000 # loopback-: auto lo:0 iface lo:0 inet static address 55.66.77.88/32 dns-nameservers 55.66.77.88 auto lo:1 iface lo:1 inet static address 172.16.1.1/32
التكوينات frr تبدو مثل هذا:
root@ceph01-test:~# cat /etc/frr/frr.conf frr version 6.0 frr defaults traditional hostname ceph01-prod log file /var/log/frr/bgpd.log log timestamp precision 6 no ipv6 forwarding service integrated-vtysh-config username cumulus nopassword ! interface ens4f0 ipv6 nd ra-interval 10 ! interface ens4f1 ipv6 nd ra-interval 10 ! router bgp 65500 bgp router-id 55.66.77.88 # , timers bgp 10 30 neighbor ens4f0 interface remote-as 65001 neighbor ens4f0 bfd neighbor ens4f1 interface remote-as 65001 neighbor ens4f1 bfd ! address-family ipv4 unicast redistribute connected route-map redis-default exit-address-family ! router ospf ospf router-id 172.16.0.1 redistribute connected route-map ceph-loopbacks network 10.10.10.0/24 area 0.0.0.0 network 20.20.20.0/24 area 0.0.0.0 ! ip prefix-list ceph-loopbacks seq 10 permit 172.16.1.0/24 ge 32 ip prefix-list default-out seq 5 permit 0.0.0.0/0 ge 32 ! route-map ceph-loopbacks permit 10 match ip address prefix-list ceph-loopbacks ! route-map redis-default permit 10 match ip address prefix-list default-out ! line vty !
في هذه الإعدادات ، تختبر الشبكة iperf ، qperf ، إلخ. أظهر أقصى استخدام للقناتين عند 19.8 جيجابت / ثانية ، في حين انخفض الكمون إلى 20us
حقل معرف جهاز التوجيه Bgp: يستخدم لتحديد العقدة عند معالجة معلومات التوجيه وبناء الطرق. إذا لم يتم تحديد ذلك في التكوين ، يتم تحديد أحد عناوين IP للمضيف. قد يكون لدى مختلف الشركات المصنعة للأجهزة والبرامج خوارزميات مختلفة ، ففي حالتنا استخدم FRR أكبر عنوان IP لاسترجاع البيانات. هذا أدى إلى مشكلتين:
1) إذا حاولنا تعليق عنوان آخر (على سبيل المثال ، خاص من الشبكة 172.16.0.0) أكثر من العنوان الحالي ، فقد أدى ذلك إلى تغيير معرف جهاز التوجيه ، وبالتالي إلى إعادة تثبيت الدورات الحالية. هذا يعني استراحة قصيرة وفقدان اتصال الشبكة.
2) إذا حاولنا تعليق أي عنوان للبث مشترك بين عدة أجهزة وتم اختياره كمعرّف لجهاز التوجيه ، فستظهر عقدتان بنفس معرف جهاز التوجيه على الشبكة .
الجزء 2
بعد اختبار QA ، بدأنا في ترقية Ceph القتالية.
NETWORK
الانتقال من شبكة واحدة إلى اثنين
معلمة شبكة الكتلة هي واحدة من تلك التي لا يمكن تغييرها بسرعة أثناء تحديد OSD عبر ceph tell osd. * Injectargs. يعد تغييره في التكوين وإعادة تشغيل المجموعة بأكملها حلاً مقبولًا ، لكنني حقًا لم أكن أرغب في الحصول على فترة توقف صغيرة. من المستحيل أيضًا إعادة تشغيل OSD واحد باستخدام معلمة شبكة جديدة - في وقت ما كان من الممكن أن يكون لدينا مجموعتان نصفيتان - OSDs قديمة على الشبكة القديمة ، وأخرى جديدة على واحدة جديدة. لحسن الحظ ، فإن المعلمة شبكة الكتلة (وكذلك public_network ، بالمناسبة) هي قائمة ، وهذا هو ، يمكنك تحديد العديد من القيم. قررنا الانتقال تدريجياً - أولاً أضف شبكة جديدة إلى التكوينات ، ثم أزل الشبكة القديمة. يمر Ceph عبر قائمة الشبكات بالتتابع - يبدأ OSD العمل أولاً مع الشبكة المسردة أولاً.
كانت الصعوبة هي أن الشبكة الأولى عملت من خلال bgp وكانت متصلاً بمفتاح واحد ، والثانية - إلى ospf ومتصلة بأخرى لم تكن متصلة فعليًا بالأول. في وقت الانتقال ، كان من الضروري أن يكون لديك وصول مؤقت للشبكة بين الشبكتين. كانت خصوصية إعداد المصنع هي أنه لا يمكن تكوين قوائم ACL على الشبكة إذا لم تكن مدرجة في قائمة الإعلانات المعلن عنها (في هذه الحالة ، تكون "خارجية" ولا يمكن إنشاء قوائم ACL لها خارجيًا. تم إنشاؤها على spains ، ولكنها لم تصل على الأوراق).
كان الحل عكازًا ومعقدًا ، لكنه نجح: الإعلان عن الشبكة الداخلية عبر bgp ، بالتزامن مع ospf.
تسلسل الانتقال كما يلي:
1) تكوين شبكة الكتلة لـ ceph على شبكتين: من خلال bgp ومن خلال ospf
في التكوينات frr ، لم يكن من الضروري تغيير أي شيء ، خط
ip prefix-list default-out seq 5 permit 0.0.0.0/0 ge 32
لا يحدنا في العناوين المعلنة ، يتم رفع عنوان الشبكة الداخلية نفسها على واجهة الاسترجاع ، كان يكفي لتكوين استقبال إعلان هذا العنوان على أجهزة التوجيه.
2) إضافة شبكة جديدة إلى التكوين ceph.conf
cluster network = 172.16.1.0/24, 55.66.77.88/27
وابدأ في إعادة تشغيل OSD واحدًا في كل مرة حتى ينتقل الجميع إلى شبكة 172.16.1.0/24.
root@ceph01-prod:~#ceph osd set noout # - OSD # . , # , OSD 30 . root@ceph01-prod:~#for i in $(ps ax | grep osd | grep -v grep| awk '{ print $10}'); \ root@ceph01-prod:~# do systemctl restart ceph-osd@$i; sleep 30; done
3) ثم نزيل الشبكة الزائدة من التكوين
cluster network = 172.16.1.0/24
وكرر الإجراء.
هذا كل شيء ، انتقلنا بسلاسة إلى شبكة جديدة.
المراجع:
https://shalaginov.com/2016/03/26/--leaf-spine/
https://www.xcloudnetworks.com/case-studies/innova-case-study/
https://github.com/rumanzo/ceph-gobench