الوصف
الأعمدة
policy_name(String) — اسم سياسة التخزين.volume_name(String) — اسم وحدة التخزين.volume_priority(UInt64) — أولوية وحدة التخزين.disks(Array(String)) — قائمة بأسماء جميع الأقراص التي تُعد جزءًا من سياسة التخزين هذه.volume_type(Enum8(‘JBOD’ = 0, ‘SINGLE_DISK’ = 1, ‘UNKNOWN’ = 2)) — نوع وحدة التخزين: JBOD أو قرص واحد.max_data_part_size(UInt64) — الحد الأقصى لحجم جزء البيانات الذي يمكن تخزينه على أي قرص من أقراص وحدة التخزين.move_factor(Float32) — عندما تقل المساحة المتاحة عن هذه القيمة، تبدأ البيانات تلقائيًا بالانتقال إلى وحدة التخزين التالية، إن وُجدت (القيمة الافتراضية 0.1).prefer_not_to_merge(UInt8) — يجب عدم استخدام هذا الإعداد. فهو يعطّل دمج أجزاء البيانات على وحدة التخزين هذه (وهذا مضر ويؤدي إلى تراجع الأداء).perform_ttl_move_on_insert(UInt8) — يعطّل TTL move عند تنفيذ INSERT لجزء بيانات. افتراضيًا (إذا كان مُمكّنًا)، إذا أدرجنا جزء بيانات انتهت صلاحيته بالفعل وفقًا لقاعدة TTL move، فإنه ينتقل فورًا إلى وحدة التخزين/القرص المحدد في قاعدة النقل.load_balancing(Enum8(‘ROUND_ROBIN’ = 0, ‘LEAST_USED’ = 1)) — سياسة موازنة الأقراص:round_robinأوleast_used.
اختيار وحدة التخزين عند INSERT
INSERT جزء بيانات جديدًا، يختار ClickHouse قرص الوجهة
بتطبيق القواعد التالية بالترتيب. وتُعتمد أول قاعدة تنطبق ويمكنها
حجز مساحة للجزء؛ وإلا (إذا كانت القاعدة غير منطبقة، أو لا توجد مساحة
حرة، أو تم تجاوز max_data_part_size) فيستمر التقييم مع القاعدة
التالية.
- قاعدة TTL move — إذا كان الشرط
TTL <expr> TO VOLUME 'X'(أوTO DISK 'X') قد أصبح بالفعل من الماضي بالنسبة إلى الصفوف التي يجري إدراجها، وكانperform_ttl_move_on_insert = 1(افتراضيًا) على وحدة تخزين وجهة TTL (وبالنسبة إلىTO DISK 'X'، تكون وحدة التخزين التي تحتوي على القرصX)، فإن الجزء يُكتب مباشرةً إلى تلك الوجهة. وإذا فشل الحجز هناك، فتتراجع عمليةinsertإلى الخطوات 2–4؛ ويُسجَّل تحذير، لكنINSERTلا يفشل لهذا السبب وحده. max_data_part_size— ترفض وحدة التخزين الأجزاء الأكبر منmax_data_part_sizeالخاص بها. ويُتحقق من ذلك لكل وحدة تخزين على حدة؛ ولا يقيّد حجز الخطوة 1 من نوعTTL ... TO DISK 'X'، لأنه يستهدف القرص مباشرةً.volume_priority— من بين وحدات التخزين المتبقية، تُختار الوحدة ذات أقل قيمةvolume_priority. أما وحدات التخزين التي لا تحتوي على<volume_priority>صريح فتُرتَّب بحسب موضعها في الإعدادات.load_balancing— بعد اختيار وحدة التخزين، يُختار القرص داخل تلك الوحدة وفقًا لسياسةload_balancingالخاصة بها (round_robinأوleast_used).
تجاوزإذا كانت
min_free_disk_bytes_to_perform_insert أو
min_free_disk_ratio_to_perform_insert غير صفرية، فيُتجاوز
الترتيب المذكور أعلاه. يحاول INSERT فقط استخدام وحدة التخزين ذات
أقل volume_priority، ويطرح NOT_ENOUGH_SPACE إذا لم يستوفِ أي قرص
في تلك الوحدة الحد المطلوب. وتُستثنى عمليات الإدراج في قاعدة بيانات system.تُقرأ قيمة
perform_ttl_move_on_insert من وحدة تخزين وجهة TTL،
وليس من وحدة التخزين المصدر. وبالنسبة إلى قاعدة TO DISK 'X'، تُقرأ
العلامة من وحدة التخزين التي تحتوي على القرص X. ولا يكون لضبطها على أي وحدة تخزين أخرى ضمن
السياسة أي تأثير في مسار insert.volume_priority حتى عندما تنطبق قاعدة
TTL move “منتهية بالفعل”، اضبط perform_ttl_move_on_insert = 0 على
وحدة تخزين وجهة TTL (وبالنسبة إلى TO DISK 'X'، على وحدة التخزين التي تحتوي على
القرص X). عندئذٍ يُكتب الجزء أولًا إلى وحدة التخزين ذات الأولوية الأقل ثم
يُنقل إلى وجهة TTL بواسطة مهمة نقل في الخلفية (يمكن ملاحظتها عبر
system.moves). راجع
إعداد perform_ttl_move_on_insert في محرك MergeTree.