腾讯云微服务引擎 TSE - Zookeeper 热迁移方案
文档简介:
操作场景:
当您在生产环境上已经使用了自建的 Zookeeper 集群,并希望将其上已运行的服务迁移至腾讯云的 TSE Zookeeper 时,可以通过本指引进行生产环境的平滑热迁移,以保证在迁移过程中不影响现网服务的可用性和稳定性。
操作场景
当您在生产环境上已经使用了自建的 Zookeeper 集群,并希望将其上已运行的服务迁移至腾讯云的 TSE Zookeeper 时,可以通过本指引进行生产环境的平滑热迁移,以保证在迁移过程中不影响现网服务的可用性和稳定性。
本文主要介绍 TSE Zookeeper 通过动态重新配置(Dynamic Reconfig)机制实现平滑迁移的方案和操作步骤,帮助您将自建 Zookeeper 集群迁移至 TSE Zookeeper 集群。
操作原理
Zookeeper 3.5.0 版本增加了动态重新配置(Dynamic Reconfig)功能,支持 Zookeeper 在运行过程中修改节点角色并立刻生效。
本迁移方案利用了动态重新配置机制:
1. 首先通过 Reconfig 操作实现源集群的扩容:将 TSE Zookeeper 的节点作为 Non-voting-follower 角色合并至您的源 Zookeeper 集群,并在数据同步完成后将其动态配置为 Participant。
2. 之后,在新组成的集群中,将源集群上运行的服务滚动修改注册至 TSE Zookeeper 节点。
3. 最后,再次通过 Reconfig 操作实现缩容:将源集群中的节点动态配置为 Non-voting-follower 角色,并逐渐将源集群下线,完成迁移至 TSE Zookeeper。

前提条件
1. 请确保您的源 Zookeeper 集群版本为 3.5.0 以上。如果您的源集群当前版本低,请进行版本升级后再进行迁移操作。
2. 请获取并记录您的源 Zookeeper 集群信息。您可以在 zoo.cfg 文件中查看到源集群信息,请获取源集群各节点的 IP、客户端连接端口、数据同步端口、选举端口。如以下代码中所展示的,数据同步端口为 3888, 选举端口为 2888,客户端连接端口为 2181。
说明:
若server.id中客户端参数项没有配置,则以 clientPort 配置的客户端参数为准。
server.1=10.0.0.12:3888:2888;2181server.2=10.0.0.5:3888:2888;2181server.3=10.0.0.15:3888:2888;2181
3. 登录 TSE 控制台,在相同 VPC 或相通的网络环境下,新建一个 Zookeeper 实例,并获取客户端访问地址。详细操作请参见 引擎管理。 请确保您的 TSE Zookeeper 大版本与源集群大版本一致,如 3.5.X。


说明:
如果您是云梯用户,无需区分 VPC,但如果自建集群端口非标准 2181、2888、3888 请联系TSE团队或 快速提工单 ,以解除 TSE Zookeeper 对非标端口的限制。
操作步骤
步骤1:迁移准备
1. 开启迁移任务
在您的 TSE Zookeeper 引擎实例详情页 - 迁移任务页面,点击开始迁移。
说明:
引擎实例进入迁移状态后,将不可进行重启、修改配置等操作。您的迁移任务进度将被保存,您可以随时退出和继续任务。

2. 连通性测试
请按照 server.id 的顺序填入源集群所有节点的信息,并点击连通性测试。

3. 设置超级管理员
执行 Reconfig 操作需要超级管理员权限,需要获得源集群超级管理员的用户名和密码。
如果您的源集群当前未配置超级管理员,可以根据本步骤生成的 token,在下一步骤中进行配置;如果您的源集群当前已配置超级管理员,请检查是否与本步骤生产的 token 一致,如不一致请更改为一致,源集群超级管理员配置需要与 TSE 集群中的保持一致。


4. 开启源集群 Reconfig 功能
如果您的源集群未开启 Reconfig 功能,请添加以下配置进行开启,后续的迁移步骤依赖于使用 Reconfig 机制;如果您的源集群已开启 Reconfig 功能,请参照以下配置进行检查。
JVM 相关参数配置
在原生 Zookeeper 集群中,可以通过 zoo.cfg 同级目录下创建 java.env 文件来引入 JVM 参数,Zookeeper 集群在启动时将会自动加载此目录下的内容。在 java.env 中我们需要填入如下内容:

或者,您也可以选择在 JVM 启动参数中添加以下内容:
-Dzookeeper.DigestAuthenticationProvider.superDigest=[digest占位符]
说明:
[digest 占位符] 为设置超级管理员时生成的 token。
zoo.cfg 相关参数配置
4lw.commands.whitelist=*quorumListenOnAllIPs=truereconfigEnabled=true
在 zoo.cfg 中添加以上参数。其中:
4lw.commands.whitelist=* 表示开启四字命令。TSE Zookeeper 的迁移任务会使用四字命令来获取源集群各节点的状态。
quorumListenOnAllIPs=true 表示 ZooKeeper 服务器将在所有可用 IP 地址上监听连接,而不仅是在配置文件的服务器列表中配置的地址。TSE Zookeeper 的实例会通过非配置的地址连接上源集群。
reconfigEnabled=true 表示开启 Reconfig 功能。
说明:
如果您计划在迁移中依赖 ZK 原生的日志同步,可以增加 zoo.cfg 中 syncLimit 和 initLimit 时间,推荐为 30。防止数据量大导致 TSE 集群加入之后的同步过程超过预设时间。
步骤2:导入快照(可选)
如果您的源集群中的持久化数据量较大,建议通过导入包含事务日志和快照日志的压缩包的方式,将源集群中的数据提前迁移至 TSE 集群中。
1. 确认源集群 Leader 节点
由于导入的数据最好为最新版本,建议您选取源集群 Leader 节点中的数据进行导出。您可以在 TSE Zookeeper 迁移任务界面查看到源集群 Leader 节点的 IP。

2. 制作快照压缩包
TSE Zookeeper 迁移任务支持导入的快照文件的格式为,名称为:data.tar.gz 的压缩包。
压缩包可以包含节点完整数据的 snap 和 log 日志文件,或者仅包含 snap 的文件。
注意:
如果 data.tar.gz 导入的数据不全,可能会导致集群合并失败。因此,TSE 提供并且建议您使用 TSE ZK 快照导出工具来生成标准的压缩包。
请访问 Github 地址,下载工具 JAR 包,并上传至源集群所在的合适目录下。执行以下命令生成快照文件压缩包:
java -DconfigPath=*/conf/zoo.cfg -jar tar-zookeeper-1.0.0-Beta.jar -n 1
说明:
* 代表源集群 Leader 节点所在的路径。
生成压缩包后,请将文件下载至本地。如果您的源集群部署在 CVM 中,可以通过以下命令下载文件至本地:
sz -e data.tar.gz
3. 上传快照压缩包
在 TSE ZK 迁移任务中,上传导出的快照压缩包。


步骤3:实施迁移
进入迁移任务的第三阶段时,可以观察到源 ZK 集群与 TSE ZK 集群分别存在一个 Leader 节点,并且两个集群中的节点 ID(ZK 节点的 myid)分别为从 1 递增的数字。因为此时合并未开启,两个集群独立存在,如下图中所示:

1. 合并集群
当您准备好开启迁移时,可以点击页面下方的合并集群按钮,TSE ZK 集群中的节点将会重启并以 Non-voting-follower 的角色加入至源 ZK 集群中。
说明:
合并集群过程将持续10~20分钟,如果合并过程中遇到问题,可以 快速提工单 以获取帮助。

当合并完成后,可以观察到合并后的集群中只存在一个 Leader 节点并且来自于源 ZK 集群。 TSE ZK 集群中的节点 ID 变为了延续源集群中节点 ID 的递增数字,TSE ZK 集群中的节点当前全部处于 Non-voting-follower 角色,并且在数据同步完成后,TSE ZK 集群节点的事务 ID 与源 ZK 集群保持为一致。
2. 查看集群信息
在集群成功合并后,TSE ZK 节点已经以 Non-voting-follower 的角色加入了源集群,现在需要通过 Reconfig 操作将 TSE ZK 节点的角色动态配置为 Follower 角色。
首先,通过 zkCli连接至任意源集群中的节点:
zkCli.sh -server [源节点 IP]:[客户端连接端口]
此时可以在 zkCli 中执行 config 命令,查看当前集群的组成。通过以下结果可以观察到,TSE 集群节点虽然已经变成 Follower 加入到集群了,但是目前还只是 Non-voting-follower 节点,我们需要通过 Reconfig 功能,将其正式加入到集群中。
[zk: 10.0.0.12:2181(CONNECTED) 0] configserver.1=10.0.0.12:2888:3888:participant;0.0.0.0:2181server.2=10.0.0.5:2888:3888:participant;0.0.0.0:2181server.3=10.0.0.15:2888:3888:participant;0.0.0.0:2181version=a00000000
3. 输入超级管理员权限
由于 Reconfig 功能需要管理员才能操作,这里我们需要通过 addAuth 命令完成管理员身份认证。管理员的用户名密码为步骤1中设置的用户名密码。
addauth digest [用户名]:[密码]
4. 滚动加入新节点
TSE 集群的选举端口、数据同步端口、客户端端口默认分别是:3888、2888、2181。因此,reconfig add 命令有以下两种可选方式将 TSE 节点加入到集群中,您可以根据自己的业务权衡:
警告:
请注意务必以节点 ID 从小到大的顺序添加新节点,并在实施迁移过程中保持集群中的 server.ID 与控制台中展示的节点 ID 一致。
方式一:以 participant 加入到源zk集群中
reconfig -add [节点id]=[ip]:2888:3888:participant;2181
方式二:将节点以 observer 加入到源zk集群中
reconfig -add [节点id]=[ip]:2888:3888:observer;2181
说明:
如果您选择以方式二将 TSE ZK 集群加入到源集群中,那么在移除源集群节点前,需要使用方式一将 TSE ZK 集群节点转为 follower 加入到集群中来。
这里直接以方式一作为示例:
[zk: 10.0.0.12:21811(CONNECTED) 5] reconfig -add 4=10.0.0.28:2888:3888:participant;2181[zk: 10.0.0.12:21811(CONNECTED) 6] reconfig -add 5=10.0.0.49:2888:3888:participant;2181[zk: 10.0.0.12:21811(CONNECTED) 7] reconfig -add 6=10.0.0.19:2888:3888:participant;2181Committed new configuration:server.1=10.0.0.12:2888:3888:participant;0.0.0.0:2181server.2=10.0.0.5:2888:3888:participant;0.0.0.0:2181server.3=10.0.0.15:2888:3888:participant;0.0.0.0:2181server.4=10.0.0.112:2888:3888:participant;0.0.0.0:2181server.5=10.0.0.36:2888:3888:participant;0.0.0.0:2181server.6=10.0.0.34:2888:3888:participant;0.0.0.0:2181version=a00000019
以上操作将 TSE ZK 集群中的三个节点通过 Reconfig 作为 follower 加入了合并集群,可以通过最新的 config 内容以及控制台上增加的事务 ID 观察到 Reconfig 已经生效。

5. 迁移服务
在开启迁移服务前,请先确认数据同步已完成,这里可以通过两种方式进行观察确认。
方式一:TSE ZK 集群节点的事务 ID 在合并集群中是否已占据多数。
方式二:TSE ZK 控制台 - 数据管理页面中查看是否源集群中的数据已经完成迁移。
通过以上两种方式确认数据同步完成后,可以依次重启在源集群之上运行的服务,并将其注册地址改为 TSE ZK 的客户端访问地址。
6. 滚动移除旧节点
在完成以上全部步骤后,可以通过 reconfig -remove 命令将源集群节点从合并集群中移除:
reconfig -remove [节点id]
注意:
在移除源集群节点的过程中,为了集群的稳定性,请最后一个移除 Leader 节点。
在本示例中,server.3 是 Leader 节点,因此将以1、2、3的顺序移除旧节点:
[zk: 10.0.0.12:21811(CONNECTED) 8] reconfig -remove 1[zk: 10.0.0.12:21811(CONNECTED) 9] reconfig -remove 2[zk: 10.0.0.12:21811(CONNECTED) 10] reconfig -remove 3Committed new configuration:server.4=10.0.0.112:2888:3888:participant;0.0.0.0:2181server.5=10.0.0.36:2888:3888:participant;0.0.0.0:2181server.6=10.0.0.34:2888:3888:participant;0.0.0.0:2181version=a00000022
由于 Leader 节点的移除,集群会发生选举,并存在秒级的断连。
我们可以观察到源集群里面的节点都转为 Follower,TSE ZK 集群里面的节点出现了 Leader 节点。

7. 完成迁移任务
在观察业务正常后,可以逐渐退出源集群节点的进程,并在完成后点击完成迁移按钮。
说明:
引擎成功完成迁移后,将无法再次开启迁移任务。