clickhouse 磁盘平衡的策略

news/2025/2/22 21:33:11/文章来源:https://www.cnblogs.com/wangguishe/p/18710324

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/888183.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【库】用Rin透视Web请求

Rin 可以捕获对 ASP.NET Core 应用程序的 HTTP 请求,并为捕获的数据提供查看器。它是调试 Web 应用程序(例如,网站、API 应用)的有用工具。先看如下代码:var builder = WebApplication.CreateBuilder(args); builder.Logging.AddRinLogger(); builder.Services.AddRin(); …

【蓝桥训练记录】第 26 场 蓝桥月赛

训练情况赛后反思 这场怎么都是猜猜乐+典题,做不出来的题真的不会了 A题 显然 2025 里面有多少个 15,除法向上取整即可点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;void solve(){cout<<ceil(1.0*2025/15…

光纤三维布里渊温度和应变分布matlab模拟与仿真

1.程序功能描述 光纤三维布里渊温度和应变分布matlab模拟与仿真。其中 , 布里渊散射是光波与声波在光纤中传播时相互作用而产生的光散射过程 , 在不 同的条件下 , 布里渊散射又分别以自发散射和受激散射两种形式表现出来 。 2.测试软件版本以及运行结果展示MATLAB2022A版…

基于一阶梯度的图像亚像素位移matlab仿真,带GUI界面

1.算法运行效果图预览 (完整程序运行后无水印)2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)% --- Executes on button press in checkbox1. function checkbox1_Callback(hObject, eventdata, handles) % hObject handle to…

Java基础学习(十六)

Java基础学习(十六):多线程 目录Java基础学习(十六):多线程概念多线程的实现方式常见成员方法线程安全问题同步代码块同步方法Lock 锁生产者消费者模式(等待唤醒机制)线程池 本文为个人学习记录,内容学习自 黑马程序员概念进程:程序的基本执行实体 线程:操作系统能够…

AXI4-Stream Data FIFO(2.0)

IP核具体设置如下,数据宽度64bit,深度32,启用了包传输。打开Example Design三个IP核和两个AXI读写模块。 clk_wiz_0是mmcm IP核,提供工作时钟,proc_sys_reset_0是系统复位 IP核,提供复位信号,axis_data_fifo是本次的仿真IP 核。 axis_data_fifo_example_master是写模块,…

DeepSeek宣布下周开源5大项目,这才是真OpenAI!

近日,DeepSeek 团队宣布将在下周连续开源 5 个项目。这一举措不仅吸引了众多开发者的目光,还在技术社区引发了热烈讨论,不少网友甚至将 DeepSeek 誉为 “真正的 OpenAI”。一、DeepSeek开源计划详情(一)开源时间与方式DeepSeek团队决定开展“OpenSourceWeek”(开源周)活…

NOIP 2024 游记 | Loser.

Loser. p.s. 本文章比较废话()Day 1 早上 6:30 被拽起来了。吃饭。出门。坐地铁。到! 华科大门,比,华师气派多了诶诶。扯了个横幅,拍照。拍照。拍照。 诶诶,怎么 7:45 就拽着我们进去了。 进考场。我怎么是第一排第一个 /jk 看见了 @Hakureireimu_cjrljpx,但是他不认识…

利用 vscode 进行远程开发

打开远程项目路径在远程服务器上安装 vscode 插件 Go、GitLens、Git History、Git Graph、MarsCode AI对于本地已经安装的插件,点击Install In SSH:xxx就能把插件安装到远程服务器对于本地没有安装的插件,直接查找插件,选中安装,即是安装到远程服务器git 不高亮显示修改行从…

查看Oracle的数据库表命令

在 Oracle 里 “数据库” 的概念和其他数据库系统有所不同,Oracle 一个实例通常对应一个数据库,但可以包含多个不同的模式(类似于其他数据库系统中的用户数据库)1. 查看数据库名称你可以在 SQL*Plus 或者 SQL Developer 等工具中执行如下 SQL 语句:SELECT name FROM v$dat…

Linux 中declare命令详解

Linux 中declare命令001、普通测试[root@PC1 dir1]# ls [root@PC1 dir1]# echo $var1[root@PC1 dir1]# var1="hello world" [root@PC1 dir1]# echo $var1 hello world [root@PC1 dir1]# var1=100.55 [root@PC1 dir1]# echo $var1 100.55 [root@PC1 dir1]# var1=100 […