الانتقال إلى المحتوى الرئيسي
يتيح لك هذا المحرك استخدام عنقود Keeper/ZooKeeper كمخزن مفتاح-قيمة متسق مع عمليات كتابة خطية وعمليات قراءة متسقة تسلسليًا. لتمكين محرك التخزين KeeperMap، تحتاج إلى تحديد مسار ZooKeeper الذي ستُخزَّن فيه الجداول باستخدام الإعداد <keeper_map_path_prefix>. على سبيل المثال:
<clickhouse>
    <keeper_map_path_prefix>/keeper_map_tables</keeper_map_path_prefix>
</clickhouse>
حيث يمكن أن يكون المسار أي مسار صالح آخر في ZooKeeper.

إنشاء جدول

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = KeeperMap(root_path, [keys_limit]) PRIMARY KEY(primary_key_name)
معلمات المحرك:
  • root_path - مسار ZooKeeper الذي سيُخزَّن فيه table_name. يجب ألا يحتوي هذا المسار على البادئة المعرّفة في الإعداد <keeper_map_path_prefix>، لأن هذه البادئة ستُضاف تلقائيًا إلى root_path. بالإضافة إلى ذلك، تكون الصيغة auxiliary_zookeeper_cluster_name:/some/path مدعومة أيضًا، حيث إن auxiliary_zookeeper_cluster عبارة عن عنقود ZooKeeper معرّف داخل الإعداد <auxiliary_zookeepers>. وبشكل افتراضي، يُستخدم عنقود ZooKeeper المعرّف داخل الإعداد <zookeeper>.
  • keys_limit - عدد المفاتيح المسموح به داخل الجدول. هذا حدّ مرن، وقد ينتهي الأمر في بعض الحالات الطرفية بوجود عدد أكبر من المفاتيح داخل الجدول.
  • primary_key_name – أي اسم عمود ضمن قائمة الأعمدة.
  • يجب تحديد primary key، وهو يدعم عمودًا واحدًا فقط في المفتاح الأساسي. سيُسلسَل المفتاح الأساسي بصيغة ثنائية باعتباره node name داخل ZooKeeper.
  • ستُسلسَل الأعمدة الأخرى غير المفتاح الأساسي بصيغة ثنائية وفق الترتيب المقابل، وتُخزَّن كقيمة للعقدة الناتجة التي يحددها المفتاح المُسلسَل.
  • ستُحسَّن الاستعلامات التي تستخدم التصفية بالمفتاح equals أو in إلى عمليات بحث عن عدة مفاتيح من Keeper، وإلا فستُجلَب جميع القيم.
مثال:
CREATE TABLE keeper_map_table
(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)
ENGINE = KeeperMap('/keeper_map_table', 4)
PRIMARY KEY key
مع
<clickhouse>
    <keeper_map_path_prefix>/keeper_map_tables</keeper_map_path_prefix>
</clickhouse>
سيُخزَّن كل Value، وهو تسلسل ثنائي لـ (v1, v2, v3)، داخل /keeper_map_tables/keeper_map_table/data/serialized_key في Keeper. بالإضافة إلى ذلك، سيكون لعدد المفاتيح حد مرن قدره 4. إذا أُنشئت عدة جداول على مسار ZooKeeper نفسه، فستظل القيم محفوظة ما دام هناك جدول واحد على الأقل يستخدمه. ونتيجة لذلك، يمكن استخدام عبارة ON CLUSTER عند إنشاء الجدول ومشاركة البيانات بين عدة مثيلات ClickHouse. وبالطبع، من الممكن تشغيل CREATE TABLE يدويًا باستخدام المسار نفسه على مثيلات ClickHouse غير مرتبطة للحصول على التأثير نفسه لمشاركة البيانات.

العمليات المدعومة

عمليات الإدراج

عند إدراج صفوف جديدة في KeeperMap، إذا لم يكن المفتاح موجودًا، فسيُنشأ إدخال جديد لهذا المفتاح. إذا كان المفتاح موجودًا وكان الإعداد keeper_map_strict_mode مضبوطًا على true، فسيُطلق استثناء، وإلا فستُستبدل القيمة الخاصة بالمفتاح. مثال:
INSERT INTO keeper_map_table VALUES ('some key', 1, 'value', 3.2);

الحذف

يمكن حذف الصفوف باستخدام الاستعلام DELETE أو TRUNCATE. إذا كان المفتاح موجودًا، وكان الإعداد keeper_map_strict_mode مضبوطًا على true، فلن تنجح عمليتا جلب البيانات وحذفها إلا إذا أمكن تنفيذهما بصورة ذرية.
DELETE FROM keeper_map_table WHERE key LIKE 'some%' AND v1 > 1;
ALTER TABLE keeper_map_table DELETE WHERE key LIKE 'some%' AND v1 > 1;
TRUNCATE TABLE keeper_map_table;

التحديثات

يمكن تحديث القيم باستخدام استعلام ALTER TABLE. ولا يمكن تحديث المفتاح الأساسي. إذا كان الإعداد keeper_map_strict_mode مضبوطًا على true، فلن تنجح عمليتا جلب البيانات وتحديثها إلا إذا نُفِّذتا بصورة ذرّية.
ALTER TABLE keeper_map_table UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;
آخر تعديل في ٢٩ يونيو ٢٠٢٦