ملفات التهيئة وملفات التعريف للإعدادات المستندة إلى XML غير مدعومة في ClickHouse Cloud. لذلك، في ClickHouse Cloud، لن تجد ملف
config.xml. وبدلًا من ذلك، يجب استخدام أوامر SQL لإدارة الإعدادات من خلال ملفات تعريف الإعدادات.للمزيد من التفاصيل، راجع “تهيئة الإعدادات”/etc/clickhouse-server/config.xml بوصفه ملف التهيئة الافتراضي، ولكن يمكن أيضًا تحديد موقع ملف التهيئة يدويًا عند بدء تشغيل الخادم باستخدام خيار سطر الأوامر --config-file أو -C.
وفي حال عدم تحديد أيٍّ من هذين الخيارين، يبحث الخادم في دليل العمل الحالي عن config.xml ثم config.yaml ثم config.yml بهذا الترتيب، ويستخدم أول ملف يعثر عليه.
وإذا لم يُعثر على أيٍّ منها، يبدأ الخادم بالتهيئة المضمَّنة في الملف التنفيذي.
أما الملف المحدد عبر --config-file فيُستخدم كما هو: فإذا لم يكن موجودًا، يُبلغ الخادم عن خطأ بدلًا من البحث عن ملف بامتداد مختلف.
ويتبع clickhouse-keeper القواعد نفسها مع keeper_config.xml وkeeper_config.yaml وkeeper_config.yml.
يمكن وضع ملفات تهيئة إضافية داخل الدليل config.d/ نسبةً إلى ملف التهيئة الرئيسي، على سبيل المثال داخل الدليل /etc/clickhouse-server/config.d/.
تُدمج الملفات الموجودة في هذا الدليل مع التهيئة الرئيسية في خطوة معالجة مسبقة قبل تطبيق التهيئة في ClickHouse server.
تُدمج أجزاء التهيئة بترتيب معجمي وفقًا لمساراتها الكاملة. بالنسبة إلى الملفات الموجودة في الدليل القياسي config.d/، يعادل هذا الترتيب حسب اسم الملف. يُدمج أيضًا الدليل القديم conf.d/؛ ولأن conf.d يسبق config.d في الترتيب، تُعالج جميع أجزائه أولًا عند وجود الدليلين.
ولتسهيل التحديثات وتحسين التنظيم إلى وحدات، من أفضل الممارسات إبقاء ملف config.xml الافتراضي دون تعديل، ووضع أي تخصيصات إضافية في config.d/.
توجد تهيئة ClickHouse Keeper في /etc/clickhouse-keeper/keeper_config.xml.
وبالمثل، يجب وضع ملفات التهيئة الإضافية الخاصة بـ Keeper في /etc/clickhouse-keeper/keeper_config.d/.
يمكن المزج بين ملفات تهيئة XML وYAML، فعلى سبيل المثال يمكن أن يكون لديك ملف تهيئة رئيسي config.xml وملفات تهيئة إضافية هي config.d/network.xml وconfig.d/timezone.yaml وconfig.d/keeper.yaml.
لا يُدعم المزج بين XML وYAML داخل ملف تهيئة واحد.
يجب أن تستخدم ملفات تهيئة XML الوسم الأعلى مستوى <clickhouse>...</clickhouse>.
في ملفات تهيئة YAML، يكون clickhouse: اختياريًا، وإذا كان غير موجود، فإن المُحلِّل يدرجه تلقائيًا.
دمج ملفات الإعداد
config.d/) كما يلي:
- إذا ظهرت عقدة (أي
pathيؤدي إلى عنصر) في كلا الملفين ولم تكن تحتوي على السماتreplaceأوremove، فتُضمَّن في ملف الإعداد المدمج، كما تُضمَّن العناصر الفرعية من كلتا العقدتين وتُدمَج تكراريًا. - إذا كانت إحدى العقدتين تحتوي على السمة
replace، فتُضمَّن في ملف الإعداد المدمج، ولكن لا تُضمَّن إلا العناصر الفرعية من العقدة التي تحتوي على السمةreplace. - إذا كانت إحدى العقدتين تحتوي على السمة
remove، فلا تُضمَّن العقدة في ملف الإعداد المدمج (وإذا كانت موجودة بالفعل، فتُحذَف).
config.xml
config.d/other_config.xml
الاستبدال باستخدام متغيرات البيئة وعُقد ZooKeeper
from_env.
على سبيل المثال، مع متغير البيئة $MAX_QUERY_SIZE = 150000:
from_zk (عقدة ZooKeeper):
كيفية تفسير القيم
يختلفfrom_env وfrom_zk في طريقة تفسير القيمة المستبدلة:
- تُعامل القيمة المستبدلة مباشرةً عبر
from_envكنص حرفي. ويُجرى إفلات محارف XML الخاصة، مثل&و<و>، تلقائيًا؛ لذا يمكن لمتغير البيئة أن يحتوي على أي قيمة قابلة للتمثيل في XML، مثلa&b<c>d، دون إفساد التهيئة (انظر الملاحظة أدناه بشأن محارف التحكم غير المسموح بها في XML). ولا تُفسَّر القيمة المباشرة على أنها XML مطلقًا، حتى لو بدت كمقطع XML: فالقيمة<a>1</a>تُدرج بوصفها النص الحرفي<a>1</a>. وينطبق ذلك أيضًا عند وضع السمة المباشرة على عنصر حاوٍ عادي مثل<profiles from_env="…"/>: إذ يجب نقل أي استبدال قائم لشجرة XML فرعية إلى<profiles><include from_env="…"/></profiles>. أما<include from_env="…"/>فيختلف حفاظًا على التوافق مع الإصدارات السابقة: فهو يحلّل متغير البيئة بوصفه مقطع XML ويُدرج عناصره الفرعية في العنصر الأصل. - يتوقف تفسير القيمة المستبدلة عبر
from_zkعلى ما إذا كانت تبدأ بـ<. فالقيمة التي تبدأ بـ<تُحلَّل دائمًا بوصفها مقطع XML؛ وبهذه الطريقة تُدرج شجرة فرعية في أي عنصر، سواء أكان<include from_zk="…"/>البنيوي أم عنصرًا حاويًا عاديًا مثل<profiles from_zk="…"/>. وقد أُبقي على هذا السلوك حفاظًا على التوافق مع الإصدارات السابقة، إذ كانت الإصدارات الأقدم تفسّر قيمfrom_zkدائمًا على أنها XML. أما القيمة التي لا تبدأ بـ<فلا تُحلَّل بوصفها شجرة YAML فرعية إلا باستخدام الصيغة الصريحة<include from_zk="…" yaml="true"/>؛ وعندئذٍ تُرفض التهيئة إذا كان YAML غير صالح. وتتيح السمةyaml="true"تحليل YAML أينما استُخدمت صيغة<include>العامة، بما في ذلك داخل عنصر طرفي؛ لذا لا تستخدمها لقيمة إعداد حرفية أو لـSecret. وفي غيابyaml="true"، تُعامل القيمة التي لا تبدأ بـ<كنص حرفي، حتى عند استخدامها بصيغة الاستبدال العامة للعنصر الطرفي<password><include from_zk="/secret"/></password>. وبذلك تُحفَظ القيم التي تحتوي عرضًا على صيغة YAML أو على YAML غير صالح، مثلabc # rotatedأو[1. وفي هذه الصيغة، لا تُحفَظ البايتات كما هي إلا إذا جاء<include>ضمن السطر نفسه دون عقد نصية تتضمن مسافات بيضاء حوله؛ لذا يُفضَّل استخدام الصيغة المباشرة<password from_zk="…"/>مع قيم Secret وإعدادات العناصر الطرفية التي تتطلب الحفاظ على البايتات كما هي. وعلى أي عنصر آخر — سواء أكان عنصرًا طرفيًا يُستبدل مثل<some_setting from_zk="…"/>أو<password from_zk="…"/>، أم عنصرًا حاويًا عاديًا مثل<profiles from_zk="…"/>— تُحفَظ القيمة التي لا تبدأ بـ<كنص حرفي ببايتاتها الأصلية كما هي (مع إفلات محارف XML الخاصة تلقائيًا، كما فيfrom_env). لذا تبقى قيمة مثلabc: defنصًا حرفيًاabc: defبدلًا من أن تصبح عنصرًا فرعيًا<abc>def</abc>. ولإدراج شجرة فرعية في عنصر عادي (بدلًا من<include>بنيوي)، قدّمها بوصفها مقطع XML (أي قيمة تبدأ بـ<).
يجب أن تكون القيم الحرفية نصًا صالحًا وفق XML 1.0يحافظ الاستبدال الحرفي (
from_env، أو قيمة from_zk لعنصر طرفي لا تبدأ بـ<) على بايتات القيمة كما هي لكل محرف يمكن تمثيله كنص في XML 1.0. أما محارف التحكم غير المسموح بها في XML 1.0 — وهي 0x00–0x08 و0x0B و0x0C و0x0E–0x1F — فلا يمكن تمريرها عبر تهيئة XML إطلاقًا (إذ تحظرها مواصفة XML حتى في مراجع المحارف الرقمية مثل )، وتُرفض أي قيمة تحتوي على أحدها عند معالجة الاستبدال. ومحارف الجدولة (\t) وتغذية السطر (\n) وإرجاع العربة (\r) مسموح بها، وتبقى بايتاتها كما هي بعد كتابتها وقراءتها مجددًا.سلوك الترقية بالنسبة لقيم العُقد الطرفية المُرمَّزة بالكياناتكانت الإصدارات السابقة تعيد تحليل كل قيمة
from_env مباشرة بوصفها XML، ولذلك كان أي محرف & أو < أو > خام يُرفض لأنه يجعل البنية غير سليمة، ولم يكن من سبيل لتضمينه إلا بترميزه بكيانات XML: فمتغير البيئة المضبوط على a&b كان يُفك ترميزه إلى a&b، و<a>1</a> إلى <a>1</a>، و إلى محرف الإرجاع (carriage return). أما الآن فقيمة from_env المباشرة تُعامَل نصًا حرفيًا، ومن ثَمّ تُحَل قيم البيئة ذاتها إلى القيم الحرفية a&b و<a>1</a> و . وبعبارة أخرى، لا تحتفظ بمعناها السابق دون تغيير إلا القيم النصية العادية: أما قيمة البيئة التي رُمِّزت بالكيانات لتلائم مسار XML القديم فيجب ضبطها الآن بصيغتها الخام (على سبيل المثال، اضبط a&b، وهي قيمة كان المسار القديم يرفضها، بينما يقبلها المسار الجديد بوصفها النص الحرفي a&b).كانت الإصدارات السابقة تعيد تحليل كل قيمة from_zk طرفية بوصفها XML، ولذلك كان أي محرف & أو < أو > خام يُرفض لأنه يجعل البنية غير سليمة، ولم يكن من سبيل لتضمينه إلا بترميزه بكيانات XML: فالقيمة المخزنة بصيغة a&b كان يُفك ترميزها إلى a&b، و<a>1</a> إلى <a>1</a>، و إلى محرف الإرجاع. أما الآن فتُحفظ القيمة الطرفية التي لا تبدأ بـ < كما هي ببايتاتها الأصلية تمامًا، ومن ثَمّ تُحَل العُقد ذاتها إلى القيم الحرفية a&b و<a>1</a> و . وبعبارة أخرى، لا تحتفظ بمعناها السابق دون تغيير إلا القيم المفردة النصية العادية: أما القيمة الطرفية التي رُمِّزت بالكيانات لتلائم مسار XML القديم فيجب تخزينها الآن بصيغتها الخام (على سبيل المثال، خزّن a&b، وهي قيمة كان المسار القديم يرفضها، بينما يقبلها المسار الجديد بوصفها النص الحرفي a&b).ينطبق التغيير نفسه على القيمة المفردة العادية التي تُستبدل عبر <include from_zk="…"/> مضمَّن داخل إعداد طرفي أو داخل Secret، مثل <password><include from_zk="/secret"/></password>: إذ تُحفظ القيمة المفردة هنا أيضًا كما هي ببايتاتها الأصلية تمامًا، ولذا فإن /secret = a&b (التي كان يُفك ترميزها سابقًا إلى a&b) تُحَل الآن إلى القيمة الحرفية a&b، ويجب بدلًا من ذلك تخزينها بصيغتها الخام a&b. تجنّب إحاطة هذه الصيغة بمسافات بيضاء، لأن تلك المسافات تصبح جزءًا من قيمة الإعداد الناتجة؛ ويُفضَّل استخدام الصيغة المباشرة <password from_zk="…"/> عندما تكون مطابقة البايتات بدقة أمرًا مهمًا. (لا يسري هذا التغيير على قيمة from_zk التي تبدأ بـ <، ولا على الشجرة الفرعية بصيغة YAML المُشار إليها عبر <include from_zk="…" yaml="true"/> — فالقيم التي تُحفظ حرفيًا هي فقط القيم غير المُعلَّمة التي لا تبدأ بـ <.)القيم الافتراضية
from_env أو from_zk أيضًا على السمة replace="1" (ويجب أن تظهر الأخيرة قبل from_env/from_zk).
في هذه الحالة، يمكن للعنصر أيضًا تحديد قيمة افتراضية.
تكون قيمة العنصر هي قيمة متغير البيئة أو عقدة ZooKeeper إذا كانت معيّنة، وإلا فتكون القيمة الافتراضية.
يتكرر المثال السابق، ولكن بافتراض أن MAX_QUERY_SIZE غير معيّن:
الاستبدال بمحتوى الملف
- استبدال القيم: إذا كان العنصر يحتوي على السمة
incl، فستُستبدل قيمته بمحتوى الملف المشار إليه. يُحدَّد المسار إلى الملف الذي يحتوي على قيم الاستبدال بواسطة العنصرinclude_fromضمن إعداد الخادم؛ ولا يوجد مسار افتراضي، لذا لا تُقرأ قيم الاستبدال إلا عند تحديده. وتُحدَّد قيم الاستبدال في عناصر/clickhouse/substitution_nameداخل هذا الملف. وإذا لم تكن قيمة الاستبدال المحددة فيinclموجودة، فسيُسجَّل ذلك في السجل. ولمنع ClickHouse من تسجيل قيم الاستبدال المفقودة، حدِّد السمةoptional="true"(على سبيل المثال، إعدادات الماكرو). - استبدال العناصر: إذا كنت تريد استبدال العنصر بالكامل بقيمة استبدال، فاستخدم
includeاسمًا للعنصر. ويمكن الجمع بين اسم العنصرincludeوالسمةfrom_zk = "/path/to/node". في هذه الحالة، تُستبدل قيمة العنصر بمحتويات عقدة ZooKeeper الموجودة في/path/to/node. وينجح ذلك أيضًا إذا خزّنت شجرة XML فرعية كاملة بوصفها عقدة ZooKeeper، إذ ستُدرج بالكامل في العنصر المصدر.
تم التغيير في الإصدار 26.8: قبل هذا الإصدار، كان الملف
/etc/metrika.xml يُستخدم ضمنيًا كلما كان موجودًا، حتى عند عدم تحديد include_from. إذا كنت تعتمد على هذا الملف، فحدِّد مساره صراحةً في include_from. لاحظ أن include_from يُقرأ من كل ملف إعداد على حدة: فالملفات التي تُحمَّل بشكل منفصل عن إعداد الخادم الرئيسي — إعداد المستخدمين (مثلًا، users.xml عندما لا يكون مضمنًا في الملف الرئيسي) وإعدادات قاموس XML — يحتاج كل منها إلى عنصر include_from خاص به؛ ولا يكفي تحديده في إعداد الخادم الرئيسي.merge="true". على سبيل المثال: <include from_zk="/some_path" merge="true">. في هذه الحالة، ستُدمج الإعداد الحالية مع المحتوى القادم من الاستبدال، وستُستبدل إعدادات الإعداد الحالية بالقيم القادمة من الاستبدال.
تشفير الإعدادات وإخفاؤها
encrypted_by إلى العنصر المراد تشفيره، على أن تكون قيمتها اسم ترميز التشفير.
وعلى خلاف السمات from_zk وfrom_env وincl أو العنصر include، لا يُجرى أي استبدال (أي فك تشفير القيمة المشفرة) في الملف المُعالَج مسبقًا.
ولا يحدث فك التشفير إلا وقت التشغيل داخل عملية الخادم.
على سبيل المثال:
from_env وfrom_zk على encryption_codecs:
config.xml:
users.xml:
encrypt_decrypt:
hide_in_preprocessed.
على سبيل المثال:
إعدادات المستخدم
config.xml تحديد إعداد منفصل يتضمن إعدادات المستخدم وملفات التعريف والحصص. ويُحدَّد المسار النسبي لهذا الإعداد في العنصر users_config. وتكون قيمته افتراضيًا users.xml. وإذا لم يتم تحديد users_config، فستُحدَّد إعدادات المستخدم وملفات التعريف والحصص مباشرةً في config.xml.
يمكن تقسيم إعدادات المستخدم إلى ملفات منفصلة، على غرار config.xml وconfig.d/.
ويُحدَّد اسم الدليل على أنه قيمة الإعداد users_config بعد حذف اللاحقة .xml وإضافة .d.
ويُستخدَم الدليل users.d افتراضيًا، لأن القيمة الافتراضية لـ users_config هي users.xml.
تُدمَج أجزاء إعدادات المستخدم بترتيب معجمي وفقًا لمساراتها الكاملة. وبالنسبة إلى الملفات في الدليل القياسي users.d/، يعادل ذلك ترتيبها حسب اسم الملف. ويُدمَج أيضًا الدليل القديم conf.d/؛ ولأن conf.d يسبق users.d في الترتيب، تُعالَج جميع أجزائه أولًا عند وجود الدليلين معًا.
لاحظ أن ملفات الإعداد تُدمَج أولًا مع مراعاة الإعدادات، ثم تُعالَج التضمينات بعد ذلك. راجع أيضًا الدمج.
مثال XML
أمثلة YAML
هنا يمكنك الاطلاع على ملف التهيئة الافتراضي المكتوب بصيغة YAML:config.yaml.example.
توجد بعض الاختلافات بين تنسيقي YAML وXML من حيث تهيئة ClickHouse.
فيما يلي نصائح لكتابة التهيئة بصيغة YAML.
يُمثَّل وسم XML ذو القيمة النصية بزوج مفتاح-قيمة في YAML
@. لاحظ أن الرمز @ محجوز وفقًا لمعيار YAML، لذا يجب وضعه بين علامتَي اقتباس مزدوجتين:
#text:
تفاصيل التنفيذ
file-preprocessed.xml عند بدء التشغيل. تحتوي هذه الملفات على جميع عمليات الاستبدال والتجاوزات المكتملة، وهي مخصّصة للاطلاع فقط. إذا استُخدمت عمليات استبدال ZooKeeper في ملفات الإعدادات، ولكن ZooKeeper لم يكن متاحًا عند بدء تشغيل الخادم، فإن الخادم يحمّل الإعدادات من الملف المُعالَج مسبقًا.
يتتبّع الخادم التغييرات في ملفات الإعدادات، وكذلك الملفات وعُقد ZooKeeper التي استُخدمت عند تنفيذ عمليات الاستبدال والتجاوزات، ويعيد تحميل إعدادات المستخدمين والعناقيد أثناء التشغيل. وهذا يعني أنه يمكنك تعديل العنقود والمستخدمين وإعداداتهم من دون إعادة تشغيل الخادم.