مشغل Tarantool kubernetes



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

نقدم لك حلنا لإطلاق مجموعات خرطوشة Tarantool خرطوشة صالحة للاستخدام : Tarantool Kubernetes Operator ، للحصول على تفاصيل أطلبها تحت cat.

جدول المحتويات:

  1. بدلا من ألف كلمة
  2. ماذا يفعل المشغل على الإطلاق
  3. قليلا عن الفروق الدقيقة
  4. كيف يعمل المشغل
  5. ما يوسع المشغل
  6. يؤدي


Tarantool هو قاعدة بيانات مفتوحة المصدر وخادم التطبيقات في حزمة واحدة. كقاعدة بيانات ، فإنه يحتوي على عدد من الخصائص الفريدة: كفاءة استخدام الحديد العالية ، نظام بيانات مرن ، دعم تخزين الذاكرة والأقراص على حد سواء ، وإمكانية التوسع من خلال استخدام لغة Lua. كخادم تطبيق ، يتيح لك نقل رمز التطبيق في أقرب وقت ممكن من البيانات ، مع تحقيق الحد الأدنى من وقت الاستجابة والحد الأقصى من الإنتاجية. بالإضافة إلى ذلك ، لدى Tarantool نظامًا بيئيًا شاملاً ، يوفر وحدات جاهزة لحل مشاكل التطبيق: التقسيم ، والصف ، والوحدات النمطية لتسهيل التطوير ( خرطوشة ، luatest ) ، حلول للتشغيل ( المقاييس ، ansible ) - هذه مجرد أمثلة قليلة.

بالنسبة إلى جميع مزاياها ، فإن إمكانيات مثيل Tarantool واحد ليست محدودة: لتخزين تيرابايت من البيانات ومعالجة ملايين الطلبات ، تحتاج إلى رفع عشرات ومئات الحالات ، وهذا نظام موزع ، مع كل مشاكله الكامنة. لحلها ، لدينا Tarantool Cartridge ، إطار العمل الذي تتمثل مهمته الرئيسية في إخفاء كل أنواع الصعوبات في كتابة التطبيقات الموزعة والسماح للمطورين بالتركيز على القيمة التجارية للتطبيق. توفر Cartridge مجموعة قوية من المكونات من أجل تزامن الكتلة التلقائي ، وتوزيع البيانات تلقائيًا ، و webui للتشغيل وأدوات المطور.

إن Tarantool ليس تقنية فحسب ، بل هو أيضًا فريق من المهندسين الذين يشاركون في تطوير أنظمة المؤسسات الجاهزة وحلول الصناديق ودعم مكونات المصادر المفتوحة.

على الصعيد العالمي ، يمكن تقسيم مهامنا إلى مجالين: تطوير أنظمة جديدة وزيادة الحلول الحالية. على سبيل المثال ، هناك قاعدة كبيرة من بائع مشهور. لتوسيع نطاق القراءة ، وضعوا في النهاية ذاكرة تخزين مؤقت متسقة على Tarantool. أو بالعكس: من أجل توسيع نطاق التسجيل ، وضعوا Tarantool في التكوين الساخن / البارد ، حيث "يتم تبريد" البيانات التي يتم إلقاؤها في التخزين البارد وبالتوازي مع قائمة انتظار التحليلات. أو من أجل عمل نسخة احتياطية من نظام قائم ، تتم كتابة نسخة خفيفة من هذا النظام (احتياطي وظيفي) ، والتي تحتفظ بـ "hot" الرئيسية بتكرار البيانات من النظام الرئيسي. يمكن الاطلاع على مزيد من المعلومات في التقارير من T + 2019 .

كل هذه الأنظمة لديها شيء واحد مشترك: إنها صعبة للغاية للعمل. يمكنك طرح مجموعة من أكثر من 100 حالة مع التكرار بسرعة إلى 3 مراكز بيانات ، وتحديث التطبيق الذي يخزن البيانات دون تعطل وسحب الصيانة ، واستعادة نسخة احتياطية في حالة وقوع كارثة أو أخطاء من صنع الإنسان ، وضمان فشل مكون غير واضح ، وتنظيم إدارة التكوين ... بشكل عام ، مثيرة للاهتمام.

وسيكون أمرا رائعا إذا كان كل هذا لا يزال يعمل ببساطة كما يجري تطويره. تجعل Kubernetes من الممكن تحقيق النتيجة المرجوة ، لكن استخدام مشغل متخصص يجعل الحياة أسهل.

بدلا من ألف كلمة


لقد أعددنا مثالًا صغيرًا استنادًا إلى خرطوشة Tarantool ، وسوف نعمل معها. تطبيق بسيط مثل "تخزين قيمة المفتاح الموزعة مع واجهة HTTP". بعد الاطلاق ، نحصل على هذه الصورة:



حيث:

  • أجهزة التوجيه - جزء من الكتلة المسؤولة عن قبول ومعالجة طلبات HTTP الواردة ؛
  • التخزين هو جزء من المجموعة المسؤولة عن تخزين ومعالجة البيانات ، 3 شظايا ترتفع من المربع ، في كل الرئيسية والنسخة المتماثلة.

لموازنة حركة مرور HTTP الواردة على أجهزة التوجيه ، يتم استخدام Kubernetian Ingress. يتم توزيع البيانات في التخزين على مستوى Tarantool نفسه باستخدام مكون vshard .

نحن بحاجة إلى kubernetes 1.14+ ، وسوف تعمل minikube. أيضا لن يضر توافر kubectl . لبدء المشغل ، تحتاج إلى إنشاء حساب الخدمة والدور وتجليد الأدوار له:

$ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/service_account.yaml $ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/role.yaml $ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/role_binding.yaml 

يقوم مشغل Tarantool بتوسيع Kubernetes API مع تعريفات الموارد الخاصة به ، وسوف نقوم بإنشائها:

 $ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/crds/tarantool_v1alpha1_cluster_crd.yaml $ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/crds/tarantool_v1alpha1_role_crd.yaml $ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/crds/tarantool_v1alpha1_replicasettemplate_crd.yaml 

كل شيء جاهز لبدء المشغل ، دعنا نذهب:

 $ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/operator.yaml 

نحن في انتظار أن يبدأ المشغل ، ويمكننا بدء تشغيل التطبيق:

 $ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/examples/kv/deployment.yaml 

في ملف yaml مع المثال ، يتم الإعلان عن Ingress على واجهة المستخدم على الويب ؛ وهي متوفرة على cluster_ip/admin/cluster . عندما يكون Pod on Ingress واحدًا على الأقل ، يمكنك الذهاب إلى هناك ومشاهدة كيفية إضافة مثيلات جديدة إلى الكتلة وكيف يتغير هيكلها.

نحن في انتظار الكتلة لاستخدامها:

 $ kubectl describe clusters.tarantool.io examples-kv-cluster 

نتوقع أنه في حالة المجموعة سيكون هناك ما يلي:

 … Status: State: Ready … 

كل شيء ، التطبيق جاهز للاستخدام!

بحاجة الى مزيد من مساحة التخزين؟ إضافة القطع:

 $ kubectl scale roles.tarantool.io storage --replicas=3 

شظايا لا يمكن التعامل مع الحمل؟ قم بزيادة عدد الحالات في القشرة عن طريق تحرير قالب مجموعة النسخ المتماثلة:

 $ kubectl edit replicasettemplates.tarantool.io storage-template 

قم بتعيين .spec.replicas ، على سبيل المثال 2 ، لزيادة عدد المثيلات في كل مجموعة نسخ متماثلة إلى قسمين.

لم تعد هناك حاجة كتلة؟ نحذفها مع كل الموارد:

 $ kubectl delete clusters.tarantool.io examples-kv-cluster 

هل حدث خطأ ما؟ يسجل التذكرة ، ونحن سوف تفكيك بسرعة. :)

ماذا يفعل المشغل على الإطلاق


إن إطلاق وتشغيل مجموعة خراطيش Tarantool هي قصة أداء بعض الإجراءات ، بترتيب معين ، في لحظة معينة.

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

  1. نرفع العدد المطلوب من مثيلات Tarantool ، على سبيل المثال ، ضمن systemd.
  2. دمج المثيلات في العضوية:

     mutation { probe_instance: probe_server(uri: "storage:3301") } 

  3. عيّن الأدوار للمثيلات ، وحدد المثال ومُعرّفات النسخ المتماثلة. يتم استخدام واجهة برمجة تطبيقات GraphQL أيضًا لهذا:

     mutation { join_server( uri:"storage:3301", instance_uuid: "cccccccc-cccc-4000-b000-000000000001", replicaset_uuid: "cccccccc-0000-4000-b000-000000000000", roles: ["storage"], timeout: 5 ) } 

  4. نقوم بتنفيذ bootstrap للمكون المسؤول عن التقسيم. أيضا عن طريق API:

     mutation { bootstrap_vshard cluster { failover(enabled:true) } } 


سهل ، أليس كذلك؟

يصبح كل شيء أكثر إثارة للاهتمام عندما يتعلق الأمر بتوسيع كتلة. دور أجهزة التوجيه من نماذج المثال ببساطة: رفع المزيد من الحالات ، وربطها إلى كتلة موجودة - لقد انتهيت! دور المخازن هو أصعب إلى حد ما. وحدة التخزين مظللة ، لذلك عند إضافة / إزالة المثيلات ، من الضروري إعادة توازن البيانات للانتقال إلى مثيلات جديدة / للانتقال من المثيلات المحذوفة. إذا لم يتم ذلك ، فسنحصل في حالة واحدة على حالات مثقلة ، وفي الحالة الثانية - نفقد البيانات. وإذا لم تكن واحدة فقط ، ولكن هناك عشر مجموعات من هذه المجموعات ذات طبولوجيا مختلفة تعمل؟

بشكل عام ، مشغل Tarantool مشغول بكل هذا. يصف المستخدم الحالة المطلوبة من مجموعة Tarantool Cartridge ، ويقوم المشغل بترجمة ذلك إلى مجموعة من الإجراءات على موارد k8s وإلى مكالمات معينة إلى واجهة برمجة تطبيقات مشرف نظام Tarantool في ترتيب معين ، في لحظة معينة ، ويحاول عمومًا إخفاء كل الفروق الدقيقة عن المستخدم.

قليلا عن الفروق الدقيقة


عند العمل مع واجهة برمجة تطبيقات مجموعة مسؤول Tarantool Cartridge ، من المهم ترتيب المكالمات ومكانها. لماذا هذا

تحمل خرطوشة Tarantool مستودع طبولوجيا لها ، ومكون اكتشاف الخدمة الخاص بها ، ومكون التكوين الخاص بها. يخزن كل مثيل من الكتلة نسخة من الهيكل والتكوين في ملف yaml.

 servers: d8a9ce19-a880-5757-9ae0-6a0959525842: uri: storage-2-0.examples-kv-cluster:3301 replicaset_uuid: 8cf044f2-cae0-519b-8d08-00a2f1173fcb 497762e2-02a1-583e-8f51-5610375ebae9: uri: storage-0-0.examples-kv-cluster:3301 replicaset_uuid: 05e42b64-fa81-59e6-beb2-95d84c22a435 … vshard: bucket_count: 30000 ... 

يحدث التحديث في حفلة موسيقية باستخدام آلية الالتزام على مرحلتين . تتطلب الترقية الناجحة النصاب القانوني بنسبة 100 ٪: يجب أن يستجيب كل مثيل ، وإلا التراجع. ماذا يعني هذا من حيث العملية؟ جميع الطلبات إلى API المسؤول التي تعدل حالة الكتلة هي الأكثر موثوقية لإرسالها إلى مثيل واحد ، إلى الزعيم ، وإلا فإننا نواجه خطر الحصول على تكوينات مختلفة في حالات مختلفة. لا تعرف خرطوشة Tarantool كيفية إجراء انتخابات رائدة (ومع ذلك لا تعرف كيف) ، ويمكن لمشغل Tarantool - ويمكنك فقط معرفة ذلك كحقيقة مسلية ، لأن المشغل سوف يدمر كل شيء.

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

كيف يعمل المشغل


تتمثل مهمة المشغل في جلب النظام إلى الحالة التي حددها المستخدم والحفاظ على النظام في هذه الحالة حتى يتم تلقي توجيهات جديدة. لكي يتمكن المشغل من القيام بعمله ، يحتاج إلى:

  1. وصف لحالة النظام.
  2. الرمز الذي يجلب النظام إلى هذه الحالة.
  3. آلية لدمج هذا الكود في k8s (على سبيل المثال ، لتلقي إعلامات بالتغييرات في الحالة).

يتم وصف مجموعة خرطوشة Tarantool من حيث k8s من خلال تعريف الموارد المخصصة (CRD) ؛ يحتاج المشغل إلى 3 موارد مخصصة من هذا القبيل ، متحدة تحت مجموعة tarantool.io/v1alpha:

  • الكتلة هي مورد المستوى الأعلى الذي يتوافق مع كتلة خرطوشة Tarantool واحدة.
  • دور - من حيث خرطوشة Tarantool ، وهذا هو دور المستخدم .
  • ReplicasetTemplate - هو القالب الذي سيتم من خلاله إنشاء StatefulSets (لماذا Stateful - سأخبرك لاحقًا بعض الشيء ؛ لا يجب الخلط بينه وبين ReplicaSet k8s).

تعكس كل هذه الموارد نموذج وصف مجموعة Tarantool Cartridge مباشرةً. من خلال وجود قاموس مشترك ، من السهل على المشغل التواصل مع المطورين وفهم ما يريدون رؤيته في المنتج.

الرمز الذي يجلب النظام إلى الحالة المعينة - من حيث k8s ، هذا هو المراقب المالي. في حالة مشغل Tarantool ، هناك عدة وحدات تحكم:

  • ClusterController - مسؤول عن التفاعل مع مجموعة خرطوشة Tarantool ، ويربط المثيلات مع الكتلة ، ويفصل المثيلات عن الكتلة.
  • RoleController هو وحدة تحكم دور المستخدم ، وهي مسؤولة عن نشر StatefulSets من قالب والحفاظ على عددهم في رقم معين.

ما هو مثل تحكم؟ مجموعة من التعليمات البرمجية التي تجلب العالم من حولك تدريجياً بالترتيب. يمكن تصور ClusterController بشكل تخطيطي مثل هذا:



نقطة الإدخال هي فحص لمعرفة ما إذا كان مورد نظام المجموعة موجودًا فيما يتعلق بحدث الحدث. غير موجود؟ نحن نغادر. هل هناك؟ ننتقل إلى الكتلة التالية: الاستيلاء على الملكية على أدوار المستخدم. الملتقطة يسارًا واحدًا ، في الدائرة الثانية نلتقط الصورة الثانية. وهكذا ، حتى نلتقط كل شيء. هل تم التقاط جميع الأدوار؟ لذا انتقل إلى المجموعة التالية من العمليات. وهكذا ، حتى نصل إلى النهاية ؛ ثم يمكننا أن نفترض أن النظام الخاضع للرقابة في حالة معينة.

بشكل عام ، كل شيء بسيط. من المهم تحديد معايير النجاح لاجتياز كل مرحلة. على سبيل المثال ، فإننا نعتبر نجاح عملية الانضمام إلى نظام مجموعة ليس بنجاح عندما يتم إرجاع النجاح المشروط = صواب ، ولكن عندما يُرجع خطأ مثل "منضم بالفعل".

والجزء الأخير من هذه الآلية هو دمج وحدة التحكم مع k8s. المنظر الهوائي ، يتكون k8s بالكامل من مجموعة من وحدات التحكم التي تولد الأحداث وتستجيب لها. تمر الأحداث عبر قوائم الانتظار التي يمكننا الاشتراك فيها. من الناحية التخطيطية ، يمكن تمثيل ذلك على النحو التالي:



يقوم المستخدم باستدعاء kubectl create -f tarantool_cluster.yaml ، يتم إنشاء مورد نظام المجموعة المقابل. يتم إعلام ClusterController بإنشاء مورد نظام المجموعة. وأول شيء يحاول القيام به هو العثور على جميع موارد الدور التي يجب أن تكون جزءًا من هذه المجموعة. إذا وجد ، ثم يعين الكتلة كمالك للدور وتحديث مورد الدور. يتلقى RoleController إشعارًا بتحديث الدور ، ويرى أن المورد لديه مالك ، ويبدأ في إنشاء StatefulSets. وما إلى ذلك في دائرة: أول المتعري للثاني ، الثاني المتعري للثاني - وهكذا إلى أن يتوقف شخص ما. ويمكنك أيضًا التشغيل في الوقت المحدد ، على سبيل المثال ، كل 5 ثوانٍ ، وهو أمر مفيد في بعض الأحيان.

هذا هو المشغل بالكامل: قم بإنشاء مورد مخصص وكتابة التعليمات البرمجية التي تستجيب للأحداث على الموارد.

ما يوسع المشغل


تؤدي إجراءات المشغل في النهاية إلى إنشاء k8s للقرون والحاويات. في مجموعة خرطوشة Tarantool التي تم نشرها على k8s ، يتم دمج جميع Pods في StatefulSets.

لماذا StatefulSet؟ كما كتبت سابقًا ، يحتفظ كل مثيل من إصدارات Tarantool Cluster بنسخة من الهيكل والتكوين للكتلة ، وغالبًا على خادم التطبيق ، لا ، لا ، ويستخدمون نوعًا من المساحة ، على سبيل المثال ، بدوره أو البيانات المرجعية ، وهذه حالة كاملة بالفعل . ويضمن StatefulSet أيضًا الحفاظ على قرون الهوية ، وهو أمر مهم عند تجميع الحالات في كتلة: يجب تثبيت هوية الحالات ، وإلا فإننا نجازف بفقد النصاب القانوني عند إعادة التشغيل.

عندما يتم إنشاء كل موارد نظام المجموعة وإحضارها إلى الحالة المطلوبة ، فإنها تشكل التسلسل الهرمي التالي:



تشير الأسهم إلى علاقة المالك بالموارد. من الضروري أن يقوم جامع البيانات المهملة بتنظيف بعدنا في حالة ، على سبيل المثال ، إزالة نظام المجموعة.

بالإضافة إلى StatefulSets ، يقوم مشغل Tarantool بإنشاء خدمة بلا رأس ، وهي ضرورية لانتخاب القادة ، ومن خلالها ، تتواصل الحالات مع بعضها البعض.

تحت غطاء محرك السيارة من المشغل Tarantool يقع إطار المشغل ، رمز المشغل نفسه في golang ، لا شيء غير عادي هنا.

يؤدي


هذا كل شيء ، بشكل عام! نحن في انتظار ردود الفعل وتذاكر منك - حيث بدونها ، إصدار ألفا هو نفسه. ما التالي؟ وبعد ذلك ، هناك الكثير من العمل لجعل هذا كله في الاعتبار:

  • وحدة ، اختبار E2E ؛
  • اختبار الفوضى القرد
  • اختبار الإجهاد
  • النسخ الاحتياطي / استعادة.
  • مزود طوبولوجيا الخارجية.

كل واحد من هذه المواضيع واسع في حد ذاته ويستحق مادة منفصلة ، انتظر التحديثات!

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


All Articles