之前公司面临磁盘不足的问题,虽然通过增加磁盘来缓解了。但是clickhouse集群节点扩充是发展迟早要面临的问题,所以尝试思考解决方案。 ck不同于hadoop体系,hdfs当集群增减节点时可以通过balance命令去自动调节。但ck集群不能自动感知集群拓扑变化,也不能自动 balance 数据。当集群数据量较大,复制表和分布式表过多时、想做到表维度、或者集群之间的数据平衡会导致运维成本很高。
这里提供三个解决思路
当我们追求分布式表在新集群的平衡,数据量不大的情况,可以在新集群建立临时表B、然后将原始表A写入B中,再删除A表重新创建,之后将B表写入A中。 这种方式并不是数据量大、表数量过多的情形。
当我们先用磁盘不够用的情况、通过配置权重指定大部分数据写入新的节点,随着时间流逝,原节点具有TTL的部分数据自动删除,数据会趋于均衡,最后调回原始权重。是一种比较可行的方案。只需要配置/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时配置不会生效)。
我们可以给每个节点中的表设置TTL保留时间,随着时间的进行,已经保留时间长的数据会逐渐的被清除掉。到最后,节点的数据会均很分布
优点:横向扩容,配置简单不需要额外操作,只需将每个节点的配置文件更新即可缺点:要想达到数据均衡所需的时间较长,期间查询历史数据还是由原来节点合并完成,没有完全发挥分布式的优势(1)添加分片、副本
<clickhouse_remote_servers> <report_shards_replicas> <shard> <weight>1</weight> <!-- false代表一次性写入所有副本,true表示写入其中一个副本,配合zk来进行数据复制 --> <internal_replication>true</internal_replication> <replica> <host>172.17.0.3</host> <port>9000</port> <user>default</user> <password>default</password> </replica> </shard> <shard> <weight>1</weight> <!-- false代表一次性写入所有副本,true表示写入其中一个副本,配合zk来进行数据复制 --> <internal_replication>true</internal_replication> <replica> <host>172.17.0.4</host> <port>9000</port> <user>default</user> <password>default</password> </replica> </shard> <shard> <weight>1</weight> <!-- false代表一次性写入所有副本,true表示写入其中一个副本,配合zk来进行数据复制 --> <internal_replication>true</internal_replication> <replica> <host>172.17.0.6</host> <port>9000</port> <user>default</user> <password>default</password> </replica> </shard> </report_shards_replicas> </clickhouse_remote_servers>(2)更改macros的参数
<!-- 配置参数:集群名,分片名,副本名 --> <macros> <layer>report_shards_replicas</layer> <shard>01</shard> <replica>cluster-01-1</replica> </macros>步骤:
1、不需要对每一个表来show create table获取表结构,我们复用metadata下的建表语句2、通过代码来进行转换,将metadata的 *.sql 语句中所有的 ATTACH 替换成Create metadata中的sql示例 ATTACH TABLE cs_user_info ( `id` Int32, `user_name` String, `pass_word` String, `phone` String, `email` String, `time` String ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/test/cs_user_info', '{replica}') ORDER BY time SETTINGS index_granularity = 8192 将转化的Sql语句集中保存至某一目录下,eg:/data/salt/clickHouse通过CK的客户端来实现建表语句: $file代表每个sql文件 sudo clickhouse-client -h 172.20.3.xxx --port 9000 -u admin --password 6Ml2IxJN --multiquery < $file在新的服务器上创建相同的表,将需迁移的服务器上的表数据移动到新的服务器对应目录下,然后连接clickhouse执行以下语句:
detach table szt_data_t3; --先将表与数据分离(若表已存在) attach table szt_data_t3; --然后重新添加进来