本文共 3369 字,大约阅读时间需要 11 分钟。
自去年年底,我们开始规划从香港到新加坡机房迁移ClickHouse(简称“ck”)集群。目前,ck集群所有实例已成功迁移到新加坡机房,仅留下依赖的Zookeeper(简称“zk”)集群在香港机房。近期,我们计划将zk集群平滑迁移到新加坡机房。
ck集群承载公司实时数据分析需求,支持多线上服务。ck集群不可停机,任何时刻都需保持可用状态。ck的架构设计高度依赖zk进行元数据存储、副本同步及表变更管理。一旦zk不可用,ck的读写都会受到影响。在zk集群迁移期间,leader切换会导致读写问题,这是一个不小的挑战。
为实现目标,我们在迁移过程中采取以下措施:
zk 3.5.0版本后支持动态配置特性,可方便扩容和缩容操作,无需对整个zk集群进行滚动重启。然而,当前ck所用的zk集群尚未采用动态配置,因此迁移的第一步是将zk集群从静态配置版本平滑升级到动态配置版本。升级详情可参考相关文档。
在ck集群升级到动态配置版本后,通过扩容和缩容操作实现zk集群从香港老机房到新加坡新机房的平滑迁移。具体步骤如下:
扩容:将新加坡机房的新机器一台一台加入到zk集群中。
reconfig -add命令逐步添加新机器,确保每台机器加入后检查集群状态和ck读写情况。修改ck配置:将ck配置中的zk服务器列表全部更换为新加坡新机房的IP地址。
缩容:将香港老机房的老机器一台一台从zk集群中摘除。
在升级Follower实例时,发现升级过程中Follower实例会报错:
Follower报错日志如下:java.io.EOFException at java.io.DataInputStream.readInt(DataInputStream.java:392) at org.apache.jute.BinaryInputArchive.readInt(BinaryInputArchive.java:63) at org.apache.zookeeper.server.quorum.QuorumPacket.deserialize(QuorumPacket.java:85) at org.apache.jute.BinaryInputArchive.readRecord(BinaryInputArchive.java:99) at org.apache.zookeeper.server.quorum.Learner.readPacket(Learner.java:158) at org.apache.zookeeper.server.quorum.Learner.registerWithLeader(Learner.java:336) at org.apache.zookeeper.server.quorum.Follower.followLeader(Follower.java:78) at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1271)
此外,尚未升级的Leader实例也会报错:
Leader报错日志如下:java.io.IOException: Follower is ahead of the leader (has a later activated configuration) at org.apache.zookeeper.server.quorum.LearnerHandler.run(LearnerHandler.java:398)
问题原因:
解决方案:
在线下演练过程中发现,修改clickhouse配置文件中的zk服务器列表后,配置变更无法动态加载。
解决方案:CK查询通常不涉及zk交互,因此zk迁移大部分情况下不影响ck查询。
但在开启optimize_trivial_count_query后,对应的select count查询会受到影响。解决方案: optimize_trivial_count_query设置为0,迁移完成后再重新开启。CK写入数据时依赖zk集群分配blockid并同步数据。
解决方案:ck表变更操作(如创建/删除表、新增/删除/修改字段)会访问zk集群。
解决方案:香港机房:A1, A2, A3, A4, A5
新加坡机房:B1, B2, B3, B4, B5初始状态下,zk集群部署于香港机房,初始版本为静态配置版本。
升级路线:静态版本 → 不带config version检查的静态版本 → 动态版本。
reconfig -add命令添加新机器,确保每台机器加入后检查集群状态和ck读写情况。zookeeper-servers列表从旧机器A1-A5更换为新机器B1-B5。reconfig -remove命令逐台摘除老机器,确保每台机器下线后检查集群状态和ck读写情况。通过线下环境中的充分演练,我们及时发现了zk迁移中的各种问题,并采取了相应的解决方案。最终,在ck用户基本无感知的情况下,完成了zk集群从香港到新加坡的平滑迁移。
转载地址:http://ksmfz.baihongyu.com/