clickhouse 磁盘平衡的策略

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 负责写入后的动态调整,二者共同实现磁盘平衡。
posted @ 2025-02-22 21:29  小吉猫  阅读(143)  评论(0)    收藏  举报