في هذا المثال، ستتعلم كيفية إعداد عنقود ClickHouse بسيط قابل للتوسّع. هناك خمسة خوادم مُعدّة. يُستخدم اثنان منها لتجزئة البيانات. وتُستخدم الخوادم الثلاثة الأخرى للتنسيق.تظهر أدناه معمارية العنقود الذي ستقوم بإعداده:
على الرغم من إمكانية تشغيل ClickHouse Server وClickHouse Keeper معًا على الخادم نفسه،
فإننا نوصي بشدة باستخدام مضيفات مخصصة لـ ClickHouse Keeper في بيئات production،
وهذا هو النهج الذي سنوضحه في هذا المثال.يمكن أن تكون خوادم Keeper أصغر حجمًا، وعادةً ما تكون 4GB RAM كافية لكل خادم Keeper
إلى أن تكبر ClickHouse Servers.
المتطلبات الأساسية
- سبق أن قمتَ بإعداد خادم ClickHouse محلي
- أنت على دراية بمفاهيم الإعداد الأساسية في ClickHouse، مثل ملفات الإعداد
- Docker مُثبَّت على جهازك
1
إعداد بنية الدليل وبيئة الاختبار
في هذا الدليل العملي، ستستخدم 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.
2
تهيئة عقد ClickHouse
إعداد الخادم
قم الآن بتعديل كل ملف تهيئة فارغconfig.xml الموجود في
fs/volumes/clickhouse-{}/etc/clickhouse-server/config.d. يجب تغيير الأسطر
المُمَيَّزة أدناه بحيث تكون مخصصة لكل عقدة:يُشرح كل قسم من أقسام ملف الإعداد أعلاه بمزيد من التفاصيل في ما يلي.
الشبكة والتسجيل
يُفعَّل الاتصال الخارجي عبر واجهة الشبكة من خلال تفعيل إعداد listen host. ويضمن ذلك أن يكون خادم ClickHouse قابلاً للوصول من قِبل المضيفات الأخرى:8123:9000:<logger>. يوفر لك مثال الإعداد هذا سجل تصحيح يُدوَّر عند 1000M ثلاث مرات:تهيئة الكلستر
يتم ضبط إعداد الكتلة في القسم<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.4
اختبر الإعداد
تأكد من أن Docker قيد التشغيل على جهازك.
ابدأ تشغيل الـcluster باستخدام الأمر من المفترض أن ترى docker يبدأ بسحب صور ClickHouse وKeeper،
ثم تشغيل الحاويات:للتأكد من أن الـcluster يعمل، اتصل بأحد إذا نجح الأمر، فسترى موجّه أوامر ClickHouse client:نفّذ الاستعلام التالي للتحقّق من بُنى العناقيد المعرّفة
ولأيّ مضيفين تم تعريفها:نفّذ الاستعلام التالي للتحقق من حالة مجموعة ClickHouse Keeper:يُستخدم الأمر تعرض الاستجابة أدناه مثالًا على استجابة من عقدة follower:يوضح الرد أدناه مثالًا لرد صادر من العقدة القائدة:وبهذا، تكون قد أعددت بنجاح عنقود ClickHouse يضم شريحتين ونسخة متماثلة واحدة لكل شريحة.
في الخطوة التالية، ستُنشئ جدولًا في العنقود.
docker-compose up من جذر الدليل cluster_2S_1R:clickhouse-01 أو clickhouse-02 ونفّذ
الاستعلام التالي. يرد أدناه أمر الاتصال بالعقدة الأولى:Query
Response
Query
Response
mntr أيضًا على نطاق واسع للتحقق من أن ClickHouse Keeper
قيد التشغيل، وللحصول على معلومات عن حالة العلاقة بين عقد Keeper الثلاث.
في الإعداد المستخدم في هذا المثال، هناك ثلاث عقد تعمل معًا.
ستنتخب هذه العقد قائدًا، وستكون العقد المتبقية عقدًا تابعة.يوفّر الأمر mntr معلومات متعلقة بالأداء، ويُبيّن أيضًا ما إذا كانت
عقدة معيّنة تابعة أم قائدًا.شغّل الأمر أدناه من سطر الأوامر على clickhouse-keeper-01 وclickhouse-keeper-02 و
clickhouse-keeper-03 للتحقق من حالة كل عقدة Keeper. الأمر
الخاص بـ clickhouse-keeper-01 موضح أدناه:Response
Response
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