يمكن أن تتسبب لقطات ClickHouse Keeper التالفة أو غير الصالحة في حدوث قدر كبير من عدم استقرار النظام، مثل عدم اتساق البيانات الوصفية، أو تحول الجداول إلى حالة read-only، أو استنزاف الموارد، أو فشل النسخ الاحتياطية. تتناول هذه المقالة ما يلي:
- ما هي اللقطات وأين يمكن العثور عليها
- كيف تتجلى المشكلة
- استراتيجيات التعافي الممكنة وما الذي تعنيه كل منها
لمحة عامة عن لقطات Keeper
ما هي اللقطة؟
اللقطة هي حالة مُسلسلة لبيانات Keeper الداخلية (مثل البيانات الوصفية الخاصة بالمجموعات العنقودية، ومسارات تنسيق الجداول، والتهيئات) في نقطة زمنية محددة. وتُعد اللقطات بالغة الأهمية لإعادة مزامنة عُقد Keeper داخل المجموعة العنقودية، واستعادة البيانات الوصفية أثناء حالات الفشل، ولدعم عمليات بدء التشغيل أو إعادة التشغيل التي تعتمد على حالة سليمة ومعروفة لـ Keeper.
أين يمكنني العثور على اللقطات؟
تُخزَّن اللقطات كملفات على نظام الملفات المحلي لعُقد Keeper. افتراضيًا، تُحفَظ في /var/lib/clickhouse/coordination/snapshots/، أو في المسار المخصّص الذي تحدّده snapshot_storage_path في ملف keeper_server.xml. وتُسمّى اللقطات بأرقام متزايدة (على سبيل المثال: snapshot.23)، بحيث تحمل اللقطات الأحدث أرقامًا أكبر.
في المجموعات متعددة العُقد، تكون لكل عقدة Keeper دليل لقطات خاص بها.
الأعراض والمظاهر الرئيسية لتلف لقطات Keeper
يوضح الجدول أدناه بعض الأعراض والمظاهر الشائعة لتلف لقطات Keeper:
| الفئة | نوع المشكلة | ما الذي يجب البحث عنه |
|---|---|---|
| مشكلات تشغيلية | وضع القراءة فقط | تتحول الجداول بشكل غير متوقع إلى وضع القراءة فقط |
| فشل الاستعلامات | فشل متكرر في الاستعلامات مع أخطاء Coordination::Exception |
|
| تلف البيانات الوصفية | بيانات وصفية قديمة | لا تنعكس الجداول المحذوفة؛ وفشل في العمليات بسبب بيانات وصفية قديمة |
| زيادة الحمل على الموارد | استنفاد موارد النظام | تستهلك عُقد Keeper قدرًا مفرطًا من CPU أو الذاكرة أو مساحة القرص؛ مع احتمال حدوث انقطاع في الخدمة |
| امتلاء القرص | امتلاء القرص أثناء إنشاء اللقطة | |
| النسخ الاحتياطي والاستعادة | فشل النسخ الاحتياطي | تفشل النسخ الاحتياطية بسبب بيانات وصفية مفقودة أو غير متسقة في Keeper |
| إنشاء اللقطات/نقلها | تعطل Keeper | يتعطل Keeper أثناء إنشاء اللقطة (ابحث عن أخطاء "SEGFAULT") |
| تلف نقل اللقطة | حدوث تلف أثناء نقل اللقطة بين النسخ المتماثلة | |
| حالة سباق | حالة سباق أثناء ضغط السجل - وصول خيط commit في الخلفية إلى سجلات محذوفة | |
| مزامنة الشبكة | مشكلات في الشبكة تمنع مزامنة اللقطة من العقدة القائدة إلى العقد التابعة |
مؤشرات السجل:
قبل تشخيص تلف اللقطة، تحقق من سجلات Keeper بحثًا عن أنماط أخطاء محددة:
| نوع السجل | ما الذي يجب البحث عنه |
|---|---|
| أخطاء تلف اللقطة | • Aborting because of failure to load from latest snapshot with index• Failure to load from latest snapshot with index {}: {}. Manual intervention is necessary for recovery• Failed to preprocess stored log at index {}, aborting to avoid inconsistent state• فشل في تسلسل اللقطات أو تحميلها أثناء بدء التشغيل |
| مشكلات Keeper الأخرى | • Coordination::Exception• Zookeeper::Session Timeout• مشكلات في المزامنة أو الانتخاب • حالات سباق أثناء ضغط السجل |
التعافي من لقطات Keeper التالفة
قبل التعامل مع أي ملفات، احرص دائمًا على ما يلي:
- أوقف جميع عُقد Keeper لمنع تفاقم التلف
- أنشئ نسخة احتياطية من كل شيء عبر نسخ دليل التنسيق بالكامل إلى موقع آمن
- تحقّق من نصاب العنقود للتأكد من أن عقدة واحدة على الأقل تحتوي على بيانات سليمة
1. الاستعادة من نسخة احتياطية موجودة
ينبغي اتباع هذه العملية إذا:
- كان تلف البيانات الوصفية أو اللقطات في Keeper يجعل البيانات الحالية غير قابلة للاستعادة.
- كانت هناك نسخة احتياطية تتضمن حالة سليمة ومعروفة لـ Keeper.
اتبع الخطوات التالية لاستعادة نسخة احتياطية موجودة:
- حدِّد أحدث نسخة احتياطية وتحقّق من اتساق البيانات الوصفية فيها.
- أوقف خدمتي ClickHouse وKeeper.
- استبدل اللقطات والسجلات التالفة بتلك الموجودة في دليل النسخة الاحتياطية.
- أعد تشغيل عنقود Keeper وتحقّق من مزامنة البيانات الوصفية.
2. التراجع إلى لقطة أقدم
يجب اتباع هذه العملية في الحالات التالية:
- تكون اللقطات الحديثة تالفة، بينما تظل اللقطات الأقدم قابلة للاستخدام.
- تكون السجلات التزايدية سليمة، بما يتيح استردادًا متسقًا.
اتبع الخطوات التالية للتراجع إلى لقطة أقدم:
- حدِّد واختر لقطة أقدم صالحة (مثلًا، snapshot.19) من دليل Keeper.
- أزل اللقطات والسجلات الأحدث.
- أعد تشغيل Keeper لكي يعيد تطبيق السجلات ويُعيد بناء حالة البيانات الوصفية.
3. استعادة البيانات الوصفية باستخدام SYSTEM RESTORE REPLICA
يُوصى باتباع هذه العملية في الحالات التالية:
- عند فقدان البيانات الوصفية في Keeper أو تلفها، مع بقاء بيانات الجدول موجودة على القرص
- عند انتقال الجداول إلى وضع القراءة فقط بسبب فقدان البيانات الوصفية في ZooKeeper/Keeper
- عندما تحتاج إلى إعادة إنشاء البيانات الوصفية في Keeper استنادًا إلى أجزاء البيانات المتوفرة محليًا
اتبع الخطوات التالية لاستعادة البيانات الوصفية:
-
تحقّق من وجود بيانات الجدول محليًا في مسار بيانات clickHouse-server، والمحدَّد بواسطة
<path>في config. (المسار الافتراضي هو/var/lib/clickhouse/data/) -
لكل جدول متأثر، نفّذ:
SYSTEM RESTART REPLICA [db.]table_name;
SYSTEM RESTORE REPLICA [db.]table_name;- للتعافي على مستوى قاعدة البيانات (إذا كنت تستخدم محرك قاعدة البيانات Replicated):
SYSTEM RESTORE DATABASE REPLICA db_name;- انتظر حتى يكتمل التزامن:
SYSTEM SYNC REPLICA [db.]table_name;- تحقّق من نجاح التعافي عبر فحص
system.replicasللتأكد من أنis_readonly = 0، ومراقبةsystem.detached_parts
4. حذف بيانات تعريف النسخة المتماثلة في Keeper وإعادة إنشائها
يجب اتباع هذه العملية في الحالات التالية:
- إذا كان الخطأ يحدث في نسخة متماثلة واحدة من العنقود وكانت بيانات التعريف الخاصة بها في Keeper تالفة أو غير متسقة
- إذا واجهت أخطاء مثل "Part XXXXX intersects previous part YYYYY"
- إذا كنت بحاجة إلى إعادة تعيين بيانات تعريف النسخة المتماثلة في Keeper بالكامل مع الحفاظ على البيانات المحلية
اتبع الخطوات التالية لحذف بيانات التعريف وإعادة إنشائها:
- على النسخة المتماثلة المتأثرة، افصل الجدول:
DETACH TABLE [db.]table_name;- أزل البيانات الوصفية للنسخة المتماثلة من Keeper (نفّذ ذلك على أي نسخة متماثلة):
SYSTEM DROP REPLICA 'replica_name' FROM ZKPATH '/clickhouse/tables/{shard}/table_name';للعثور على مسار ZooKeeper الصحيح:
SELECT zookeeper_path, replica_name FROM system.replicas WHERE table = 'table_name';- أعِد إرفاق الجدول (سيكون في وضع القراءة فقط):
ATTACH TABLE [db.]table_name;- استعِد البيانات الوصفية للنسخة المتماثلة:
SYSTEM RESTORE REPLICA [db.]table_name;- زامِن مع النسخ المتماثلة الأخرى:
SYSTEM SYNC REPLICA [db.]table_name;- تحقّق من
system.detached_partsعلى جميع النسخ المتماثلة بعد الاستعادة
بديل: استخدام علامة force_restore_data
للاستعادة التلقائية لجميع الجداول المتماثلة عند بدء تشغيل الخادم:
- أوقِف خادم ClickHouse
- أنشئ علامة الاستعادة:
sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data- شغّل خادم ClickHouse
- سيحذف الخادم العلامة تلقائيًا ويستعيد جميع الجداول المُكرَّرة
- راقب السجلات لمتابعة تقدّم التعافي
يفيد هذا النهج عندما تحتاج عدة جداول إلى الاستعادة في الوقت نفسه.
5. إعادة بناء مجموعة Keeper
يجب اتباع هذه العملية في الحالات التالية:
- عدم توفر أي لقطات أو سجلات أو نسخ احتياطية صالحة للاسترداد.
- الحاجة إلى إعادة إنشاء مجموعة Keeper بالكامل وبياناتها الوصفية.
اتبع الخطوات التالية لإعادة بناء مجموعة Keeper:
- أوقف مجموعتَي ClickHouse وKeeper بالكامل.
- أعد ضبط كل عقدة في Keeper بتنظيف أدلة اللقطات والسجلات.
- هيّئ عقدة واحدة في Keeper لتكون leader، ثم أضف العقد الأخرى بالتدريج.
- أعد استيراد البيانات الوصفية إذا كانت متاحة من سجلات خارجية.