Skip to main content
في هذا المثال، ستتعلم كيفية إعداد عنقود ClickHouse بسيط قابل للتوسّع. هناك خمسة خوادم مُعدّة. يُستخدم اثنان منها لتجزئة البيانات. وتُستخدم الخوادم الثلاثة الأخرى للتنسيق.
تظهر أدناه معمارية العنقود الذي ستقوم بإعداده:
على الرغم من إمكانية تشغيل ClickHouse Server وClickHouse Keeper معًا على الخادم نفسه، فإننا نوصي بشدة باستخدام مضيفات مخصصة لـ ClickHouse Keeper في بيئات production، وهذا هو النهج الذي سنوضحه في هذا المثال.يمكن أن تكون خوادم Keeper أصغر حجمًا، وعادةً ما تكون 4GB RAM كافية لكل خادم Keeper إلى أن تكبر ClickHouse Servers.

المتطلبات الأساسية

1

إعداد بنية الدليل وبيئة الاختبار

ملفات المثالتوضح لك الخطوات التالية كيفية إعداد العنقود من الصفر. إذا كنت تفضل تخطي هذه الخطوات والانتقال مباشرةً إلى تشغيل العنقود، فيمكنك الحصول على ملفات المثال من مستودع الأمثلة مجلد ‘docker-compose-recipes’.
في هذا الدليل العملي، ستستخدم Docker compose لإعداد مجموعة ClickHouse. يمكن تعديل هذا الإعداد ليعمل على أجهزة محلية منفصلة، أو أجهزة افتراضية، أو نسخ سحابية كذلك.شغّل الأوامر التالية لإعداد بنية الدليل لهذا المثال:
أضف ملف docker-compose.yml التالي إلى دليل cluster_2S_1R:
docker-compose.yml
أنشئ المجلدات الفرعية والملفات التالية:
  • يحتوي الدليل config.d على ملف إعدادات خادم ClickHouse ‏config.xml، حيث تُحدَّد الإعدادات المخصصة لكل عقدة ClickHouse. وتُدمَج هذه الإعدادات مع ملف إعدادات ClickHouse الافتراضي config.xml الذي يأتي مع كل عملية تثبيت لـ ClickHouse.
  • يحتوي الدليل users.d على ملف إعدادات المستخدم users.xml، حيث تُحدَّد الإعدادات المخصصة للمستخدمين. وتُدمَج هذه الإعدادات مع ملف إعدادات ClickHouse الافتراضي users.xml الذي يأتي مع كل عملية تثبيت لـ ClickHouse.
أدلة الإعدادات المخصصةمن أفضل الممارسات استخدام الدليلين config.d وusers.d عند كتابة إعداداتك الخاصة، بدلًا من تعديل الإعدادات الافتراضية مباشرةً في /etc/clickhouse-server/config.xml وetc/clickhouse-server/users.xml.السطر
يضمن أن أقسام الإعدادات المحددة في الدليلين config.d وusers.d تحلّ محل أقسام الإعدادات الافتراضية المحددة في الملفين الافتراضيين config.xml وusers.xml.
2

تهيئة عقد ClickHouse

إعداد الخادم

قم الآن بتعديل كل ملف تهيئة فارغ config.xml الموجود في fs/volumes/clickhouse-{}/etc/clickhouse-server/config.d. يجب تغيير الأسطر المُمَيَّزة أدناه بحيث تكون مخصصة لكل عقدة:
يُشرح كل قسم من أقسام ملف الإعداد أعلاه بمزيد من التفاصيل في ما يلي.

الشبكة والتسجيل

يُفعَّل الاتصال الخارجي عبر واجهة الشبكة من خلال تفعيل إعداد listen host. ويضمن ذلك أن يكون خادم ClickHouse قابلاً للوصول من قِبل المضيفات الأخرى:
تم ضبط منفذ واجهة برمجة تطبيقات HTTP على 8123:
يُضبط منفذ TCP المستخدم للتواصل عبر البروتوكول الأصلي لـ ClickHouse بين clickhouse-client وأدوات ClickHouse الأصلية الأخرى، وبين clickhouse-server وخوادم clickhouse-server الأخرى على 9000:
يُعرَّف التسجيل في كتلة <logger>. يوفر لك مثال الإعداد هذا سجل تصحيح يُدوَّر عند 1000M ثلاث مرات:
لمزيد من المعلومات حول تهيئة التسجيل، راجع التعليقات المضمّنة في ملف التهيئة الافتراضي لـ ClickHouse.

تهيئة الكلستر

يتم ضبط إعداد الكتلة في القسم <remote_servers>. هنا يُحدَّد اسم الكتلة cluster_2S_1R.يُعرِّف الكتلة <cluster_2S_1R></cluster_2S_1R> تخطيط الكلستر باستخدام إعدادَي <shard></shard> و<replica></replica>، ويعمل كقالب لاستعلامات DDL الموزَّعة، وهي الاستعلامات التي تُنفَّذ عبر الكلستر باستخدام جملة ON CLUSTER. تكون استعلامات DDL الموزَّعة مسموحاً بها افتراضياً، غير أنه يمكن تعطيلها عبر الإعداد allow_distributed_ddl_queries.يُترك internal_replication مضبوطاً على false بشكل افتراضي نظراً لوجود نسخة واحدة فقط لكل جزء.
لكل خادم، تُحدَّد المعلمات التالية:

تهيئة Keeper

يُحدِّد القسم <ZooKeeper> لـ ClickHouse موقع تشغيل ClickHouse Keeper (أو ZooKeeper). نظرًا لاستخدامنا Keeper cluster، يجب تحديد كل <node> من عقد الـ cluster، مع اسم الـ hostname ورقم المنفذ الخاص به باستخدام الوسمَين <host> و<port> على التوالي.سيُشرح إعداد ClickHouse Keeper في الخطوة التالية من الدليل العملي.
على الرغم من أنه يمكن تشغيل ClickHouse Keeper على الخادم نفسه الذي يعمل عليه ClickHouse Server، فإننا نوصي بشدة، في بيئات الإنتاج، بتشغيل ClickHouse Keeper على مضيفات مخصصة.

تهيئة الماكرو

بالإضافة إلى ذلك، يُستخدم قسم <macros> لتعريف استبدالات المعاملات للجداول المُتماثلة. وتُدرج هذه الاستبدالات في system.macros، مما يتيح استخدام استبدالات مثل {shard} و{replica} في الاستعلامات.
سيُحدَّد كلٌّ منها بشكل مختلف بحسب بنية العنقود.

تهيئة المستخدم

عدِّل الآن كل ملف تهيئة فارغ users.xml الموجود في fs/volumes/clickhouse-{}/etc/clickhouse-server/users.d بالمحتوى التالي:
/users.d/users.xml
في هذا المثال، تم تكوين المستخدم default بدون كلمة مرور لتبسيط الإعداد. في التطبيق الفعلي، لا يُنصح بهذا الأسلوب.
في هذا المثال، يكون كل ملف users.xml مطابقًا للآخر على جميع العقد في العنقود.
3

تكوين ClickHouse Keeper

إعداد ClickHouse Keeper

لكي يعمل النسخ المتماثل، يجب إعداد عنقود ClickHouse Keeper وتهيئته. يوفّر ClickHouse Keeper نظام التنسيق لنسخ البيانات المتماثل، إذ يعمل كبديل مباشر لـ ZooKeeper، الذي يمكن استخدامه أيضًا. ومع ذلك، يُوصى باستخدام ClickHouse Keeper لأنه يوفّر ضمانات أفضل وموثوقية أعلى ويستخدم موارد أقل من ZooKeeper. ولتحقيق التوافر العالي والحفاظ على quorum، يُوصى بتشغيل ثلاث عقد ClickHouse Keeper على الأقل.
يمكن تشغيل ClickHouse Keeper على أي عقدة في العنقود إلى جانب ClickHouse، رغم أنه يُوصى بتشغيله على عقدة مخصصة، مما يتيح التوسّع وإدارة عنقود ClickHouse Keeper بشكل مستقل عن عنقود قاعدة البيانات.
أنشئ ملفات keeper_config.xml لكل عقدة ClickHouse Keeper باستخدام الأمر التالي من جذر مجلد المثال:
عدِّل ملفات التكوين الفارغة التي أُنشئت في دليل كل عقدة fs/volumes/clickhouse-keeper-{}/etc/clickhouse-keeper. يجب تعديل الأسطر المظللة أدناه بحيث تكون خاصة بكل عقدة:
/clickhouse-keeper/keeper_config.xml
سيحتوي كل ملف تهيئة على التكوين الفريد التالي (كما هو موضح أدناه). يجب أن يكون server_id المستخدم فريدًا لتلك العقدة المحددة من ClickHouse Keeper ضمن العنقود، وأن يطابق <id> الخاص بالخادم المعرّف في قسم <raft_configuration>. يمثل tcp_port المنفذ الذي يستخدمه عملاء ClickHouse Keeper.
يُستخدم القسم التالي لتكوين الخوادم المشاركة في النصاب ضمن خوارزمية إجماع Raft:
ClickHouse Cloud يسهّل الإدارةClickHouse Cloud يخفف العبء التشغيلي المرتبط بإدارة الأجزاء والنُسخ المتماثلة. تتولى المنصة تلقائيًا الإتاحة العالية والنسخ المتماثل وقرارات التوسّع. وتكون موارد الحوسبة والتخزين منفصلة، وتتوسع بحسب الطلب من دون الحاجة إلى إعداد يدوي أو صيانة مستمرة.اقرأ المزيد
4

اختبر الإعداد

تأكد من أن Docker قيد التشغيل على جهازك. ابدأ تشغيل الـcluster باستخدام الأمر docker-compose up من جذر الدليل cluster_2S_1R:
من المفترض أن ترى docker يبدأ بسحب صور ClickHouse وKeeper، ثم تشغيل الحاويات:
للتأكد من أن الـcluster يعمل، اتصل بأحد clickhouse-01 أو clickhouse-02 ونفّذ الاستعلام التالي. يرد أدناه أمر الاتصال بالعقدة الأولى:
إذا نجح الأمر، فسترى موجّه أوامر ClickHouse client:
نفّذ الاستعلام التالي للتحقّق من بُنى العناقيد المعرّفة ولأيّ مضيفين تم تعريفها:
Query
Response
نفّذ الاستعلام التالي للتحقق من حالة مجموعة ClickHouse Keeper:
Query
Response
يُستخدم الأمر mntr أيضًا على نطاق واسع للتحقق من أن ClickHouse Keeper قيد التشغيل، وللحصول على معلومات عن حالة العلاقة بين عقد Keeper الثلاث. في الإعداد المستخدم في هذا المثال، هناك ثلاث عقد تعمل معًا. ستنتخب هذه العقد قائدًا، وستكون العقد المتبقية عقدًا تابعة.يوفّر الأمر mntr معلومات متعلقة بالأداء، ويُبيّن أيضًا ما إذا كانت عقدة معيّنة تابعة أم قائدًا.
قد تحتاج إلى تثبيت netcat حتى تتمكن من إرسال الأمر mntr إلى Keeper. يُرجى مراجعة صفحة nmap.org للحصول على معلومات التنزيل.
شغّل الأمر أدناه من سطر الأوامر على clickhouse-keeper-01 وclickhouse-keeper-02 و clickhouse-keeper-03 للتحقق من حالة كل عقدة Keeper. الأمر الخاص بـ clickhouse-keeper-01 موضح أدناه:
تعرض الاستجابة أدناه مثالًا على استجابة من عقدة follower:
Response
يوضح الرد أدناه مثالًا لرد صادر من العقدة القائدة:
Response
وبهذا، تكون قد أعددت بنجاح عنقود ClickHouse يضم شريحتين ونسخة متماثلة واحدة لكل شريحة. في الخطوة التالية، ستُنشئ جدولًا في العنقود.
5

أنشئ قاعدة بيانات

الآن بعد أن تحققت من أن العنقود مُعَدّ بشكل صحيح ويعمل، ستعيد إنشاء الجدول نفسه المستخدم في الدليل العملي الخاص بمجموعة البيانات النموذجية UK property prices. ويتكوّن من نحو 30 مليون صف لأسعار العقارات المدفوعة في إنجلترا وويلز منذ عام 1995.اتصل بعميل كل مضيف بتشغيل كلٍّ من الأوامر التالية من علامات تبويب أو نوافذ طرفية منفصلة:
يمكنك تشغيل الاستعلام أدناه باستخدام clickhouse-client على كل مضيف للتأكد من عدم إنشاء أي قواعد بيانات بعد، باستثناء القواعد الافتراضية:
Query
Response
من عميل clickhouse-01، شغّل استعلام DDL موزّعًا التالي باستخدام عبارة ON CLUSTER لإنشاء قاعدة بيانات جديدة باسم uk:
يمكنك تشغيل الاستعلام نفسه مرة أخرى كما سبق من العميل على كل مضيف للتأكد من أن قاعدة البيانات قد أُنشئت على مستوى العنقود رغم تشغيل الاستعلام على clickhouse-01 فقط:
6

إنشاء جدول على العنقود

الآن بعد أن أُنشئت قاعدة البيانات، ستُنشئ جدولًا. شغّل الاستعلام التالي من أي عميل من عملاء المضيف:
لاحظ أنه مطابق للاستعلام المستخدم في جملة CREATE الأصلية الخاصة بـ دليل مجموعة البيانات المثال UK property prices، باستثناء عبارة ON CLUSTER.صُمِّمت عبارة ON CLUSTER للتنفيذ الموزّع لاستعلامات DDL ‏(لغة تعريف البيانات) مثل CREATE وDROP وALTER وRENAME، بما يضمن تطبيق هذه التغييرات على المخطط عبر جميع العقد في العنقود.يمكنك تشغيل الاستعلام أدناه من عميل كل مضيف للتأكد من أن الجدول قد أُنشئ على مستوى العنقود:
Query
Response
قبل أن نُدرج بيانات الأسعار المدفوعة في المملكة المتحدة، دعونا نجري تجربة سريعة لمعرفة ما الذي يحدث عند إدراج البيانات في جدول عادي من أيٍّ من الخادمين.أنشئ قاعدة بيانات وجدولًا اختباريًا باستخدام الاستعلام التالي من أيٍّ من الخادمين:
الآن، من clickhouse-01، نفّذ استعلام INSERT التالي:
انتقل إلى clickhouse-02 ونفّذ استعلام INSERT التالي:
Query
الآن، شغّل الاستعلام التالي من clickhouse-01 أو clickhouse-02:
ستلاحظ أنه، بخلاف جدول ReplicatedMergeTree، لا يُعاد إلا الصف الذي أُدرج في الجدول على ذلك المضيف تحديدًا، وليس كلا الصفين.لقراءة البيانات عبر الشاردين، نحتاج إلى واجهة يمكنها التعامل مع الاستعلامات عبر جميع الشاردات، مع دمج البيانات من كلا الشاردين عندما ننفّذ استعلامات select عليها، أو إدراج البيانات في كلا الشاردين عندما ننفّذ استعلامات insert.في ClickHouse تُسمّى هذه الواجهة جدولًا موزعًا، وننشئها باستخدام محرك الجدول Distributed. لنلقِ نظرة على كيفية عمله.
7

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

أنشئ جدولًا موزّعًا باستخدام الاستعلام التالي:
في هذا المثال، اختيرت الدالة rand() كمفتاح للتجزئة بحيث تتوزع عمليات الإدراج عشوائيًا على الأجزاء.الآن نفّذ استعلامًا على الجدول الموزّع من أيٍّ من المضيفين، وستحصل على كلا الصفين اللذين أُدرجا على المضيفين كليهما، بخلاف مثالنا السابق:
لنفعل الأمر نفسه مع بيانات أسعار العقارات في المملكة المتحدة. من أيٍّ من الأجهزة المضيفة التي تشغّل العميل، شغّل الاستعلام التالي لإنشاء جدول موزّع باستخدام الجدول الحالي الذي أنشأناه سابقًا باستخدام ON CLUSTER:
8

إدراج البيانات في جدول موزّع

الآن اتصل بأيٍّ من المضيفَين وأدرج البيانات:
بمجرد إدراج البيانات، يمكنك التحقق من عدد الصفوف باستخدام الجدول الموزع:
Query
Response
إذا نفّذت الاستعلام التالي على أيٍّ من المضيفَين، ستلاحظ أن البيانات توزّعت بشكل متساوٍ إلى حدٍّ ما عبر الأجزاء (علمًا بأن اختيار الجزء الذي تُدرج فيه البيانات كان عشوائيًا باستخدام rand()، لذا قد تختلف النتائج لديك):
ماذا سيحدث إذا تعطّل أحد المضيفين؟ لنحاكِ هذا السيناريو بإيقاف clickhouse-01:
تحقق من أن المضيف متوقف عن طريق تشغيل:
Response
الآن من clickhouse-02 نفِّذ نفس استعلام select الذي أجريناه سابقًا على الجدول الموزَّع:
Response
للأسف، مجموعتنا ليست متسامحة مع الأعطال. إذا تعطّل أحد المضيفين، تُعدّ المجموعة غير سليمة ويفشل الاستعلام، خلافًا للجدول المُكرَّر الذي رأيناه في المثال السابق، والذي كنّا قادرين فيه على إدراج البيانات حتى عند تعطّل أحد المضيفين.

الخاتمة

تتمثل ميزة طوبولوجيا هذا العنقود في أن البيانات تُوزَّع عبر مضيفين منفصلين، مع استخدام نصف سعة التخزين لكل عقدة. والأهم من ذلك أن الاستعلامات تُعالَج عبر كلا الشاردين، مما يحسّن كفاءة استخدام الذاكرة ويقلّل عمليات الإدخال/الإخراج على كل مضيف. أما العيب الرئيسي لطوبولوجيا هذا العنقود فهو، بطبيعة الحال، أن فقدان أحد المضيفين يجعلنا غير قادرين على معالجة الاستعلامات. في المثال التالي، سنلقي نظرة على كيفية إعداد عنقود يضم شاردين ونسختين متماثلتين، بما يوفّر قابلية التوسع وتحمّل الأعطال.
آخر تعديل في ٢٣ يوليو ٢٠٢٦