Clickhouse缩容方案概览

一、缩容

1.1 下线副本

对于多副本的集群,由于副本中包含着完全相同的数据,主副本与副本是完全对等的,即使将主副本下线后,ZK也会重新选举其他副本作为新的主副本。

1、下线副本大致步骤

  • 修改集群相关节点的配置文件,将需要下线的副本在集群定义中去掉
  • 重启集群相关所有节点,并关闭需要下线节点

2、案例测试

1)缩容前环境信息

sdw1、sdw2为一个shard下的两个replica,sdw1为replica1、sdw2为replica2。目前我们需要把sdw2去掉,使得其变为1个节点。

-- 集群配置信息
<clickhouse_remote_servers>
    <!-- Test only shard config for testing distributed storage -->
    <shard1_repl1>
        <shard>
            <!-- Optional. Shard weight when writing data. Default: 1. -->
            <weight>1</weight>
            <!-- Optional. Whether to write data to just one of the replicas. Default: false (write data to all replicas). -->
            <internal_replication>true</internal_replication>
            <replica>
                <host>sdw1</host>
                <port>9000</port>
            </replica>
            <replica>
                <host>sdw2</host>
                <port>9000</port>
            </replica>
        </shard>
    </shard1_repl1>
</clickhouse_remote_servers>


sdw1 :) select * from system.clusters;

SELECT *
FROM system.clusters

┌─cluster──────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard1_repl1 │         1 │            1 │           1 │ sdw1      │ 172.16.104.12 │ 9000 │        1 │ default │                  │            0 │                       0 │
│ shard1_repl1 │         1 │            1 │           2 │ sdw2      │ 172.16.104.13 │ 9000 │        0 │ default │                  │            0 │                       0 │
└──────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘

2 rows in set. Elapsed: 0.006 sec.

2)修改sdw1、sdw2的配置文件

<clickhouse_remote_servers>
    <!-- Test only shard config for testing distributed storage -->
    <shard1_repl1>
        <shard>
            <!-- Optional. Shard weight when writing data. Default: 1. -->
            <weight>1</weight>
            <!-- Optional. Whether to write data to just one of the replicas. Default: false (write data to all replicas). -->
            <internal_replication>true</internal_replication>
            <replica>
                <host>sdw1</host>
                <port>9000</port>
            </replica>
<!--        # 把sdw2的replica的信息注释掉
            <replica>
                <host>sdw2</host>
                <port>9000</port>
            </replica>
-->
        </shard>
    </shard1_repl1>
</clickhouse_remote_servers>

3)重启sdw1服务,关闭sdw2服务,检查集群配置

-- sdw1 重启ck服务
# systemctl restart clickhouse-server
-- sdw2 关闭ck服务
# systemctl stop clickhouse-server

-- 检查当前ck集群信息
sdw1 :) select * from system.clusters;

SELECT *
FROM system.clusters

┌─cluster──────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard1_repl1 │         1 │            1 │           1 │ sdw1      │ 172.16.104.12 │ 9000 │        1 │ default │                  │            0 │                       0 │
└──────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘

1 rows in set. Elapsed: 0.007 sec.

4)检查数据

sdw1 :) show tables;

SHOW TABLES

┌─name───┐
│ t1     │
│ t3     │
│ t3_all │
│ t4     │
│ t5     │
│ t6     │
│ t7     │
│ t8     │
└────────┘

8 rows in set. Elapsed: 0.006 sec.

sdw1 :) select * from t8 order by id;

SELECT *
FROM t8
ORDER BY id ASC

┌─id─┬─name─┬─create_date─┐
│  4 │ ww   │  2020-01-02 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│  6 │ dsk  │  2020-07-20 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 12 │ aw   │  2021-01-02 │
│ 17 │ bb   │  2021-01-02 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 19 │ bw   │  2021-02-18 │
│ 21 │ cc   │  2020-01-08 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 32 │ ww   │  2020-02-02 │
└────┴──────┴─────────────┘

7 rows in set. Elapsed: 0.009 sec.

1.2 下线分片

由于不同的分片中包含了不同的数据,所以需要对指定分片下线时,需要提前将该分片的数据迁移至其他节点,然后进行下线操作。

1、下线分片大致步骤

  • 将需要下线的分片节点中的本地数据进行备份(备份的四种方式,可参考文章:《Clickhouse备份恢复方式概览》)
  • 修改集群相关节点的配置文件,去掉需要下线的分片节点数据
  • 重启集群相关节点,关闭需要下线节点
  • 将备份数据在仍保留的分片节点进行数据恢复,若恢复表为分布式表,需要恢复至本地表中

2、案例测试

集群为mdw、sdw3两个分片节点,无副本。测试需要将sdw3的分片节点进行下线,并将所有数据迁移至mdw节点。

1)缩容前环境信息

<clickhouse_remote_servers>
    <!-- Test only shard config for testing distributed storage -->
    <shard2_repl0>
	<shard>
	    <replica>
		<host>mdw</host>
		<port>9000</port>
	    </replica>
	</shard>
	<shard>
	    <replica>
		<host>sdw3</host>
		<port>9000</port>
	    </replica>
	</shard>
    </shard2_repl0>
</clickhouse_remote_servers>

mdw :) select * from system.clusters;

SELECT *
FROM system.clusters

┌─cluster──────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard2_repl0 │         1 │            1 │           1 │ mdw       │ 172.16.104.11 │ 9000 │        1 │ default │                  │            0 │                       0 │
│ shard2_repl0 │         2 │            1 │           1 │ sdw3      │ 172.16.104.14 │ 9000 │        0 │ default │                  │            1 │                       0 │
└──────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘

2 rows in set. Elapsed: 0.007 sec.

-- 数据检查
mdw :) select * from t8 order by id;

SELECT *
FROM t8
ORDER BY id ASC

┌─id─┬─name─┬─create_date─┐
│  4 │ ww   │  2020-01-02 │
│  6 │ dsk  │  2020-07-20 │
│ 12 │ aw   │  2021-01-02 │
│ 17 │ bb   │  2021-01-02 │
│ 19 │ bw   │  2021-02-18 │
│ 21 │ cc   │  2020-01-08 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 32 │ ww   │  2020-02-02 │
└────┴──────┴─────────────┘

7 rows in set. Elapsed: 0.667 sec.

mdw :) select * from t8_local order by id;

SELECT *
FROM t8_local
ORDER BY id ASC

┌─id─┬─name─┬─create_date─┐
│  4 │ ww   │  2020-01-02 │
│ 19 │ bw   │  2021-02-18 │
│ 21 │ cc   │  2020-01-08 │
└────┴──────┴─────────────┘

3 rows in set. Elapsed: 0.008 sec.

mdw :) select * from t2 order by id;

SELECT *
FROM t2
ORDER BY id ASC

┌─id─┬─name─┐
│  1 │ aa   │
│  2 │ bb   │
│  3 │ cc   │
│  4 │ dd   │
│  5 │ ee   │
└────┴──────┘

5 rows in set. Elapsed: 0.016 sec.

mdw :) select * from t2_local order by id;

SELECT *
FROM t2_local
ORDER BY id ASC

┌─id─┬─name─┐
│  2 │ bb   │
│  5 │ ee   │
└────┴──────┘

2 rows in set. Elapsed: 0.005 sec.

2)备份

-- 对于分布式分区表,需要对将要下线的服务sdw3的本地表进行备份
sdw3 :) alter table db1.t8_local fetch partition 202002 from '/clickhouse/tables/02-03/t8_local';
sdw3 :) alter table db1.t8_local fetch partition 202007 from '/clickhouse/tables/02-03/t8_local';
sdw3 :) alter table db1.t8_local fetch partition 202101 from '/clickhouse/tables/02-03/t8_local';
-- 将sdw3的备份拷贝到mdw
# scp -r /data/clickhouse-server/data/data/db1/t8_local/detached/* root@mdw:/data/clickhouse-server/data/data/db1/t8_local/detached

-- 对于非分区表,通过客户端将sdw3数据进行导出备份
# clickhouse-client -h 172.16.104.14 --query="select * from db1.t2_local" > t2_local.tsv
# cat t2_local.tsv
1	aa
3	cc
4	dd
-- 将sdw3的备份拷贝到mdw
# scp -r ./t2_local.tsv root@mdw:/root

3)配置文件修改

<clickhouse_remote_servers>
    <!-- Test only shard config for testing distributed storage -->
    <shard2_repl0>
	<shard>
	    <replica>
		<host>mdw</host>
		<port>9000</port>
	    </replica>
	</shard>
<!--                            将需要下线的节点sdw3注释掉
	<shard>
	    <replica>
		<host>sdw3</host>
		<port>9000</port>
	    </replica>
	</shard>
-->
    </shard2_repl0>
</clickhouse_remote_servers>

4)重启mdw服务,关闭sdw3服务

-- 重启mdw服务
# systemctl restart clickhouse-server

-- 关闭sdw3服务
# systemctl stop clickhouse-server

5)将sdw3的数据备份进行数据恢复

-- 进入mdw服务中需要恢复的表分区下,检查目录/文件权限
# cd /data/clickhouse-server/data/data/db1/t8_local/detached
# chown -R clickhouse:clickhouse ./
# ll
总用量 0
drwxr-x--- 2 clickhouse clickhouse 279 2月  22 21:11 202002_0_0_0
drwxr-x--- 2 clickhouse clickhouse 279 2月  22 21:11 202007_0_0_0
drwxr-x--- 2 clickhouse clickhouse 279 2月  22 21:11 202101_0_0_0

-- 对于分布式分区表,将需要恢复的数据恢复至对应表的detached目录下,通过attach进行装载恢复
mdw :) alter table db1.t8_local attach partition 202002;
mdw :) alter table db1.t8_local attach partition 202007;
mdw :) alter table db1.t8_local attach partition 202101;

-- 对于非分区表,通过客户端将备份数据进行导入恢复
# cat t2_local.tsv | clickhouse-client -h 172.16.104.11 --query "insert into db1.t2_local format TSV";

6)集群检查、数据检查

-- 集群检查
mdw :) select * from system.clusters;

SELECT *
FROM system.clusters

┌─cluster──────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard2_repl0 │         1 │            1 │           1 │ mdw       │ 172.16.104.11 │ 9000 │        1 │ default │                  │            0 │                       0 │
└──────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘

1 rows in set. Elapsed: 0.007 sec.

-- 数据检查
mdw :) select * from t2 order by id;

SELECT *
FROM t2
ORDER BY id ASC

┌─id─┬─name─┐
│  1 │ aa   │
│  2 │ bb   │
│  3 │ cc   │
│  4 │ dd   │
│  5 │ ee   │
└────┴──────┘

5 rows in set. Elapsed: 0.008 sec.

mdw :) select * from t8 order by id;

SELECT *
FROM t8
ORDER BY id ASC

┌─id─┬─name─┬─create_date─┐
│  4 │ ww   │  2020-01-02 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│  6 │ dsk  │  2020-07-20 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 12 │ aw   │  2021-01-02 │
│ 17 │ bb   │  2021-01-02 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 19 │ bw   │  2021-02-18 │
│ 21 │ cc   │  2020-01-08 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 32 │ ww   │  2020-02-02 │
└────┴──────┴─────────────┘

7 rows in set. Elapsed: 0.010 sec.
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值