ما الذي يقوم به الوضع المُدار
المنفّذ عبارة عن خدمة خفية ضمن نفس الملف الثنائيclicklink الذي يضم أداة السحب ومستكشف الأخطاء ومصلحها. وهو يحتفظ بقناة WebSocket صادرة نحو نقطة نهاية الموصل الخاصة بك، ويتلقى أوامر دورة الحياة من ClickHouse Cloud. ويطبّق كل أمر على عنقود Kubernetes الوحيد المُهيّأ له، ثم يبلّغ عن النتيجة عبر تلك القناة. وعلى غرار المكوّنات الأخرى، لا ينشئ سوى اتصالات صادرة: فـ ClickHouse Cloud لا يتصل أبدًا بعنقودك، كما أن واجهة برمجة التطبيقات المحلية للمنفّذ ترتبط بعنوان الاسترجاع المحلي (loopback).
يتوفر الوضع المُدار على Amazon EKS مع S3 storage أثناء المعاينة الخاصة. ويقوم فريق حسابك بتفعيله عند تسجيل بيئتك. ويرفض الأمر init أي سياق kube لا يشير إلى عنقود EKS.
تحتاج كل خدمة إلى ثلاثة موارد سحابية تملكها: حاوية للبيانات، وحاوية للنسخ الاحتياطية، ودور IAM تتقمّصه بودات ClickHouse للوصول إليهما. وأنت من ينشئها ببيانات اعتمادك الخاصة قبل وجود الخدمة، ومن يزيلها بعد زوالها. ولا يحتفظ المنفّذ بأي بيانات اعتماد لحاويات التخزين الخاصة بك أو لـ IAM، ولا يحذف البيانات إطلاقًا. وتقتصر استدعاءاته السحابية على Amazon ECR وSTS؛ فهو يسجّل الدخول إلى السجل عندما تسحب عملية مزامنة أو إنشاء للمنصة مخططًا، ويتحقق من الصور باستخدام دور السحب للقراءة فقط أثناء تحديث المنصة. ولا يجري أي استدعاءات إلى S3 أو IAM. ولكل خدمة ينشئ Service في Kubernetes من نوع LoadBalancer، تُجسّده وحدة تحكم موازن التحميل في عنقودك على هيئة NLB داخلي ضمن حسابك.
على جهاز افتراضي، يعمل المنفّذ بوصفه وحدة systemd باسم clicklink-executor إلى جانب المكوّنين الآخرين. أما على Kubernetes فهو Deployment بنسخة واحدة ضمن مساحة أسماء الموصل. ويقدّم بيانات الصحة والمقاييس على المنفذ 8086، وواجهة برمجة التطبيقات المحلية الخاصة به على 127.0.0.1:9999.
تفعيل الوضع المُدار
تختار الوضع المُدار عند التسجيل: مرّر--managed إلى clicklink clctl init، أو أجب عن المُطالبة في الطرفية. على جهاز افتراضي، يأخذ init العنقود من ملف kubeconfig الخاص بهذا المضيف (استخدم --cluster-name إذا كان يحتوي على أكثر من عنقود EKS) ويمنح المنفّذ أذونات الوصول على مستوى العنقود بشكل مضمّن. على Kubernetes، مرّر --egress-cidrs مع نطاقات CIDR الخاصة بنقطة نهاية الـ connector لديك ليُهيّئ المخطط سياسة NetworkPolicy الافتراضية للرفض مُفعّلة.
أما التثبيت نفسه فلم يتغيّر. راجع onboarding للاطلاع على التدفق الكامل، ومرجع CLI للاطلاع على الخيارات.
إنشاء خدمة
يُفعَّل إنشاء الخدمة عبر نقطة نهاية الموصل على مستوى كل بيئة؛ تحقّق من ذلك مع فريق الحساب الخاص بك قبل البدء. يتطلب إنشاء خدمة أمرين اثنين. ينشئprepare كل شيء على جانبك، بينما يقدّم instances create طلب الإنشاء إلى ClickHouse Cloud عبر نقطة نهاية موصل الخاصة بك. تُنشئ ClickHouse Cloud تعريف خدمة وترسل طلب الإنشاء إلى المنفّذ عبر قناتها الصادرة، فيطبّقه المنفّذ على العنقود الخاص بك ويعيد تقريراً بالنتيجة.
ويحتاج prepare وحده إلى بيانات اعتماد AWS، إذ ينشئ حاويات S3 ودور IAM. أما instances create فيحتاج إلى تهيئة موصل وبيانات اعتماده، ولا يتصل بواجهة برمجة التطبيقات المحلية الخاصة بـ المنفّذ إلا عند استخدام --wait. على جهاز افتراضي، نفّذ كلا الأمرين بصلاحيات root على مضيف موصل. أما على Kubernetes، فنفّذهما من workstation يملك kube context للعنقود المُدار:
- يحتاج
prepareإلى نسخة من تهيئة موصل (--config)، وإلىkubectl port-forwardنحو واجهة برمجة التطبيقات المحلية الخاصة بـ المنفّذ، وإلى--output-dirقابل للكتابة. وهو يتحقق من اسم الخدمة لدى المنفّذ ويرفض العمل إن تعذّر عليه الوصول إليه. - عندما لا تتوفر على هذا المضيف ملفات بيانات الاعتماد التي تحدّدها التهيئة، يقرأها
instances createمن Secrets المسماةclicklink-hmacوclicklink-mtlsويُعلن عن كل عملية قراءة. أضف--connector-namespaceإذا لم تكن مساحة أسماء الـ موصل هيclicklink. وهذا الـ fallback متاح فيinstances createدون غيره.
1
إعداد الخدمة
- Kubernetes
- جهاز افتراضي يعمل بنظام Linux
instances create وأي retry.- الاسم. يختار اسمًا لـ service، أو يتحقق من صحة الاسم الذي تمرّره عبر
--instance <name>. ويُسجَّل الاسم المولَّد في<output-dir>/_prepare/<eks-cluster-name>.nameليستأنفه التشغيل التالي، فتعيد أي محاولة استخدام حاويات ودور التشغيل الأول نفسها. ويختار--new-nameاسمًا آخر. ويرفض الأمر أي اسم لا يزال executor يحتفظ به، أو اسمًا تحتوي مساحة أسمائه بالفعل على عنقود ClickHouse. - التخزين. ينشئ حاويتي البيانات والنسخ الاحتياطي وIAM role باسم
CH-S3-<name>-<region>-00-Role. وأسماء الحاويات الافتراضية هي<cluster>-clickhouse-data-<rand>و<cluster>-clickhouse-backup-<rand>، ويمكن تجاوزها بـ--data-bucketو--backup-bucket. ومع--role-arnيتحقق من دور تُحضره أنت ولا يكتب أي شيء في IAM. - المنح والتطبيق. على جهاز افتراضي، يولّد bundle الوصول الخاص بـ executor لمساحة أسماء service (
ns-<name>)، ويطبّق RBAC الخاص بها، ويسجّل service في registry الخاص بـ executor. أما على Kubernetes فتُتخطى هذه الخطوة، إذ يعمل executor بهوية ServiceAccount الخاصة بجرابه ويسجّل service بنفسه عند وصول طلب الإنشاء. - الملخّص. يولّد كلمة مرور المستخدم
defaultويكتب متن الإنشاء إلى<output-dir>/_prepare/<name>.create.json(بوضع0600؛ وهو لا يحمل سوى تجزئات كلمة المرور). ثم يطبع الأمر التالي في سطرNext:.
--context <name> عندما يحتوي kubeconfig على عدة سياقات؛ ويجب أن يشير السياق إلى عنقود EKS المسمّى في executor.cluster ضمن الإعداد. ويشغّل --dry-run كل خطوة دون إنشاء أو كتابة أي شيء. أما خطوة التجزئة فتستخدم SHA-1، وهي خوارزمية ترفضها Go تحت GODEBUG=fips140=only؛ لذا شغّل prepare على مضيف لا يحمل هذا الإعداد.2
إرسال الإنشاء
- Kubernetes
- جهاز افتراضي يعمل بنظام Linux
prepare مفتوحًا، فالخيار --wait يستطلع executor من خلاله.created <spoken-name> (state provisioning) مع استدلال watch:. و<spoken-name> هو الاسم الذي خصصته ClickHouse Cloud (مثل amberaws-kq-42)، وليس اسم الـ service الذي جهّزته. أما استدلال watch: وجميع أوامر clctl فتستخدم اسم الـ service الخاص بك.إعادة المحاولة بالمدخلات نفسها آمنة. ويُشتق مفتاح إحكام التكرار (idempotency key) افتراضيًا من بيئتك ومن اسم الـ service، ولذلك تُرجع إعادة الإرسال عملية الإنشاء الأولى.يستطلع --wait واجهة برمجة التطبيقات المحلية الخاصة بـ executor كل 10 ثوانٍ إلى أن يصبح الـ service في حالة running، ولمدة تصل إلى --wait-timeout (القيمة الافتراضية 30m). ويفشل سريعًا، مع عرض الـ error المسجَّل، إذا سجّل executor عملية إنشاء فاشلة لهذا الاسم أو إذا تحولت حالة الـ service إلى terminating أو terminated أو stale.3
تحقّق
status هي running. ويستخدم مستخدمها default كلمة المرور التي طبعها الأمر prepare. كما يمكن تمرير --cluster عبر متغيّر البيئة CLCTL_CLUSTER.الحالة
يجيب المنفّذ عن استعلامات الحالة عبر واجهة برمجة التطبيقات المحلية الخاصة به، التي ترتبط بالعنوان127.0.0.1:9999 ولا توفّر أي مصادقة خاصة بها. على جهاز افتراضي، شغّل الأوامر على المضيف. أما على Kubernetes، فافتح إعادة توجيه المنفذ (port-forward) أولًا ثم وجّه الأوامر إليه:
clicklink clctl instances list كل خدمة يعرفها المنفّذ بصيغة JSON. أما clicklink clctl instances get --name <name> --cluster <eks-cluster-name> فيطبع واحدًا منها، مع التخزين الذي أُنشئ به. ويستنتج المنفّذ الحالة من مورد ClickHouseCluster الخاص بالخدمة (نسخ server الجاهزة مقابل المتوقعة) ويحدّثها كل sync_interval (30 ثانية افتراضيًا):
provisioning: لا توجد بعد أي نسخة server جاهزة، أو أنClickHouseClusterلم يُنشأ بعدrunning: جميع نسخ server المتوقعة جاهزةdegraded: بعض نسخ server جاهزة وليس كلهاterminating: المنفّذ بصدد إزالة تثبيت الخدمةterminated: لم تعد مساحة أسماء الخدمة موجودةstale: أُسقطت الخدمة من سجل المنفّذ دون عملية حذف؛ ويتعامل معه كل من--waitوteardownمعاملةterminated
clicklink clctl commands list هذه الأوامر، مع إمكانية تصفيتها بواسطة --status (pending أو running أو completed أو failed) أو --action (create_instance على سبيل المثال) أو --cluster. ويطبع clicklink clctl commands get <id> أمرًا واحدًا مع مرحلته ونتيجته. وتحتوي result الخاصة بالأمر الفاشل على الخطأ: سبب عدم اكتمال عملية الإنشاء، أو أي تحديث منصة ينتظر موافقتك.
دورة حياة الـ خدمة
بعد إنشاء الـ خدمة، تتولى ClickHouse Cloud تشغيله عبر المنفّذ. والأوامر التي ترسلها هي:- Scale. تحدد ClickHouse Cloud عددًا ثابتًا من الـ نسخة متماثلة، ويقيّده إعداد في ClickHouse Cloud (20 في التهيئة الافتراضية). ولا يوجد autoscaling.
- Stop and start. يؤدي الإيقاف إلى تقليص عدد الخوادم إلى صفر مع الإبقاء على Keeper؛ أما البدء فيستعيد أعداد الـ نسخة متماثلة. وتبقى البيانات في حاوياتك طوال الوقت.
- Restart. الـ خدمة بالكامل، أو Keeper الخاص به، أو pod واحد.
- Backups. تطلقها ClickHouse Cloud؛ وتُخزَّن في حاوية النسخ الاحتياطي الخاصة بك، ويؤدي حذف النسخة الاحتياطية إلى إزالتها.
- ترقيات الإصدارات وتغييرات التهيئة. تعيد ClickHouse Cloud توليد تعريف الـ خدمة بالإصدار أو الإعداد الجديد، ويصل ذلك على هيئة أمر
create_instance، لذا يعرضcommands list --action create_instanceالترقيات أيضًا. ويطبّقه المنفّذ ثم ينتظر حتى تصبح الـ نسخة متماثلة جاهزة مجددًا. - Delete. موضّح في حذف خدمة.
running.
أما الأوامر الفرعية instances scale وinstances patch وinstances delete فترسل الأوامر مباشرةً إلى واجهة برمجة التطبيقات المحلية الخاصة بالمنفّذ، متجاوزةً ClickHouse Cloud. ولا تشغّلها إلا عندما يطلب منك فريق حسابك ذلك؛ ويوضّح مرجع CLI وظيفة كل منها.
Support sessions لخدمة مُدارة
يربط الـ المنفّذ الـ scraper بكل خدمة ينشئها، لكنه لا يجهّز الـ مستكشف الأخطاء ومصلحها، لذا لا يمكن لأي support session تشغيل التشخيصات على خدمة مُدارة ما لم تجهّزه بنفسك. جهّزه مرة واحدة لكل خدمة، مع مساحة أسماء الخدمةns-<name>، بالطريقة نفسها المتبعة مع instance سجّلته بنفسك:
- Kubernetes
- جهاز افتراضي يعمل بنظام Linux
$CH_DEFAULT_PASSWORD هي كلمة مرور المستخدم default التي طبعها الأمر prepare. ويصادق بها الأمر لتطبيق أذونات SQL ولا يطلبها منك. ثم أضف زوج الـ Secret والـ ServiceAccount إلى troubleshooter.accessBundles ونفّذ helm upgrade، كما هو موضّح في إضافة ClickHouse instances.--ch-user-via cr لن يبقى: إذ إن ClickHouse Cloud هي مالكة تعريف الخدمة وتعيد تطبيقه. وعند حذف الخدمة، يزيل الـ المنفّذ حزمة الـ مستكشف الأخطاء ومصلحها على الجهاز الافتراضي. أما على Kubernetes فتبقى الـ Secret والـ ServiceAccount الخاصتان بالحزمة إلى أن تحذفهما بنفسك، كما هو مذكور في إلغاء التثبيت.
حذف خدمة
لا يوجد أمر حذف متاح للعميل عبر نقطة نهاية الموصل: اطلب من فريق حسابك حذف الخدمة. تتولّى ClickHouse Cloud إنهاءها، ويحذف المنفّذ عبء العمل ومساحة أسمائه (terminating، ثم terminated). ولا يُمسّ أي شيء في AWS: تبقى الحاويات وبياناتها ودور IAM إلى أن تزيلها بنفسك.
وبمجرد أن تُبلّغ الخدمة عن الحالة terminated، فكّك ما أنشأه prepare. شغّل teardown من المكان نفسه الذي شغّلت فيه prepare، وباستخدام بيانات اعتماد AWS نفسها. وعلى Kubernetes يعني ذلك محطة العمل نفسها، ونسخة التهيئة ودليل المخرجات نفسيهما، وport-forward مفتوحًا إلى المنفّذ:
- Kubernetes
- جهاز افتراضي يعمل بنظام Linux
prepare ويجعل المنفّذ ينسى الخدمة، فيتحرّر الاسم. وعلى جهاز افتراضي، يزيل أيضًا كائنات RBAC الخاصة بالخدمة على مستوى العنقود، وحزمة الوصول المحلية، ومدخل السجل.
وهو يحتفظ افتراضيًا ببيانات الخدمة ونسخها الاحتياطية، ويعيد وسم الحاوية المحتفظ بها من clicklink:deployed-name إلى clicklink:retained-from=<name>، بحيث لا ترثها أبدًا خدمة يُعاد إنشاؤها بالاسم نفسه، ويوضّح الملخّص مكان البيانات. ولحذفها، أضف --delete-data --delete-backups --yes إلى الأمر نفسه.
وبدون --yes يتوقف التشغيل بعد خطوة السجل ويذكر أسماء الحاويات التي كان سيفرغها. أما --dry-run فيقرأ كل شيء ولا يكتب شيئًا. وأي دور أحضرته عبر --role-arn، أو أي حاوية لم ينشئها prepare، يُبلَّغ عنها بوصفها محتفظًا بها ولا تُمسّ إطلاقًا. ويرفض التشغيل العمل ما دامت مساحة أسماء الخدمة لا تزال تحتوي على عنقود ClickHouse. وهو يقرأ كل شيء قبل أن يحذف أي شيء، لذا فإن التشغيل المرفوض لا يغيّر شيئًا.
عندما يكون الـ موصل غير متصل
لا تعتمد الخدمات العاملة على المنفّذ؛ إذ يُبقيها ClickHouse Operator في عنقودك قيد التشغيل، ولا يؤثر انقطاع اتصال الـ موصل في أي شيء يخدم الاستعلامات بالفعل. وطالما لم يكن هناك منفّذ متصل، لا يستطيع ClickHouse Cloud إسناد عمل جديد إليه. أما أوامر الإنشاء أو الحذف أو مزامنة المنصة التي سبق أن قبِلها، فيُحتفظ بها وتُعاد محاولتها: يُعاد الإنشاء لمدة 30 دقيقة من آخر تقرير تقدّم، والحذف لمدة ساعتين، ومزامنة المنصة حتى 10 محاولات. وبعد تجاوز هذا الحد، تُسجّل نقطة نهاية الـ موصل الأمر على أنه فاشل. وأي أمر آخر من أوامر دورة الحياة (التوسيع، الإيقاف، البدء، إعادة التشغيل، النسخ الاحتياطي، حذف النسخة الاحتياطية) يُرفض بدلًا من أن يُوضع في قائمة انتظار. كما يُرفض بالطريقة نفسها أي أمر إنشاء أو حذف تُرسله في أثناء عدم وجود منفّذ متصل؛ فلا تُعاد المحاولة إلا للأوامر المقبولة مسبقًا. أما الأمر الذي قبِله المنفّذ فعلًا، فيستمر حتى اكتماله؛ وتُرسَل عند الاتصال التالي النتيجة التي تعذّر عليه الإبلاغ عنها. فأمرinstances create يتطلب أن تكون نقطة نهاية الـ موصل قابلة للوصول من الـ host الذي يعمل عليه. أما --wait وinstances list وinstances get وcommands list فتحتاج إلى واجهة برمجة التطبيقات المحلية للمنفّذ، أي أن المنفّذ يجب أن يكون قيد التشغيل. وتنتهي صلاحية رمز موافقة المنصة وفق مؤقّته الخاص، بغضّ النظر عن حالة الاتصال؛ راجع نافذة الموافقة.