跳转到主内容
跳转到主内容

system.storage_policies

描述

包含在服务器配置中定义的存储策略和卷的信息。

  • 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) — 禁用在数据分区片段 INSERT 时执行 TTL 移动。默认情况下 (启用时) ,如果插入的数据分区片段已根据 TTL 移动规则过期,它会立即移动到该规则指定的卷/磁盘上。
  • load_balancing (Enum8('ROUND_ROBIN' = 0, 'LEAST_USED' = 1)) — 磁盘负载均衡策略,可为 round_robinleast_used

INSERT 时的卷选择

INSERT 创建新的数据分片时,ClickHouse 会按顺序尝试以下规则来选择目标磁盘。第一个匹配且能够为该分片预留空间的规则会生效;否则 (规则不适用、没有可用空间,或超过 max_data_part_size) ,将继续评估下一条规则。

  1. TTL 移动规则 — 如果对于正在插入的行,TTL <expr> TO VOLUME 'X' (或 TO DISK 'X') 子句对应的时间点已经过去,并且TTL 目标卷 上 (对于 TO DISK 'X',即包含磁盘 X 的卷) perform_ttl_move_on_insert = 1 (默认值) ,则该分片会直接写入该目标位置。如果在那里预留失败,插入会回退到步骤 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_robinleast_used) 进行选择。
覆盖规则

如果 min_free_disk_bytes_to_perform_insertmin_free_disk_ratio_to_perform_insert 非零,则会绕过上述优先级规则。INSERT 只会尝试 volume_priority 最低的卷;如果该卷中没有任何磁盘满足阈值, 则会抛出 NOT_ENOUGH_SPACE。插入到 system 数据库中的操作不受此限制。

注意

perform_ttl_move_on_insert 是从 TTL 目标卷 读取的,而不是从源卷读取。对于 TO DISK 'X' 规则,该标志是从 包含磁盘 X 的卷中读取的。将其设置在该策略中的任何其他卷上, 都不会对插入路径产生影响。

若要强制插入在“已经 过期”的 TTL 移动规则适用时仍遵循 volume_priority,请在 TTL 目标卷上将 perform_ttl_move_on_insert = 0 (对于 TO DISK 'X',则设置在包含 磁盘 X 的卷上) 。这样,分片会先写入优先级为 N 的卷, 随后再由后台移动任务移动到 TTL 目标位置 (可通过 system.moves 观察) 。请参阅 MergeTree 引擎中的 perform_ttl_move_on_insert 设置