惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
罗磊的独立博客
博客园_首页
T
The Exploit Database - CXSecurity.com
博客园 - 聂微东
雷峰网
雷峰网
V
V2EX
博客园 - 司徒正美
J
Java Code Geeks
Hugging Face - Blog
Hugging Face - Blog
H
Heimdal Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
Last Week in AI
Last Week in AI
K
Kaspersky official blog
爱范儿
爱范儿
T
Threatpost
博客园 - Franky
T
Tailwind CSS Blog
N
News and Events Feed by Topic
P
Privacy & Cybersecurity Law Blog
W
WeLiveSecurity
Google Online Security Blog
Google Online Security Blog
Know Your Adversary
Know Your Adversary
小众软件
小众软件
NISL@THU
NISL@THU
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
IT之家
IT之家
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Threat Research - Cisco Blogs
Security Latest
Security Latest
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
P
Palo Alto Networks Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
Vulnerabilities – Threatpost
N
News | PayPal Newsroom
C
Cyber Attacks, Cyber Crime and Cyber Security
AI
AI
P
Privacy International News Feed
V
Visual Studio Blog
S
Secure Thoughts
Schneier on Security
Schneier on Security
阮一峰的网络日志
阮一峰的网络日志
S
SegmentFault 最新的问题
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
C
Cybersecurity and Infrastructure Security Agency CISA
The Cloudflare Blog
Spread Privacy
Spread Privacy

博客园 - 小得盈满

Hudi 时间旅行与增量查询的区别分析 NATS 的基本安装及使用 Doris 和 StarRocks 性能测试对比 使用 Docker 部署 Elasticsearch 集群 Qdrant 单机和集群的安装方法 ClickHouse UDF 的基本用法 StarRocks 容器镜像构建 Kafka 线上性能调优 StarRocks 集群安装 Kafka 的分片和副本机制 Flink 自定义 ClickHouse Table Connector 的简单实现 Redis 性能优化实战 记一次 Go 调用系统命令出现的问题分析 APISIX proxy-cache 插件用法 etcd 历史版本回溯的方法 APISIX 简单的自定义插件开发步骤 Kafka 集群副本数量调整 使用 Docker Compose 安装 APISIX etcd 集群安装 Consul 集群安装
ClickHouse 添加磁盘扩容存储
小得盈满 · 2025-08-06 · via 博客园 - 小得盈满

我们可能经常会遇到 ClickHouse 磁盘写满的情况,这个时候除了删数据之外还可以考虑添加一块新的磁盘,让 ClickHouse 可以往新的磁盘那写入数据。ClickHouse 本身就支持配置各类存储策略,可以实现条带化、冷热分离、多存储卷顺序写入等不同的存储策略。

当前我们只针对于多个对等磁盘的空间扩容问题进行磁盘的添加。

那么添加新的磁盘其实就相当于利用多个卷的的顺序写入这种策略来实现,从而达到添加数据卷的效果,只是我们不创建新的表,而是直接修改原有数据表的存储策略,不过有一些限制,这些是 ClickHouse 为了保证数据的安全,这些限制后面会提到。

多存储卷配置建议 ClickHouse 版本在 22 以上。

首先我们在 ClickHouse 启动时至少会有一块默认的盘和卷,比如我们默认的数据目录为 /data/clickhouse/,此时 ClickHouse 也会生成默认的存储策略,名称就叫 default,我们可以执行下面的 SQL 查看:

SELECT * FROM system.disks
SELECT * FROM system.storage_policies

可以看到默认的磁盘和默认的策略都是 default

然后我们需要挂载好新的盘,假设新的数据目录为 /data2/clickhouse/,那么我们需要在配置文件中添加存储策略的配置:

<storage_configuration>
    <disks>
        <data2>
            <path>/data2/clickhouse/</path>
            <keep_free_space_bytes>10485760</keep_free_space_bytes>
        </data2>
    </disks>
    <policies>
        <multidisk_storage>
            <volumes>
                <!-- 对于扩容的话,这里名称必须用 default -->
                <default>
                    <disk>default</disk>
                </default>
                <volume2>
                    <disk>data2</disk>
                </volume2>
            </volumes>
            <move_factor>0.1</move_factor>
        </multidisk_storage>
    </policies>
</storage_configuration>

在上面的配置中,我们在 disks 中添加了 data2 表示新的磁盘,注意其中的 path 一定要以 / 结尾,表示这是一个目录。

然后在 policies 中我们添加了 multidisk_storage 存储策略,在 volumes 中指定多个卷,第一个是 default 也就是原有的卷,后面的 volume2 是后来添加的卷。注意第一个名称必须为 default,不能为其他的名字,否则后面无法对现有表修改存储策略。

然后 move_factor 表示移动 part 的因子,也就是说当一个卷的可用空间不足 10% 时,ClickHouse 会将其中的 part 移动到下一个卷中。

然后配置后直接保存正常就可以生效了,如果有多个节点要同步配置文件,保证每个节点的表都可以扩容。

然后再使用上面的 SQL 查看磁盘和策略就可以看到我们刚添加的配置了,然后我们对 MergeTree 表修改存储策略:

ALTER TABLE <db>.<table> MODIFY SETTING storage_policy='multidisk_storage'
# 可以使用 ON CLUSTER 对每个节点的表都进行修改
ALTER TABLE <db>.<table> ON CLUSTER <cluster_name> MODIFY SETTING storage_policy='multidisk_storage'

修改的时候如果我们上面的存储策略中第一个卷的名称不是 default,那么这个时候就会报错:

New storage policy `default` shall contain volumes of old one. (BAD_ARGUMENTS)

也就是说我们最新的存储策略必须包含原来的 default 卷,要不然之前的数据就没了,所以 ClickHouse 在这里进行了限制。

修改之后如果第一个卷的空间剩余不足 10%,那么 ClickHouse 就会将其中的 part 自动的转移到第二个卷中,实时写入的数据也会流向第二个卷,查询的时候会同时查询多个卷的数据,所以数据的完整性不会受到影响。

Reference:

  1. https://github.com/ClickHouse/ClickHouse/issues/12632