CK集群迁云实施方案
背景与需求
某企业大数据业务需迁至阿里云环境,其中涉及多套CK集群,业务要求停机切换时间尽可能短,需对数据进行增量迁移;
需迁移的业务,有多个CK集群,总共几百多张表,最大的表占用空间10T左右,另外源端建表不规范,目标端需统一调整表结构。
实施方案
01
迁移方法
利用remote函数远程复制表数据,借助脚本进行迁移,remote语句如下:
INSERT INTO $目标端库名.$目标端分布式表名 SELECT * FROM remote('$源端CK节点的IP:$端口,......,$源端CK节点的IP:$端口',$源端库名,$源端本地表名,'$源端用户名','$源端密码') WHERE $where条件
02
脚本逻辑
涉及多个脚本,包括表结构同步、数据迁移、对比校验、覆盖重迁;
数据迁移的脚本会读取表的分区信息,依次迁移各分区数据至目标端,每当remote命令迁移一个分区,脚本执行时就会确认remote命令执行的数量,令数量小于指定值来实现并发,所以迁移时可灵活调整并发提高迁移速率;
迁移后会用校验脚本进行对比校验,确认迁移脚本输出是否有异常,校验时先进行整表校验,整表数据量不一致时再按分区校验;
校验后对于数据不一致的表,需确认好不一致的分区,用覆盖脚本对不一致分区进行针对性覆盖重迁,重迁后再次校验。
03
如何实现增量迁移
全量迁移结束后,业务在源端、目标端配置了双写任务,理论上双写的数据在源、目标端应该是一致的,所以只需确保双写前的历史数据一致即可。
但由于配置的双写任务在目标端执行时有时会失败,导致双写后源与目标的数据并不一致,所以需对双写后的数据进行校验,如果数据不一致就覆盖重迁。
双写是按日期的分区增量进行的,待新增的分区双写结束后,才可对此分区进行校验、覆盖重迁;另外每张表双写的新增分区的数量不同,有些表会对近5天的分区数据都进行双写,所以需要根据业务需求灵活配置校验重迁任务;
双写后数据不一致导致后期增量迁移的工作量巨大,理论上业务不双写,用脚本对表的新分区进行迁移校验即可满足增量需求。
04
相关问题及处理方法
1、表结构调整
如源端本地表引擎是MergeTree的,目标端需统一替换为ReplicatedMergeTree;如源端本地表引擎是ReplacingMergeTree的,目标端需统一替换为ReplicatedReplacingMergeTree。表结构同步脚本,会对引擎进行识别替换,另外数据迁移前需对表结构进行核实确认;
源端部分分布式表没有拆分规则,在目标端需统一用rand()的拆分规则;
源端部分表有配置TTL生命周期,目标端也需配置;
另外迁移过程中,源端会对表结构进行调整或者新增表,此时目标端也需做相同的调整。
2、源端表使用不规范问题
源端有些表使用不规范,具体表现包括有些表无分区、有些表只在单节点存在、只有本地表没有分布式表、本地表与分布式表结构不一致等;
针对以上问题,源端表可以做调整的,就进行规范调整令其适配迁移脚本;源端表无法调整的,则修改迁移脚本令其适配特殊情况。
3、本地表数据分布问题
源端部分本地表的数据,不是按分布式表的拆分规则分布的,而是直接按业务的某种需求写入本地表;
比如业务会将5月份的数据直接存放在节点1的本地表1中,6月份的数据直接存放在节点2的本地表2中,数据不会插入分布式表并按照分布式表的拆分规则分布;
业务的需求是确保数据迁移后,目标端本地表的数据分布与源端相同。
处理办法:目标端创建rand()拆分规则的分布式bak表和本地bak表,再创建与源端结构相同的分布式表和本地表;将源端数据先迁至目标端bak表中,业务再将目标端bak表的数据reshard重写至目标端非bak本地表中,最终结果是目标端各本地表的数据分布与源端各本地表的数据分布相同。
4、ReplacingMergeTree引擎的表数据校验问题
源端少部分表用的是ReplacingMergeTree引擎,数据只在相同节点唯一,即整体的分布式表可能还存在数据重复的问题。另外迁移过程中源端后台可能进行optimize,导致迁移后源、目标端分布式表的count结果不完全相同等情况,所以数据验证时需验证表的唯一值是否一致。
5、副本问题
源端部分集群是多个副本,而副本数据相同,只所以需从其中1个副本的本地表中读取数据并写入目标端即可,避免数据重复。
6、大表问题
源端最大的表占用空间10T左右,表按日期分区,即使只迁1个分区数据,量也很大且耗时很长,大表整体迁移速度缓慢;
将大表在分区的基础上,用其它列将每个分区的数据进一步拆成多份,对小份数据并发迁移提高迁移速度。
7、覆盖重迁问题
覆盖重迁需先删除目标端数据不一致的分区再进行重迁,Clickouse的delete是将不需删除的数据重写,待下一次后台合并时才能物理删除,消耗很大,需用drop partiton命令删除分区。
8、并发问题
迁移时需设置一定并发提高迁移速度,但并发过大会影响源端业务的正常使用;并发动态调整可控,白天并发低、晚上并发高,非工作日并发会更加高。
迁移结果
确保CK集群数据按客户需求全量+增量迁至云上环境,业务停机切换时间较短,迁移后数据一致。