load_balancing
load_balancing 说明
load_balancing(Enum8) - 磁盘平衡的策略。支持ROUND_ROBIN(轮询)、 LEAST_USED(最少使用)。默认策略为 ROUND_ROBIN。
load_balancing 作用
load_balancing 是 ClickHouse 中用于定义多磁盘存储策略下数据写入时的磁盘选择策略的参数,属于 Enum8 类型。它控制数据块(part)在不同磁盘之间的分布逻辑。
ROUND_ROBIN(轮询)
机制:按顺序依次选择卷内的磁盘写入数据。例如,磁盘顺序为 disk1 → disk2 → disk3,则每次写入轮换下一个磁盘。特点:均匀分布:确保数据在磁盘间均匀分布。简单高效:无额外计算开销,适合磁盘性能相近的场景。适用场景:磁盘容量和 I/O 性能相近。需要简单、可预测的分布策略。
<!-- config.xml 或 storage.xml -->
<storage_configuration><disks><disk1><path>/data/disk1/</path></disk1><disk2><path>/data/disk2/</path></disk2><disk3><path>/data/disk3/</path></disk3></disks><policies><custom_policy><volumes><main_volume><disk>disk1</disk><disk>disk2</disk><disk>disk3</disk><load_balancing>ROUND_ROBIN</load_balancing> <!-- 显式指定策略 --></main_volume></volumes></custom_policy></policies>
</storage_configuration>
LEAST_USED(最少使用)
机制:选择当前已用空间最少或写入次数最少的磁盘。动态调整,优先填充空闲磁盘。特点:负载均衡:避免单个磁盘过载。计算开销:需实时统计磁盘使用情况,略微增加开销。适用场景:磁盘容量或性能差异较大。需要最大化利用磁盘空间或避免热点磁盘。
<!-- config.xml 或 storage.xml -->
<storage_configuration><disks><disk1><path>/data/disk1/</path></disk1><disk2><path>/data/disk2/</path></disk2><disk3><path>/data/disk3/</path></disk3></disks><policies><custom_policy><volumes><main_volume><disk>disk1</disk><disk>disk2</disk><disk>disk3</disk><load_balancing>LEAST_USED</load_balancing> <!-- 显式指定策略 --></main_volume></volumes></custom_policy></policies>
</storage_configuration>
ROUND_ROBIN 和 LEAST_USED
特性 |
ROUND_ROBIN |
LEAST_USED |
分布均匀性 |
严格轮换,绝对均匀 |
动态调整,基于磁盘使用情况 |
计算开销 |
低 |
中 |
适用磁盘类型 |
同质磁盘(容量/性能相近) |
异构磁盘(容量/性能差异大) |
热点风险 |
低(均匀分布) |
极低(自动避让繁忙磁盘) |
配置复杂度 |
简单 |
需监控磁盘状态 |
最佳实践
同质磁盘环境
使用 ROUND_ROBIN,避免不必要的计算开销。
异构磁盘环境
选择 LEAST_USED,配合磁盘权重(<weight>)优化分布。
<main_volume><disk>disk1</disk><weight>3</weight> <!-- 权重越高,分配比例越大 --><disk>disk2</disk><weight>1</weight><load_balancing>LEAST_USED</load_balancing>
</main_volume>
move_factor
move_factor 说明
定义:move_factor 是 ClickHouse 存储策略(Storage Policy)中用于控制 数据自动迁移 的参数。作用:当某个磁盘的剩余空间不足时,ClickHouse 会根据 move_factor 的阈值,自动将数据从高使用率的磁盘迁移到同一卷(Volume)内其他低使用率的磁盘。默认值:0.1(若未显式配置)。
move_factor 工作原理
触发条件:当磁盘的已用空间占比超过 1 - move_factor 时,触发数据迁移。公式:已用空间比例>(1−move_factor)示例:若 move_factor = 0.2,当磁盘使用率达到 80%(即 1 - 0.2 = 0.8)时,系统会尝试将数据迁移到同一卷内的其他磁盘。
迁移逻辑:ClickHouse 后台线程会监控磁盘使用情况。触发迁移后,系统将选择同一卷内其他有足够空间的磁盘作为目标。迁移单位为数据分片(part),且迁移过程对查询无影响。
move_factor 配置方法
<storage_configuration><disks><disk1><path>/data/disk1/</path></disk1><disk2><path>/data/disk2/</path></disk2></disks><policies><my_policy><volumes><default><disk>disk1</disk><disk>disk2</disk><move_factor>0.2</move_factor> <!-- 触发迁移的阈值 --></default></volumes></my_policy></policies>
</storage_configuration>
move_factor 注意事项
同一卷(Volume)内生效:move_factor 仅对同一卷内的磁盘生效,跨卷的数据迁移需通过其他策略(如多卷配置)。依赖磁盘剩余空间:迁移需要目标磁盘有足够的空间,否则迁移会失败。后台异步操作:数据迁移由后台线程执行,可能需要一定时间(非实时)。
move_factor 最佳实践
合理设置 move_factor:对于高负载环境,建议设为 0.1~0.2(即磁盘使用率 80%~90% 时触发迁移)。避免设置过小(如 0.05),可能导致频繁迁移影响性能。监控与告警:定期检查 system.disks 和 system.parts,确保磁盘空间和迁移状态正常。对磁盘使用率设置告警(如超过 85% 时通知)。结合多卷策略:若需跨卷迁移(如冷热数据分层),可配置多卷(Volume)并指定不同的 move_factor。
move_factor 配置示例
<storage_configuration>...<policies><hdd_in_order> <!-- policy name --><volumes><single> <!-- volume name --><disk>disk1</disk><disk>disk2</disk></single></volumes></hdd_in_order><moving_from_ssd_to_hdd><volumes><hot><disk>fast_ssd</disk><max_data_part_size_bytes>1073741824</max_data_part_size_bytes></hot><cold><disk>disk1</disk></cold></volumes><move_factor>0.2</move_factor></moving_from_ssd_to_hdd><small_jbod_with_external_no_merges><volumes><main><disk>jbod1</disk></main><external><disk>external</disk></external></volumes></small_jbod_with_external_no_merges></policies>...
</storage_configuration>
move_factor 与 load_balancing 的关系
load_balancing 控制写入时的初始分布(如 ROUND_ROBIN 或 LEAST_USED)。move_factor 负责写入后的动态调整,二者共同实现磁盘平衡。