clickhouse集群扩缩容


简介

环境

这里使用上篇文章集群做示范:

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 种思路:

  1. 重建新表,全部数据重新导入。
    • 建立新的分布表和本地表(缩容后集群规模);
    • 从原分布式表导入数据到新分布式表;
    • 旧分布式表、本地表下线删除;
    • 新分布式表、本地表重命名;
  2. 剩余节点 fetch 下线节点分区。
    • 在非下线节点 alter fetch 下线节点分区(需要规划分配各节点分区);
    • 修改节点配置;
    • 重启非下线节点;

ClickHouse 集群扩容


ClickHouse 集群扩容主要有 2 种情况:增加副本和增加分片

1. 增加副本

增加副本节点,仅需要修改新节点配置,然后执行建表语句,语句执行后会从 ZooKeeper 中获取主节点信息,然后同步数据。

但是这样主节点没有副本节点信息,执行查询语句时只会选择主节点,而副本节点查询语句可以在主节点和副本节点间随机选择,建议主节点同样修改配置,使得主节点副本节点配置保持一致。

主要步骤:

  • 修改配置,增加新副本配置;
  • 重启各节点;

2. 增加分片

由于 ClickHouse 在新增分片节点无法进行自动 Rebalance ,会比较麻烦,主要有 2 种思路:

  1. 新建集群,数据重新迁移
    • 新建 CH 分布式集群;
    • 从旧集群迁移数据到新集群(可以通过 insert into select);
    • 删除旧集群;
  2. 增加新节点的权重,过一定时间后待数据均衡后,重新调整新增节点权重
    • 配置文件设置新的 shard 有较高的权重(如 99);
    • 新分片节点启动加入集群;
    • 一定时间后逐渐调整新分片节点权重,逐渐回到平衡;

结束