Skip to main content

الوصف

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

الأعمدة

  • 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، فإنه ينتقل فورًا إلى وحدة التخزين أو القرص المحدد في قاعدة 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.
آخر تعديل في ١٤ أغسطس ٢٠٢٦