يتناول هذا القسم بصورة عامة النسخ الاحتياطية وعمليات الاستعادة في ClickHouse. للحصول على وصف أكثر تفصيلًا لكل طريقة من طرق النسخ الاحتياطي، راجع الصفحات المخصصة للطرق المختلفة في الشريط الجانبي.
المقدمة
في حين أن النسخ المتماثل يوفر حماية من أعطال الأجهزة، فإنه لا يوفر حماية من الأخطاء البشرية: الحذف غير المقصود للبيانات، أو حذف الجدول الخطأ أو جدول في العنقود الخطأ، وأخطاء البرمجيات التي تؤدي إلى معالجة غير صحيحة للبيانات أو تلفها. في كثير من الحالات، ستؤثر أخطاء كهذه في جميع النسخ المتماثلة. يتضمن ClickHouse وسائل حماية مدمجة لمنع بعض أنواع الأخطاء، فعلى سبيل المثال، افتراضيًا لا يمكنك ببساطة حذف الجداول التي تستخدم محركًا من عائلةMergeTree وتحتوي على أكثر من
50 غيغابايت من البيانات. ومع ذلك، لا تغطي وسائل الحماية هذه جميع الحالات الممكنة، وقد
تظل المشكلات واردة.
للحد بفعالية من الأخطاء البشرية المحتملة، ينبغي لك أن تُعد بعناية
استراتيجية للنسخ الاحتياطي لبياناتك واستعادتها مسبقًا.
تختلف الموارد المتاحة ومتطلبات الأعمال من شركة إلى أخرى، لذلك
لا يوجد حل شامل واحد للنسخ الاحتياطي والاستعادة في ClickHouse يناسب
كل الحالات. فما يصلح لغيغابايت واحد من البيانات على الأرجح لن يصلح لعشرات
البيتابايتات من البيانات. وهناك مجموعة متنوعة من الأساليب الممكنة، لكل منها مزاياها
وعيوبها، وهي معروضة في هذا القسم من الوثائق. ومن الجيد
استخدام عدة أساليب بدلًا من الاكتفاء بأسلوب واحد، لتعويض أوجه القصور
المختلفة في كل منها.
ضع في اعتبارك أنه إذا أنشأت نسخة احتياطية لشيء ما ولم تحاول استعادته مطلقًا،
فمن المحتمل ألا تعمل الاستعادة على النحو الصحيح عندما تحتاج إليها فعلًا (أو على
الأقل ستستغرق وقتًا أطول مما يمكن للأعمال تحمله). لذا، أيًّا كانت آلية النسخ الاحتياطي
التي تختارها، احرص على أتمتة عملية الاستعادة أيضًا، والتدرّب
عليها بانتظام على عنقود ClickHouse احتياطي.
يمكن للنسخ الاحتياطية أن تكون:
- كاملة أو تزايدية
- متزامنة أو غير متزامنة
- متوازية أو غير متوازية
- مضغوطة أو غير مضغوطة
- تستخدم المجموعات المسماة
- محمية بكلمة مرور
- مأخوذة من جداول النظام أو جداول السجل أو جداول إدارة الوصول
أنواع النسخ الاحتياطية
يمكن أن تكون النسخ الاحتياطية إما كاملة أو تزايدية. فالنسخ الاحتياطية الكاملة تكون نسخة كاملة من البيانات، بينما تتضمن النسخ الاحتياطية التزايدية فقط التغييرات التي طرأت على البيانات منذ آخر نسخة احتياطية كاملة. تمتاز النسخ الاحتياطية الكاملة بأنها وسيلة استرداد بسيطة ومستقلة (عن النسخ الاحتياطية الأخرى) وموثوقة. ومع ذلك، قد يستغرق إكمالها وقتًا طويلًا، وقد تستهلك مساحة كبيرة. أما النسخ الاحتياطية التزايدية، فهي أكثر كفاءة من حيث الوقت والمساحة، لكن استعادة البيانات تتطلب توفر جميع النسخ الاحتياطية. اعتمادًا على احتياجاتك، قد ترغب في استخدام:- النسخ الاحتياطية الكاملة لقواعد البيانات الأصغر أو للبيانات المهمة.
- النسخ الاحتياطية التزايدية لقواعد البيانات الأكبر أو عندما تكون هناك حاجة إلى إجراء النسخ الاحتياطية بشكل متكرر وبأقل تكلفة.
- كليهما، مثلًا نسخ احتياطية كاملة أسبوعية ونسخ احتياطية تزايدية يومية.
النسخ الاحتياطية المتزامنة مقابل غير المتزامنة
يمكن أيضًا تعليم الأمرينBACKUP وRESTORE بـ ASYNC. في هذه الحالة، يعيد
أمر النسخ الاحتياطي النتيجة فورًا، وتعمل عملية النسخ الاحتياطي في الخلفية.
إذا لم يُعلَّم الأمران بـ ASYNC، فستكون عملية النسخ الاحتياطي متزامنة،
ويبقى الأمر قيد الانتظار حتى يكتمل النسخ الاحتياطي.
النسخ الاحتياطية المتوازية وغير المتوازية
يتيح ClickHouse افتراضيًا إجراء النسخ الاحتياطية وعمليات الاستعادة بشكل متوازٍ. وهذا يعني أنه يمكنك بدء عدة عمليات نسخ احتياطي أو استعادة في الوقت نفسه. ومع ذلك، توجد إعدادات على مستوى الخادم تتيح لك تعطيل هذا السلوك. إذا ضبطت هذه الإعدادات على false، فلن يُسمح إلا بتشغيل عملية نسخ احتياطي أو استعادة واحدة فقط على العنقود في كل مرة. ويمكن أن يساعد ذلك في تجنب التنافس على الموارد أو التعارضات المحتملة بين العمليات. لمنع النسخ الاحتياطي/الاستعادة المتوازيين، يمكنك استخدام هذه الإعدادات على التوالي:النسخ الاحتياطية المضغوطة مقابل غير المضغوطة
تدعم النسخ الاحتياطية في ClickHouse الضغط من خلال الإعدادينcompression_method وcompression_level.
عند إنشاء نسخة احتياطية، يمكنك تحديد ما يلي:
استخدام المجموعات المسماة
تتيح لك المجموعات المسماة تخزين أزواج المفتاح والقيمة (مثل بيانات اعتماد S3، ونقاط النهاية، والإعدادات) بحيث يمكن إعادة استخدامها في عمليات النسخ الاحتياطي والاستعادة. وهي تساعد على:- إخفاء بيانات الاعتماد عن المستخدمين الذين لا يملكون امتيازات المسؤول
- تبسيط الأوامر من خلال تخزين التهيئة المعقدة مركزيًا
- الحفاظ على الاتساق عبر العمليات
- تجنب كشف بيانات الاعتماد في سجلات الاستعلام
أخذ نسخ احتياطية من جداول النظام أو السجل أو إدارة الوصول
يمكن أيضًا تضمين جداول النظام في سير عمل النسخ الاحتياطي والاستعادة، لكن يعتمد تضمينها على حالة الاستخدام الخاصة بك. يمكن أخذ نسخ احتياطية من جداول النظام التي تخزّن بيانات تاريخية، مثل تلك التي تحمل اللاحقة_log (على سبيل المثال،
query_log وpart_log)، واستعادتها مثل أي جدول آخر.
إذا كانت حالة الاستخدام لديك تعتمد على تحليل البيانات التاريخية - على سبيل المثال، استخدام query_log
لتتبّع أداء الاستعلامات أو استكشاف المشكلات وإصلاحها - فمن المستحسن تضمين هذه
الجداول في استراتيجية النسخ الاحتياطي. ومع ذلك، إذا لم تكن البيانات التاريخية في هذه الجداول
مطلوبة، فيمكن استبعادها لتوفير مساحة تخزين النسخ الاحتياطية.
تخضع جداول النظام المرتبطة بإدارة الوصول، مثل users وroles وrow_policies و
settings_profiles وquotas، لمعالجة خاصة أثناء عمليات النسخ الاحتياطي والاستعادة.
فعند تضمين هذه الجداول في نسخة احتياطية، يُصدَّر محتواها إلى ملف خاص
accessXX.txt، يتضمّن تعليمات SQL المكافئة لإنشاء
كيانات الوصول وتهيئتها. وعند الاستعادة، تقوم عملية الاستعادة
بتفسير هذه الملفات وإعادة تطبيق أوامر SQL لإعادة إنشاء المستخدمين،
والأدوار، والتهيئات الأخرى. وتضمن هذه الميزة إمكانية
أخذ نسخة احتياطية من تهيئة التحكم في الوصول
في عنقود ClickHouse واستعادتها كجزء من
الإعداد العام للعنقود.
لا تعمل هذه الوظيفة إلا مع التهيئات المُدارة من خلال أوامر SQL
(ويُشار إليها باسم “إدارة التحكم في الوصول والحسابات المعتمدة على SQL”).
أما تهيئات الوصول المعرّفة في ملفات تهيئة خادم ClickHouse (مثل users.xml)
فلا تُضمَّن في النسخ الاحتياطية ولا يمكن استعادتها بهذه الطريقة.
البنية العامة
ملخص الأوامر
يُفصَّل أدناه كل أمر من الأوامر المذكورة أعلاه:نسخ جدول احتياطيًا دون بياناته
تُدرجEXCEPT DATA FROM {TABLE|TABLES} تعريف الجدول في النسخة الاحتياطية دون صفوفه. وتفيد
مع الجداول التي يمكن إعادة توليد محتوياتها بعد الاستعادة، مثل جداول الهدف للعروض
المُجسَّدة.
تحدّد العبارة ما تكتبه BACKUP، لكنها لا تغيّر ما تستطيع RESTORE فعله بالنسخة الناتجة. فإذا
كان بإمكان RESTORE إعادة إنشاء جدول، فإن استعادة تعريفه دون صفوف تُنشئ جدولًا فارغًا. ولا تجعل العبارة
جدولًا قابلًا للاستعادة إذا لم يكن كذلك أصلًا؛ فإمكان تحويل تعريفه في النسخة الاحتياطية
إلى جدول مجددًا يتوقف على المحرك، وبعض المحركات لا تدعم ذلك إطلاقًا: راجع
المحركات التي لا تستطيع RESTORE إعادة إنشائها.
يقتصر نطاق العبارة على العنصر الذي تُكتب عليه:
- إذا استُخدمت مع عنصر
DATABASEأوALL، فيمكنها تحديد أي جدول يشمله ذلك العنصر في النسخة الاحتياطية:
table أو dictionary أو view أو database أو all: إذ يُقرأ الاسم غير المقتبس بعد
الفاصلة على أنه بداية العنصر التالي.
- في العنصر الذي يخص كائنًا واحدًا (
TABLE،DICTIONARY،VIEW،TEMPORARY TABLE)، لا يقع ضمن نطاقه سوى كائن ذلك العنصر، لذا يجب أن تذكره العبارة وحده. خصّص لكل جدول عنصرًا وعبارةً خاصين به:
EXCEPT DATA FROM في عنصر أوسع،
فإن بياناته تُنسخ احتياطيًا: فطلب الجدول في عنصر مستقل يشمل طلب بياناته. وهذا يتفق مع سلوك EXCEPT TABLES،
إذ يُنسخ الجدول المذكور صراحةً احتياطيًا حتى لو استثناه عنصر أوسع.
تُستثنى بيانات الجدول الداخلي لعرض مُجسَّد (أو الجداول الداخلية لجدول TimeSeries)
باستخدام اسم الكائن الخارجي؛ فالعبارة لا تقبل أسماء الجداول الداخلية.
لا تُستخدم EXCEPT DATA FROM {TABLE|TABLES} إلا مع BACKUP. أما RESTORE فيرفضها، بدلًا من قبولها
بوصفها عملية بلا أثر.
المحركات التي لا يستطيع RESTORE إعادة إنشائها
لا يستطيع RESTORE إعادة إنشاء بعض المحركات إطلاقًا، سواء استُخدمت عبارة EXCEPT DATA FROM {TABLE|TABLES} أم لا. وفي
هذه الحالات، تظل العبارة تحدد حجم النسخة الاحتياطية، لكنها لا تعني استعادة جدول
فارغ؛ فلا يُستعاد الجدول أصلًا، لأن RESTORE يرفض إنشاءه.
ومن أبرز هذه الحالات جدول MaterializedPostgreSQL المستقل. فبمجرد إنشائه، سيبدأ نسخ البيانات من مصدر
PostgreSQL النشط، ما يؤدي إلى خلط لقطة النسخة الاحتياطية بالحالة الحالية للمصدر البعيد. لذلك
يرفض RESTORE إنشاءه في مصنع التخزين، قبل إنشاء الجدول، مع الخطأ NOT_IMPLEMENTED. وهذه
خاصية للمحرك تنطبق أيضًا على النسخ الاحتياطي الكامل المعتاد.
الطريقة المدعومة هي الاستعادة باسم مختلف إلى جدول يستخدم محرك ReplacingMergeTree، تكون قد أنشأته
مسبقًا ببنية الجدول المتداخل (بما في ذلك العمودان _sign و_version):
allow_different_table_def لأن التعريف المخزَّن في النسخة الاحتياطية يستخدم
المحرك MaterializedPostgreSQL، بينما تجري استعادته عمدًا إلى جدول ReplacingMergeTree عادي.
أما من دون EXCEPT DATA FROM TABLE، فإن أمر RESTORE نفسه ينقل الصفوف أيضًا بدلًا من ذلك.
الإعدادات
إعدادات النسخ الاحتياطي والاستعادة العامة
إعدادات خاصة بـ S3
إعدادات خاصة بـ Azure
الإدارة واستكشاف الأخطاء وإصلاحها
يعيد أمر النسخ الاحتياطيid وstatus، ويمكن استخدام هذا الـid
للحصول على حالة النسخ الاحتياطي. ويُعد هذا مفيدًا جدًا للتحقق من تقدّم عمليات
النسخ الاحتياطي ASYNC الطويلة. يوضّح المثال أدناه فشلًا حدث عند محاولة
استبدال ملف نسخ احتياطي موجود:
system.backups، تُسجَّل أيضًا جميع عمليات النسخ الاحتياطي والاستعادة في جدول سجل النظام
system.backup_log: