clickhouse(六、集群扩容)

背景

之前公司面临磁盘不足的问题,虽然通过增加磁盘来缓解了。但是clickhouse集群节点扩充是发展迟早要面临的问题,所以尝试思考解决方案。
ck不同于hadoop体系,hdfs当集群增减节点时可以通过balance命令去自动调节。但ck集群不能自动感知集群拓扑变化,也不能自动 balance 数据。当集群数据量较大,复制表和分布式表过多时、想做到表维度、或者集群之间的数据平衡会导致运维成本很高。

方案

这里提供两个解决思路。

复制

当我们追求分布式表在新集群的平衡,数据量不大的情况,可以在新集群简历临时表B、然后将原始表A写入B中,再删除A表重新创建,之后将B表写入A中。
这种方式并不是数据量大、表数量过多的情形。

配置权重

当我们先用磁盘不够用的情况、通过配置权重指定大部分数据写入新的节点,是一种比较可行的方案。只需要配置/etc/metrika.xml 中各个shard的权重即可。

<clickhouse_remote_servers>
        <ck_cluster>
            <shard>
                <weight>99</weight>
                <replica>
                    <host>dc-sit-225</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
             </shard>
             <shard>
				<weight>1</weight>
                <replica>
                    <host>dc-sit-226</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
        </ck_cluster>
    </clickhouse_remote_servers>

列如我这里设置dc-sit-225节点权重为99,dc-sit-226节点权重为1。需要注意的是权重必须大于0(经过测试,小于0时节点会启动失败,等于0时配置不会生效)。

测试

我们创建在集群都创建一个本地表tmp2

CREATE TABLE tmp2 on cluster ck_cluster(`uid` Int32) 
ENGINE =  MergeTree() PARTITION BY uid ORDER BY uid SETTINGS index_granularity = 8192;

以及一个分布式表tmp2_all

CREATE TABLE tmp2_all on cluster ck_cluster as tmp2 ENGINE = 
Distributed(ck_cluster, default, tmp2, rand());

然后向分布式表写入1-100的100条数据

insert into tmp2_all values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),(30),(31),(32),
(33),(34),(35),(36),(37),(38),(39),(40),(41),(42),(43),(44),(45),(46),(47),(48),(49),(50),(51),(52),(53),(54),(55),(56),(57),(58),(59),(60),(61),(62),(63),(64),(65),(66),(67),
(68),(69),(70),(71),(72),(73),(74),(75),(76),(77),(78),(79),(80),(81),(82),(83),(84),(85),(86),(87),(88),(89),(90),(91),(92),(93),(94),(95),(96),(97),(98),(99),(100);

我们当单独查询226的本地表、可以看到tmp2中只有96一条数据,查询分布式表可以看到是有100条数据

扫描二维码关注公众号,回复: 11134136 查看本文章
dc-sit-226 :) select * from tmp2;

SELECT *
FROM tmp2

┌─uid─┐
│  96 │
└─────┘

1 rows in set. Elapsed: 0.004 sec. 

dc-sit-226 :) select count() from tmp2_all;

SELECT count()
FROM tmp2_all

┌─count()─┐
│     100 │
└─────────┘

1 rows in set. Elapsed: 0.088 sec. 

结尾

上述方案是目前个人在实践中学习运用的,能有效扩容集群整体数据承载。clickhouse由于没有balance机制,所以集群扩容不是很方便,如果你有更好的解决思路,欢迎留言指点。

发布了68 篇原创文章 · 获赞 43 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/yyoc97/article/details/105205729