kafka迁移

假设要从Kafka-A迁移到Kafka-B,比如从自建集群迁移到云厂商的集群,或者从国内云迁移到国外云。

改kafka配置地址

先将生产者的地址改成B,等消费者消费完所有消息后,将消费者地址改成B。

消费者的信息在Kafka有记录,一般通过group和IP基本上能找齐,生产者的信息需要根据代码和配置找,稍微麻烦一点。

此方法难点在于梳理Kafka生产者和消费者依赖关系。如果kafka开启鉴权的话,可以不漏掉任何一个应用。

优点:

  • 不需要改代码
  • 操作简单,修改配置重启即可

缺点:

  • 生产者和消费者依赖关系稍微复杂一点的话,应用重启顺序会很混乱,同一时间重启不现实。
  • 漏消息:设想应用同时是生产者也是消费者,地址用的也是同一个,改地址重启的话可能会漏消费消息。
  • 无法灰度

双写和双读

生产端:消息同时发送新、老集群,消费端:同时消费两个集群的消息

缺点:

  • 代码改造太多,开发成本太高
  • 发送端双写还好做,消费端双读不好做到幂等

消息同步

官方工具kafka-mirror-maker可以消费老集群指定topic的消息并重新发送到新集群,且发送的时候未指定分区。

初始状态

graph TD
    A1[生产者]--> B1[kafka集群A]--消息同步--> B2[kafka集群B]
    B1-->A2[消费者]

迁移消费者

graph TD
    A1[生产者]--> B1[kafka集群A]--消息同步--> B2[kafka集群B]
    B2-->A2[消费者]

迁移生产者

graph TD
    B1[kafka集群A]--消息同步--> B2[kafka集群B]
    A1[生产者]-->B2-->A2[消费者]

缺点:

  • 这个方案的难点在计算每个分区的消费位点,如何同步和重置offset。 参考:https://blog.csdn.net/x763795151/article/details/121070563

nacos开关方案

本质上也是改kafka配置地址,只不过将配置放到nacos配置中心中,通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更,从而达到不重启应用切换kafka生产者和消费者连接地址。

样例:

producer.test_topic=kafkaB
consumer.test_topic=kafkaA

在前面的kafka使用方式中的代码中,生产者只需要将这个配置传进去,在每次send时判断一下topic==test_topic?, 若相等则使用nacos中的配置,若不相等则使用默认配置。消费者麻烦一点,由于是一个线程,需要加个监听器监听nacos配置是否有变动,若有变动,则重启相应topic的线程,使用新的地址拉取消息消费。由于properteis中的消费者和生产者地址是分开的,可以先切生产者,等消费者消费完A上的消息,再切消费者。 配合kafka的监控可以查看到消息积压情况,也可以按照topic进行灰度切换。如果迁移失败,也可以马上通过nacos应急回滚至kafka01。

这种切换的唯一缺陷就是需要所有应用全部升级到nacos的配置方案。

分类:

更新时间:

留下评论