Kafka迁移指将生产与消费消息的客户端切换成连接新Kafka,部分还涉及将持久化的消息文件迁移到新的Kafka。主要涉及到以下2类场景:
- 业务上云且不希望业务有中断。
在上云过程中,连续性要求高的业务,需要平滑迁移,不能有长时间的中断。
- 在云上变更业务部署
单AZ部署的Kafka实例,不具备AZ之间的容灾能力。用户对可靠性要求提升后,需要迁移到多AZ部署的实例上。
迁移准备
1、配置网络环境
Kafka实例分VPC内以及公网地址两种网络连接方式。如果使用公网地址,则消息生成与消费客户端需要有公网访问权限,并配置如下安全组。
表 安全组规则
方向 | 协议 | 端口 | 源地址 | 说明 |
---|---|---|---|---|
入方向 | TCP | 9094 | 0.0.0.0/0 | 通过公网访问Kafka(关闭SSL加密)。 |
入方向 | TCP | 9095 | 0.0.0.0/0 | 通过公网访问Kafka(开启SSL加密)。 |
2、创建Kafka实例
Kafka的规格不能低于原业务使用的Kafka规格。具体请参考购买Kafka实例。
3、创建Topic
在新的Kafka实例上创建与原Kafka实例相同配置的Topic,包括Topic名称、副本数、分区数、消息老化时间,以及是否同步复制和落盘等。具体请参考创建Topic。
方案一:先迁生产,再迁消费
指先将生产消息的业务迁移到新的Kafka,原Kafka不会有新的消息生产。待原有Kafka实例的消息全部消费完成后,再将消费消息业务迁移到新的Kafka,开始消费新Kafka实例的消息。
1、将生产客户端的Kafka连接地址修改为新Kafka实例的连接地址。
2、重启生产业务,使得生产者将新的消息发送到新Kafka实例中。
3、观察各消费组在原Kafka的消费进度,直到原Kafka中数据都已经被消费完毕。
4、将消费客户端的Kafka连接地址修改为新Kafka实例的连接地址。
5、重启消费业务,使得消费者从新Kafka实例中消费消息。
6、观察消费者是否能正常从新Kafka实例中获取数据。
7、迁移结束。
本方案为业界通用的迁移方案,操作步骤简单,迁移过程由业务侧自主控制,整个过程中消息不会存在乱序问题, 适用于对消息顺序有要求的场景 。但是该方案中需要等待消费者业务直至消费完毕,存在一个时间差的问题,部分数据可能存在较大的端到端时延。
方案二:同时消费,后迁生产
指消费者业务启用多个消费客户端,分别向原Kafka和新Kafka实例消费消息,然后将生产业务切到新Kafka实例,这样能确保所有消息都被及时消费。
1、启动新的消费客户端,配置Kafka连接地址为新Kafka实例的连接地址,消费新Kafka实例中的数据。
说明原有消费客户端需继续运行,消费业务同时消费原Kafka与新Kafka实例的消息。
2、修改生产客户端,Kafka连接地址改为新Kafka实例的连接地址。
3、重启生产客户端,将生产业务迁移到新Kafka实例中。
4、生产业务迁移后,观察连接新Kafka实例的消费业务是否正常。
5、等待原Kafka中数据消费完毕,关闭原有消费业务客户端。
6、迁移结束。
迁移过程由业务自主控制。本方案中消费业务会在一段时间内同时消费原Kafka和新Kafka实例。由于在迁移生产业务之前,已经有消费业务运行在新Kafka实例上,因此不会存在端到端时延的问题。但在迁移生产的开始阶段,同时消费原Kafka与新Kafka实例,会导致部分消息之间的生产顺序无法保证,存在消息乱序的问题。此场景 适用于对端到端时延有要求,却对消息顺序不敏感的业务 。
FAQ:如何将持久化数据也一起迁移
如果需要将原Kafka的已消费数据也迁移到Kafka专享实例,可以使用开源工具MirrorMaker,模拟成原Kafka的消费客户端,以及新Kafka实例的生产客户端,将Kafka所有消息数据迁移到新的Kafka实例。
需要注意的是,天翼云Kafka实例为3副本存储,因此建议实例存储空间为原业务的单副本消息存储的3倍。