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_robin或least_used。
INSERT 时的卷选择
当 INSERT 创建新的数据分片时,ClickHouse 会按顺序尝试以下规则来选择目标磁盘。第一个匹配且能够为该分片预留空间的规则会生效;否则 (规则不适用、没有可用空间,或超过 max_data_part_size) ,将继续评估下一条规则。
- TTL 移动规则 — 如果对于正在插入的行,
TTL <expr> TO VOLUME 'X'(或TO DISK 'X') 子句对应的时间点已经过去,并且 在 TTL 目标卷 上 (对于TO DISK 'X',即包含磁盘X的卷)perform_ttl_move_on_insert = 1(默认值) ,则该分片会直接写入该目标位置。如果在那里预留失败,插入会回退到步骤 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 的卷中读取的。将其设置在该策略中的任何其他卷上,
都不会对插入路径产生影响。
若要强制插入在“已经
过期”的 TTL 移动规则适用时仍遵循 volume_priority,请在
TTL 目标卷上将 perform_ttl_move_on_insert = 0 (对于 TO DISK 'X',则设置在包含
磁盘 X 的卷上) 。这样,分片会先写入优先级为 N 的卷,
随后再由后台移动任务移动到 TTL 目标位置 (可通过
system.moves 观察) 。请参阅
MergeTree 引擎中的 perform_ttl_move_on_insert 设置。