Skip to main content

لا ينطبق هذا الموضوع على ClickHouse Cloud، حيث تعمل النسخ المتماثلة المتوازية مثل عدة شظايا في عناقيد ClickHouse التقليدية من نوع shared-nothing، ويحل التخزين الكائني محل النسخ المتماثلة، بما يضمن التوافر العالي وتحمّل الأعطال.

ما هي شظايا الجداول في ClickHouse؟

في مجموعات ClickHouse التقليدية ذات معمارية shared-nothing، يُستخدم التشذير عندما ① تكون البيانات أكبر من أن يستوعبها خادم واحد، أو ② يكون الخادم الواحد بطيئًا جدًا في معالجة البيانات. يوضّح الشكل التالي الحالة ①، حيث يتجاوز جدول uk_price_paid_simple سعة جهاز واحد:
في هذه الحالة، يمكن تقسيم البيانات عبر عدة خوادم ClickHouse على شكل شظايا جدول:
تحتوي كل شظية على مجموعة فرعية من البيانات، وتعمل كجدول ClickHouse عادي يمكن الاستعلام عنه بشكل مستقل. لكن الاستعلامات لن تعالج سوى تلك المجموعة الفرعية، وقد يكون ذلك مناسبًا بحسب توزيع البيانات. وعادةً ما يوفّر جدول موزّع (غالبًا واحدًا لكل خادم) عرضًا موحّدًا لمجموعة البيانات الكاملة. وهو لا يخزّن البيانات بنفسه، بل يمرّر استعلامات SELECT إلى جميع الشظايا، ويجمّع النتائج، ويوجّه عمليات INSERTS لتوزيع البيانات بالتساوي.

إنشاء جدول موزّع

لتوضيح إعادة توجيه استعلامات SELECT ومسار INSERT، سنستخدم جدول المثال ما هي أجزاء الجدول الموزّع على شظيتين عبر خادمي ClickHouse. أولًا، نعرض تعليمة DDL لإنشاء جدول موزّع المقابل لهذا الإعداد:
يجعل البند ON CLUSTER عبارة DDL موزعة، ويُوجّه ClickHouse إلى إنشاء الجدول على جميع الخوادم المُدرجة في تعريف العنقود test_cluster. وتتطلب DDL الموزعة مكوّن Keeper إضافيًا في معمارية العنقود. بالنسبة إلى معلمات المحرك الموزع، نحدد اسم العنقود (test_cluster)، واسم قاعدة البيانات (uk) للجدول الهدف المُجزّأ، واسم الجدول الهدف المُجزّأ (uk_price_paid_simple)، ومفتاح التجزئة لتوجيه INSERT. في هذا المثال، نستخدم الدالة rand لإسناد الصفوف إلى الشظايا عشوائيًا. ومع ذلك، يمكن استخدام أي تعبير — حتى التعبيرات المعقدة — كمفتاح تجزئة، بحسب حالة الاستخدام. يوضح القسم التالي كيفية عمل توجيه INSERT.

توجيه INSERT

يوضح المخطط أدناه كيفية معالجة عمليات INSERT إلى جدول موزّع في ClickHouse:
① يُرسَل INSERT (يتضمن صفًا واحدًا) يستهدف الجدول الموزّع إلى خادم ClickHouse يستضيف الجدول، إما مباشرةً أو عبر موازن تحميل. ② لكل صف من INSERT (صف واحد فقط في مثالنا)، يقيّم ClickHouse مفتاح التجزئة (هنا، rand())، ثم يحسب باقي قسمة النتيجة على عدد خوادم الشظايا، ويستخدم الناتج بوصفه معرّف الخادم الهدف (تبدأ المعرّفات من 0 وتزداد بمقدار 1). بعد ذلك، يُمرَّر الصف ثم ③ يُدرَج في الشظية المقابلة من الجدول على ذلك الخادم. يشرح القسم التالي كيفية عمل إعادة توجيه SELECT.

إعادة توجيه SELECT

يوضح هذا المخطط كيفية معالجة استعلامات SELECT باستخدام جدول موزّع في ClickHouse:
① يُرسَل استعلام SELECT تجميعي يستهدف الجدول الموزّع إلى خادم ClickHouse المعني، إما مباشرةً أو عبر موازن تحميل. ② يمرّر جدول موزّع الاستعلام إلى جميع الخوادم التي تستضيف شظايا الجدول الهدف، حيث يحسب كل خادم ClickHouse نتيجة التجميع المحلية الخاصة به بالتوازي. بعد ذلك، يجمع خادم ClickHouse الذي يستضيف الجدول الموزّع المستهدف في البداية ③ جميع النتائج المحلية، ثم ④ يدمجها في النتيجة العامة النهائية، و⑤ يعيدها إلى مُرسِل الاستعلام.

ما هي النسخ المتماثلة للجداول في ClickHouse؟

يضمن النسخ المتماثل في ClickHouse تكامل البيانات والتبديل عند الفشل من خلال الاحتفاظ بنسخ من بيانات الشظايا على عدة خوادم. ونظرًا إلى أن أعطال الأجهزة أمر لا مفر منه، فإن النسخ المتماثل يمنع فقدان البيانات عبر ضمان وجود عدة نسخ متماثلة لكل شظية. ويمكن توجيه عمليات الكتابة إلى أي نسخة متماثلة، إما مباشرةً أو عبر جدول موزّع، الذي يختار نسخة متماثلة لتنفيذ العملية. وتُمرَّر التغييرات تلقائيًا إلى النسخ المتماثلة الأخرى. وفي حال حدوث عطل أو أثناء الصيانة، تظل البيانات متاحة على النسخ المتماثلة الأخرى، وبمجرد تعافي المضيف المتعطل، يتزامن تلقائيًا ليظل محدَّثًا. لاحظ أن النسخ المتماثل يتطلب مكوّن Keeper ضمن معمارية العنقود. يوضح المخطط التالي عنقود ClickHouse يضم ستة خوادم، حيث إن الشظيتين Shard-1 وShard-2 من الجدول، اللذين قُدِّما سابقًا، يمتلك كلٌّ منهما ثلاث نسخ متماثلة. ويُرسَل استعلام إلى هذا العنقود:
تعمل معالجة الاستعلام بصورة مماثلة للإعدادات التي لا تحتوي على نسخ متماثلة، إذ لا ينفّذ الاستعلام سوى نسخة متماثلة واحدة من كل شظية.
لا تضمن النسخ المتماثلة تكامل البيانات والتبديل عند الفشل فحسب، بل تحسّن أيضًا إنتاجية معالجة الاستعلامات عبر السماح بتشغيل عدة استعلامات بالتوازي على نسخ متماثلة مختلفة.
① يُرسَل الاستعلام الذي يستهدف الجدول الموزّع إلى خادم ClickHouse المعني، إما مباشرةً أو عبر موازن تحميل. ② يمرّر الجدول الموزّع الاستعلام إلى نسخة متماثلة واحدة من كل شظية، حيث يحسب كل خادم ClickHouse يستضيف النسخة المتماثلة المحددة نتيجة استعلامه المحلية بالتوازي. ويعمل ما تبقّى بالطريقة نفسها كما في الإعدادات التي لا تحتوي على نسخ متماثلة، لذلك لا يظهر في المخطط أعلاه. ويجمع خادم ClickHouse الذي يستضيف الجدول الموزّع المستهدف في البداية جميع النتائج المحلية، ويدمجها في النتيجة العامة النهائية، ثم يعيدها إلى مُرسِل الاستعلام. لاحظ أن ClickHouse يتيح ضبط استراتيجية تمرير الاستعلام في الخطوة ②. وافتراضيًا — بخلاف ما هو موضح في المخطط أعلاه — يفضّل الجدول الموزّع نسخة متماثلة محلية إن كانت متاحة، لكن يمكن استخدام استراتيجيات أخرى لموازنة الحمل.

أين يمكن العثور على مزيد من المعلومات

للمزيد من التفاصيل التي تتجاوز هذه المقدمة العامة حول شظايا الجداول والنسخ المتماثلة، راجع دليل النشر والتوسّع. كما نوصي بشدة بمشاهدة فيديو الدليل العملي هذا للتعمق أكثر في شظايا ClickHouse ونسخه المتماثلة:
آخر تعديل في ٢٣ يوليو ٢٠٢٦