الانتقال إلى المحتوى الرئيسي

الوصف

يحتوي على معلومات حول سياسات التخزين ووحدات التخزين المُعرَّفة في تهيئة الخادم.

الأعمدة

  • 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) فيستمر التقييم مع القاعدة التالية.
  1. قاعدة 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 لا يفشل لهذا السبب وحده.
  2. max_data_part_size — ترفض وحدة التخزين الأجزاء الأكبر من max_data_part_size الخاص بها. ويُتحقق من ذلك لكل وحدة تخزين على حدة؛ ولا يقيّد حجز الخطوة 1 من نوع TTL ... TO DISK 'X'، لأنه يستهدف القرص مباشرةً.
  3. volume_priority — من بين وحدات التخزين المتبقية، تُختار الوحدة ذات أقل قيمة volume_priority. أما وحدات التخزين التي لا تحتوي على <volume_priority> صريح فتُرتَّب بحسب موضعها في الإعدادات.
  4. 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.
آخر تعديل في ٢٩ يونيو ٢٠٢٦