简介
环境
这里使用上篇文章集群做示范:
IP 地址 | 主机名称 | CPU | 内存 | 数据盘 |
---|---|---|---|---|
172.20.0.201 | zookeeper01 | 4 | 8G | 100G |
172.20.0.202 | zookeeper02 | 4 | 8G | 100G |
172.20.0.203 | zookeeper03 | 4 | 8G | 100G |
172.20.0.101 | clickhouse01 | 8 | 16G | 300G |
172.20.0.102 | clickhouse02 | 8 | 16G | 300G |
172.20.0.103 | clickhouse03 | 8 | 16G | 300G |
172.20.0.104 | clickhouse04 | 8 | 16G | 300G |
172.20.0.105 | clickhouse05 | 8 | 16G | 300G |
172.20.0.106 | clickhouse06 | 8 | 16G | 300G |
正文
示例集群配置:
<remote_servers>
<!-- 集群名称,可以修改 -->
<cluster01>
<!-- 配置两个分片,每个分片对应两台机器,为每个分片配置两个副本 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>clickhouse01</host>
<port>9000</port>
<user>default</user>
<password>cDT5wFrx</password>
</replica>
<replica>
<host>clickhouse05</host>
<port>9000</port>
<user>default</user>
<password>cDT5wFrx</password>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>clickhouse02</host>
<port>9000</port>
<user>default</user>
<password>cDT5wFrx</password>
</replica>
<replica>
<host>clickhouse06</host>
<port>9000</port>
<user>default</user>
<password>cDT5wFrx</password>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>clickhouse03</host>
<port>9000</port>
<user>default</user>
<password>cDT5wFrx</password>
</replica>
<replica>
<host>clickhouse04</host>
<port>9000</port>
<user>default</user>
<password>cDT5wFrx</password>
</replica>
</shard>
</cluster01>
</remote_servers>
集群缩容
注意,以下 2 种方式在缩小容期间可能会导致集群对外服务暂停。
1. Replica 副本下线
副本节点下线,主副本仍然保留相同的数据,因此不需要对副本节点数据进行备份。
同时由于主副本和副本间是对等的,因此下线主副本和副本原理相同,下线主副本后,副本分片会选举成为主副本提供服务。
主要步骤(下线副本 A):
- 所有节点配置中去除需要下线的副本 A 的 replica 配置;
- 各节点轮流重启,下线副本 A 节点;
以下示例下线分片 1 的 clickhouse05 分片。
1. 修改所有节点配置文件,移除clickhouse05 replica 配置信息。
<remote_servers>
<!-- 集群名称,可以修改 -->
<cluster01>
<!-- 配置两个分片,每个分片对应两台机器,为每个分片配置两个副本 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>clickhouse01</host>
<port>9000</port>
<user>default</user>
<password>cDT5wFrx</password>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>clickhouse02</host>
<port>9000</port>
<user>default</user>
<password>cDT5wFrx</password>
</replica>
<replica>
<host>clickhouse06</host>
<port>9000</port>
<user>default</user>
<password>cDT5wFrx</password>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>clickhouse03</host>
<port>9000</port>
<user>default</user>
<password>cDT5wFrx</password>
</replica>
<replica>
<host>clickhouse04</host>
<port>9000</port>
<user>default</user>
<password>cDT5wFrx</password>
</replica>
</shard>
</cluster01>
</remote_servers>
2. 重启clickhouse 01、02、03、04、06节点,下线 clickhouse05 节点
01/02/03/04/06:) docker-compose restart
clickhouse05 :) docker-compose down
# 检查节点
clickhouse :) select * from system.clusters
2. Shard 分片下线
下线分片是指整个分片的全部数据下线,假设分片 1 有 3 个节点,那么下线分片 1 需要将主副本以及 2 个副本全部下线。
分片下线后将不能提供服务,因此分片的数据需要迁移至其他节点。
有 2 种思路:
- 重建新表,全部数据重新导入。
- 建立新的分布表和本地表(缩容后集群规模);
- 从原分布式表导入数据到新分布式表;
- 旧分布式表、本地表下线删除;
- 新分布式表、本地表重命名;
- 剩余节点 fetch 下线节点分区。
- 在非下线节点 alter fetch 下线节点分区(需要规划分配各节点分区);
- 修改节点配置;
- 重启非下线节点;
ClickHouse 集群扩容
ClickHouse 集群扩容主要有 2 种情况:增加副本和增加分片
1. 增加副本
增加副本节点,仅需要修改新节点配置,然后执行建表语句,语句执行后会从 ZooKeeper 中获取主节点信息,然后同步数据。
但是这样主节点没有副本节点信息,执行查询语句时只会选择主节点,而副本节点查询语句可以在主节点和副本节点间随机选择,建议主节点同样修改配置,使得主节点副本节点配置保持一致。
主要步骤:
- 修改配置,增加新副本配置;
- 重启各节点;
2. 增加分片
由于 ClickHouse 在新增分片节点无法进行自动 Rebalance ,会比较麻烦,主要有 2 种思路:
- 新建集群,数据重新迁移
- 新建 CH 分布式集群;
- 从旧集群迁移数据到新集群(可以通过 insert into select);
- 删除旧集群;
- 增加新节点的权重,过一定时间后待数据均衡后,重新调整新增节点权重
- 配置文件设置新的 shard 有较高的权重(如 99);
- 新分片节点启动加入集群;
- 一定时间后逐渐调整新分片节点权重,逐渐回到平衡;