صُمم هذا المحرك لتقليل كثافة بيانات Graphite وتجميعها/احتساب متوسطها (rollup). وقد يكون مفيدًا للمطورين الذين يريدون استخدام ClickHouse كمخزن بيانات لـ Graphite.
يمكنك استخدام أي محرك جدول في ClickHouse لتخزين بيانات Graphite إذا لم تكن بحاجة إلى rollup، ولكن إذا كنت بحاجة إليه فاستخدم GraphiteMergeTree. يقلل هذا المحرك من حجم التخزين ويزيد من كفاءة استعلامات Graphite.
يرث هذا المحرك خصائصه من MergeTree.
إنشاء جدول
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
Path String,
Time DateTime,
Value Float64,
Version <Numeric_type>
...
) ENGINE = GraphiteMergeTree(config_section)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]اطّلع على وصف تفصيلي لعبارة CREATE TABLE.
يجب أن يحتوي جدول بيانات Graphite على الأعمدة التالية لأنواع البيانات التالية:
-
اسم المقياس (Graphite sensor). نوع البيانات:
String. -
وقت قياس المقياس. نوع البيانات:
DateTime. -
قيمة المقياس. نوع البيانات:
Float64. -
إصدار المقياس. نوع البيانات: أي نوع رقمي (يحفظ ClickHouse الصفوف ذات الإصدار الأعلى، أو آخر صف كُتب إذا كانت الإصدارات متساوية. وتُحذف الصفوف الأخرى أثناء دمج أجزاء البيانات).
يجب ضبط أسماء هذه الأعمدة في إعداد rollup.
معلمات GraphiteMergeTree
config_section— اسم القسم في ملف الإعدادات الذي تُضبط فيه قواعد rollup.
بنود الاستعلام
عند إنشاء جدول GraphiteMergeTree، تكون البنود نفسها مطلوبة كما هي الحال عند إنشاء جدول MergeTree.
طريقة مهجورة لإنشاء جدول
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
EventDate Date,
Path String,
Time DateTime,
Value Float64,
Version <Numeric_type>
...
) ENGINE [=] GraphiteMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, config_section)جميع المعلمات باستثناء config_section لها المعنى نفسه كما في MergeTree.
config_section— اسم القسم في ملف الإعدادات الذي تُضبط فيه قواعد rollup.
إعداد rollup
تُحدَّد إعدادات rollup بواسطة المعلمة graphite_rollup ضمن إعدادات الخادم. ويمكن أن يكون اسم المعلمة أيّ اسم. يمكنك إنشاء عدة إعدادات واستخدامها مع جداول مختلفة.
بنية إعداد rollup:
- الأعمدة المطلوبة
- الأنماط
الأعمدة المطلوبة
path_column_name
path_column_name — اسم العمود الذي يخزّن اسم المقياس (Graphite sensor). القيمة الافتراضية: Path.
time_column_name
time_column_name — اسم العمود الذي يخزّن وقت قياس المقياس. القيمة الافتراضية: Time.
value_column_name
value_column_name — اسم العمود الذي يخزّن قيمة المقياس عند الوقت المحدَّد في time_column_name. القيمة الافتراضية: Value.
version_column_name
version_column_name — اسم العمود الذي يخزّن إصدار المقياس. القيمة الافتراضية: Timestamp.
الأنماط
بنية قسم patterns:
pattern
rule_type
regexp
function
pattern
rule_type
regexp
age + precision
...
pattern
rule_type
regexp
function
age + precision
...
pattern
...
default
function
age + precision
...عند معالجة صف، يتحقق ClickHouse من القواعد في أقسام pattern. ويمكن لكل قسم من أقسام pattern (بما في ذلك default) أن يحتوي على المعلَمة function للتجميع، أو معلَمات retention، أو كليهما. إذا طابق اسم المقياس regexp، فستُطبَّق القواعد من قسم pattern (أو الأقسام)؛ وإلا فستُستخدم القواعد من قسم default.
الحقول الخاصة بقسمي pattern وdefault:
rule_type- نوع القاعدة. لا تُطبَّق إلا على مقاييس معيّنة. يستخدمها المحرّك للفصل بين المقاييس العادية والمقاييس الموسومة. معلَمة اختيارية. القيمة الافتراضية:all. لا تكون ضرورية إذا لم يكن الأداء بالغ الأهمية، أو إذا كان يُستخدم نوع واحد فقط من المقاييس، مثل المقاييس العادية. افتراضيًا، لا تُنشأ إلا مجموعة واحدة من القواعد. بخلاف ذلك، إذا جرى تعريف أي من الأنواع الخاصة، فستُنشأ مجموعتان مختلفتان: واحدة للمقاييس العادية (root.branch.leaf) وأخرى للمقاييس الموسومة (root.branch.leaf;tag1=value1). وتُدرج القواعد الافتراضية ضمن كلتا المجموعتين. القيم الصالحة:all(الافتراضية) - قاعدة عامة تُستخدم عند حذفrule_type.plain- قاعدة للمقاييس العادية. يُعالَج الحقلregexpبوصفه تعبيرًا نمطيًا.tagged- قاعدة للمقاييس الموسومة (تُخزَّن المقاييس في DB بالتنسيقsomeName?tag1=value1&tag2=value2&tag3=value3). يجب أن يكون التعبير النمطي مرتبًا بحسب أسماء tags، ويجب أن يكون أول tag هو__name__إن وُجد. يُعالَج الحقلregexpبوصفه تعبيرًا نمطيًا.tag_list- قاعدة للمقاييس الموسومة، وهي DSL بسيطة لتسهيل وصف المقياس بتنسيق graphite مثلsomeName;tag1=value1;tag2=value2أوsomeNameأوtag1=value1;tag2=value2. يُترجم الحقلregexpإلى قاعدةtagged. لا حاجة إلى الترتيب حسب أسماء tags، إذ سيُجرى ذلك تلقائيًا. ويمكن تعيين قيمة tag (وليس الاسم) على هيئة تعبير نمطي، مثلenv=(dev|staging).
regexp– نمط لاسم المقياس (تعبير نمطي أو DSL).age– الحد الأدنى لعمر البيانات بالثواني.precision– مدى الدقة في تحديد عمر البيانات بالثواني. يجب أن يكون قاسمًا للعدد 86400 (عدد الثواني في اليوم).function– اسم دالة التجميع التي ستُطبَّق على البيانات التي يقع عمرها ضمن المجال[age, age + precision]. الدوال المقبولة: min / max / any / avg. يُحسَب المتوسط بشكل غير دقيق، مثل متوسط المتوسطات.
مثال على التهيئة من دون أنواع القواعد
<graphite_rollup>
<version_column_name>Version</version_column_name>
<pattern>
<regexp>click_cost</regexp>
<function>any</function>
<retention>
<age>0</age>
<precision>5</precision>
</retention>
<retention>
<age>86400</age>
<precision>60</precision>
</retention>
</pattern>
<default>
<function>max</function>
<retention>
<age>0</age>
<precision>60</precision>
</retention>
<retention>
<age>3600</age>
<precision>300</precision>
</retention>
<retention>
<age>86400</age>
<precision>3600</precision>
</retention>
</default>
</graphite_rollup>مثال على التهيئة لأنواع القواعد
<graphite_rollup>
<version_column_name>Version</version_column_name>
<pattern>
<rule_type>plain</rule_type>
<regexp>click_cost</regexp>
<function>any</function>
<retention>
<age>0</age>
<precision>5</precision>
</retention>
<retention>
<age>86400</age>
<precision>60</precision>
</retention>
</pattern>
<pattern>
<rule_type>tagged</rule_type>
<regexp>^((.*)|.)min\?</regexp>
<function>min</function>
<retention>
<age>0</age>
<precision>5</precision>
</retention>
<retention>
<age>86400</age>
<precision>60</precision>
</retention>
</pattern>
<pattern>
<rule_type>tagged</rule_type>
<regexp><![CDATA[^someName\?(.*&)*tag1=value1(&|$)]]></regexp>
<function>min</function>
<retention>
<age>0</age>
<precision>5</precision>
</retention>
<retention>
<age>86400</age>
<precision>60</precision>
</retention>
</pattern>
<pattern>
<rule_type>tag_list</rule_type>
<regexp>someName;tag2=value2</regexp>
<retention>
<age>0</age>
<precision>5</precision>
</retention>
<retention>
<age>86400</age>
<precision>60</precision>
</retention>
</pattern>
<default>
<function>max</function>
<retention>
<age>0</age>
<precision>60</precision>
</retention>
<retention>
<age>3600</age>
<precision>300</precision>
</retention>
<retention>
<age>86400</age>
<precision>3600</precision>
</retention>
</default>
</graphite_rollup>