向ClickHouse集群新增节点的正确操作流程是什么
ClickHouse 20.4.8.99 版本 ReplicatedReplacingMergeTree 集群新增节点操作步骤
前置说明
你之前遇到的ATTACH语法报错,是因为20.4.8.99 属于较低版本,不支持ATTACH TABLE ... FROM 'path'带路径+列定义的写法,该语法是 21.3 之后版本才新增的特性,低版本仅支持无路径的 ATTACH 或直接 CREATE TABLE 操作。
创建表提示存在已有数据目录,是因为之前操作失败后残留了未清理的元数据、数据目录文件,操作前需先清理残留文件。
前置准备
- 新节点安装和现有集群完全一致的 20.4.8.99 版本 ClickHouse,配置文件(config.xml、metrika.xml)中的集群配置、ZooKeeper 地址、宏配置(macros 下的 shard、replica 标识)和对应分片的规则一致,端口、权限配置和现有节点对齐
- 新节点启动后验证和现有所有节点、ZooKeeper 集群的网络连通性,保证 9000、8123、2181 等必要端口无防火墙限制
- 提前清理新节点上目标表的残留文件:数据目录(默认路径
/var/lib/clickhouse/data/[库名]/[表名]/)、元数据目录(默认路径/var/lib/clickhouse/metadata/[库名]/[表名].sql),同时确认 ZooKeeper 上对应新副本的路径无脏数据,如有可手动删除/clickhouse/tables/[分片ID]/[库名]/[表名]/replicas/[新副本名]路径
扩容操作步骤
场景1:新增节点属于全新分片
- 在任意现有节点执行集群级 DDL 同步创建分片表:
CREATE TABLE IF NOT EXISTS [库名].[表名] ON CLUSTER [集群名] ( -- 完全复制现有表的列定义 ) ENGINE = ReplicatedReplacingMergeTree( '/clickhouse/tables/{shard}/[库名]/[表名]', '{replica}', [你配置的版本字段] ) -- 完全复制现有表的分区、排序、主键、配置参数 PARTITION BY ... ORDER BY ... PRIMARY KEY ... SETTINGS ...;
- 如果现有集群使用了分布式表,同样执行带
ON CLUSTER的分布式表创建 DDL,同步到所有节点 - 如需均衡现有分片的数据到新分片,逐分区执行迁移即可:
ALTER TABLE [分布式表名] MOVE PARTITION '[分区名]' TO SHARD '[新分片ID]'
场景2:新增节点属于现有分片的额外副本
- 直接在新节点本地执行和同分片其他节点完全一致的建表语句,无需加
ON CLUSTER:
CREATE TABLE IF NOT EXISTS [库名].[表名] ( -- 完全复制同分片现有节点的列定义 ) ENGINE = ReplicatedReplacingMergeTree( '/clickhouse/tables/[对应分片ID]/[库名]/[表名]', '[新副本的replica标识]', [你配置的版本字段] ) -- 完全复制现有表的分区、排序、主键、配置参数 PARTITION BY ... ORDER BY ... PRIMARY KEY ... SETTINGS ...;
- 建表完成后 ClickHouse 会自动从 ZooKeeper 拉取副本元数据,从同分片其他副本同步全量数据,无需手动拷贝文件或挂载
- 同步完成后执行
SELECT count(*) FROM [表名]和同分片其他节点对比数据量,确认同步正常即可
内容的提问来源于stack exchange,提问作者konart
相关产品推荐
相关产品推荐

