简介
环境
这里使用上篇文章集群做示范:
| 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);
 - 新分片节点启动加入集群;
 - 一定时间后逐渐调整新分片节点权重,逐渐回到平衡;