操作场景
当您在生产环境上已经使用了自建的 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。


说明:
操作步骤
步骤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 快照导出工具来生成标准的压缩包。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 集群中。
说明:


当合并完成后,可以观察到合并后的集群中只存在一个 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. 完成迁移任务
在观察业务正常后,可以逐渐退出源集群节点的进程,并在完成后点击完成迁移按钮。
说明:
引擎成功完成迁移后,将无法再次开启迁移任务。