描述
列
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 move。默认情况下 (启用时) ,如果插入的数据分片已根据 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') 子句指定的时间点已经过去,并且 在 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 的卷读取。在该策略中的任何其他卷上设置它,
都不会影响插入路径。volume_priority,请在
TTL 目标卷上将 perform_ttl_move_on_insert = 0 (对于 TO DISK 'X',则设置在包含
磁盘 X 的卷上) 。这样,该分片会先写入优先级为 N 的卷,然后再由后台移动任务
移至 TTL 目标位置 (可通过
system.moves 观察) 。请参阅
MergeTree 引擎中的 perform_ttl_move_on_insert 设置。