部署目标
- 在现有ClickHouse集群(包括3台zookeeper节点和4台数据节点)基础上,新增2个数据节点,最终扩容成3 zookeeper节点和6数据节点集群。
要点概览
- 安装要点
- 先在8台新节点安装好ClickHouse,将配置更改好,创建好原有表。注意:这个过程最耗时的是在新节点创建相关库表。 -- 这个步骤结束后是个里程碑,后续步骤终止也没有关系。不会影响集群的其他节点。
- 新节点完全具备条件后,再更新老集群节点的配置。此时,整个集群就真正扩容成功了。
- 更改数据写入程序的配置,也往新节点写入数据。
- 注意配置新老节点的防火墙策略。
- 配置要点
- 基本可以在原来CK配置基础上修改,注意 宏定义部分(
macro
)每台节点不同。 - 原有CK集群的配置如果有更改,不需要重启,CK会自动加载配置。
- 基本可以在原来CK配置基础上修改,注意 宏定义部分(
操作步骤
安装新节点
创建2台VM主机
修改主机名
shellhostnamectl set-hostname ck05 hostnamectl set-hostname ck06
准备安装包
ck01
上操作shellecho '192.168.107.20 ck05' >> /etc/hosts echo '192.168.107.21 ck06' >> /etc/hosts tail /etc/hosts ping -c 2 ck05 ping -c 2 ck06 cd ~ scp clickhouse-*.rpm root@ck05:$PWD scp clickhouse-*.rpm root@ck06:$PWD
在原有集群上进行操作:目的是模拟客户环境已经存在的数据表
ck01
上操作shellCREATE DATABASE IF NOT EXISTS cluster_db ON CLUSTER cluster1; use cluster_db; CREATE TABLE user_logs_local ON CLUSTER cluster1 ( user_id UInt64 COMMENT '用户ID', event_type String COMMENT '事件类型', event_time DateTime COMMENT '事件时间', event_data String COMMENT '事件数据', ip_address String COMMENT 'IP地址' ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/user_logs_local', '{replica}') PARTITION BY toYYYYMM(event_time) ORDER BY (user_id, event_time) SETTINGS index_granularity = 8192; CREATE TABLE user_logs_distributed ON CLUSTER cluster1 ( user_id UInt64, event_type String, event_time DateTime, event_data String, ip_address String ) ENGINE = Distributed(cluster1, cluster_db, user_logs_local, rand()); INSERT INTO user_logs_distributed (user_id, event_type, event_time, event_data, ip_address) VALUES (1, 'click', '2024-11-12 10:00:00', 'Clicked button', '192.168.1.1'), (2, 'view', '2024-11-12 10:05:00', 'Viewed page', '192.168.1.2'), (3, 'purchase', '2024-11-12 10:10:00', 'Purchased item', '192.168.1.3'); SELECT * FROM user_logs_distributed;
安装新节点
在
ck05
、ck06
上操作。操作系统基本配置
配置 hosts
shellecho '192.168.107.8 ck01' >> /etc/hosts echo '192.168.107.9 ck02' >> /etc/hosts echo '192.168.107.10 ck03' >> /etc/hosts echo '192.168.107.11 ck04' >> /etc/hosts echo '192.168.107.20 ck05' >> /etc/hosts echo '192.168.107.21 ck06' >> /etc/hosts echo '192.168.107.12 keeper01' >> /etc/hosts echo '192.168.107.13 keeper02' >> /etc/hosts echo '192.168.107.14 keeper03' >> /etc/hosts # 验证 tail -n 9 /etc/hosts ping -c 2 ck01 ping -c 2 ck02 ping -c 2 ck03 ping -c 2 ck04 ping -c 2 ck05 ping -c 2 ck06 ping -c 2 keeper01 ping -c 2 keeper02 ping -c 2 keeper03
执行安装
shellrpm -ivh ./*.rpm
输入密码:
p@$$W0rd
更改数据目录
以原有数据节点配置作为基础,稍作修改即可。
shellmkdir -p /data01/clickhouse-server/data/ mv /var/lib/clickhouse /data01/clickhouse-server/data/ ln -s /data01/clickhouse-server/data/clickhouse /var/lib/clickhouse chown -R clickhouse:clickhouse /data01/clickhouse-server/data/clickhouse mkdir -p /data01/clickhouse-server/log/ mv /var/log/clickhouse-server/ /data01/clickhouse-server/log/ ln -s /data01/clickhouse-server/log/clickhouse-server /var/log/clickhouse-server chown -R clickhouse:clickhouse /data01/clickhouse-server/log/
修改新节点配置
以原有数据节点配置作为基础,稍作修改即可。
传输原有数据节点配置,在
ck01上操作
shellscp /etc/clickhouse-server/config.xml root@ck05:/root scp /etc/clickhouse-server/config.xml root@ck06:/root scp /etc/clickhouse-server/users.xml root@ck05:/root scp /etc/clickhouse-server/users.xml root@ck06:/root
配置文件增加副本(假设解压之后的文件位于
/opt/20250220/
shellcd /opt/20250220/ # 退出使用`:wq!`强制保存 vim config.xml
搜索关键字
shard
,找到<cluster1>
包裹的内容,添加:xml<shard> <internal_replication>true</internal_replication> <replica> <host>ck05</host> <port>9000</port> <user>default</user> <password>p@$$W0rd</password> </replica> <replica> <host>ck06</host> <port>9000</port> <user>default</user> <password>p@$$W0rd</password> </replica> </shard>
注意:上面这部分内容,要添加到
</cluster>
前面。(差异执行)修改宏定义(仍旧是上面的
config.xml
)(ck05)搜索关键字 macros,改为如下:
xml<macros> <shard>03</shard> <replica>ck05</replica> </macros>
(ck06)搜索关键字 macros,改为如下:
xml<macros> <shard>03</shard> <replica>ck05</replica> </macros>
更改文件权限
shellchown clickhouse:clickhouse *.xml ll -h
替换配置
shellcp -pf *.xml /etc/clickhouse-server/
启动新节点
shellsystemctl start clickhouse-server systemctl status clickhouse-server
验证
在
ck05
、ck06
上均执行sqlCREATE DATABASE IF NOT EXISTS cluster_db; use cluster_db; CREATE TABLE user_logs_local ( user_id UInt64 COMMENT '用户ID', event_type String COMMENT '事件类型', event_time DateTime COMMENT '事件时间', event_data String COMMENT '事件数据', ip_address String COMMENT 'IP地址' ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/user_logs_local', '{replica}') PARTITION BY toYYYYMM(event_time) ORDER BY (user_id, event_time) SETTINGS index_granularity = 8192; CREATE TABLE user_logs_distributed ( user_id UInt64, event_type String, event_time DateTime, event_data String, ip_address String ) ENGINE = Distributed(cluster1, cluster_db, user_logs_local, rand()); SELECT * FROM user_logs_distributed;
预期能看到3条数据
测试插入
在
ck06
上执行shellINSERT INTO user_logs_local (user_id, event_type, event_time, event_data, ip_address) VALUES (4, 'click--', '2024-11-12 10:00:00', 'Clicked button', '192.168.1.1'), (5, 'view--', '2024-11-12 10:05:00', 'Viewed page', '192.168.1.2'), (6, 'purchase--', '2024-11-12 10:10:00', 'Purchased item', '192.168.1.3');
预期在
ck05
查询本地表能看到副本
在原有节点上增加配置
在
ck01
、ck02
、ck03
、ck04
上均操作
增加别名
shellecho '192.168.107.20 ck05' >> /etc/hosts echo '192.168.107.21 ck06' >> /etc/hosts tail /etc/hosts ping -c 2 ck05 ping -c 2 ck06
修改配置文件
vim /etc/clickhouse-server/config.xml
xml<shard> <internal_replication>true</internal_replication> <replica> <host>ck05</host> <port>9000</port> <user>default</user> <password>p@$$W0rd</password> </replica> <replica> <host>ck06</host> <port>9000</port> <user>default</user> <password>p@$$W0rd</password> </replica> </shard>
更改文件权限
shellll -h /etc/clickhouse-server/config.xml
无需重启,配置即可生效
验证
验证分片
sqlSELECT cluster, host_name FROM system.clusters;
预期有
cluster1
验证宏定义
sqlSELECT * FROM system.macros;
预期
ck01
、ck03
上shard
为01
,ck02
、ck04
上shard为02
,ck05
、ck067
上shard为03
,replica
为各主机名称。
一些细节
- 如果4台节点是旧配置,两台新节点是新配置,从新旧数据节点查询到同一张表的数据是不同的。 -- 1)可以利用该特性,进行集群隔离 2) 如果旧节点上配置已经是最新,但是新节点上并没有对应的表,就会出现查询错误
- 原有的库表(包括分布式表、本地表)、物化视图、projection等,都不会同步过来 -- 需要使用创建语句,可以添加
IF NOT EXISTS