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 负责写入后的动态调整,二者共同实现磁盘平衡。