Kafka集群数据迁移方案:基于多Listener配置的集群迁移实践指南

#作者:张桐瑞

文章目录

1概述

MirrorMaker2(后文简称 MM2)在 2019 年 12 月随 Kafka 2.4.0 一起推出。顾名思义,是为了解决 Kafka 集群之间数据复制和数据同步的问题而诞生的 Kafka 官方的数据复制工具。在实际生产中,经常被用来实现 Kafka 数据的备份,迁移和灾备等目的。

1.1使用场景

Kafka MM2适用于下列场景:

  • 远程数据同步:通过MM2,Kafka数据可以在不同地域的集群进行传输复制。
  • 灾备场景:通过MM#2,可以构建不同数据中心的主备两个集群容灾架构,MM2同步两个集群的数据。当其中一个集群不可用时,可以将上面的应用程序切换到另一个集群,从而实现异地容灾功能。
  • 数据迁移场景:在业务上云、混合云、集群升级等场景,存在数据从旧集群迁移到新集群的需求。此时,您可以使用MM2实现新旧数据的迁移,保证业务的连续性。
  • 聚合数据中心场景:通过MM2,可以将多个Kafka子集群的数据同步到一个中心Kafka集群,实现数据的汇聚。

1.2核心架构

MirrorMaker 2 基于 Kafka Connect 框架构建,该框架为数据复制提供了一个分布式、容错的基础架构。与使用简单消费者-生产者对的初代 MirrorMaker 不同,MM2 采用专门的连接器来处理复制过程的不同方面。

MM2 的核心是由一系列协同工作的 Connectors 组成的,主要包括四个:

  • MirrorSourceConnector:负责从源集群(Source Cluster)消费消息,并将其生产到目标集群(Target Cluster)。
  • MirrorCheckpointConnector:负责将源集群中的消费者组(Consumer Group)的消费位移(Offset)同步到目标集群,并以检查点(Checkpoint)的形式记录下来。这对于实现消费者应用的容灾切换至关重要。
  • MirrorHeartbeatConnector:会定期在源集群和目标集群之间发送心跳消息(写入统一命名的内部 Topic heartbeats),用于监控两个集群之间的连接状态和端到端的数据同步延迟。
  • MirrorSinkConnector:当你需要把某个远程主题再写回本地集群、或在聚合集群中汇总多源数据时,就需要它登场;和 MirrorSourceConnector 的方向恰好相反。

1.3功能

Kafka MM2作为数据复制工具,具有以下功能:

  • 复制topics数据以及配置信息。
  • 复制consumer groups及其消费topic的offset信息。
  • 复制ACLs。
  • 自动检测新的topic以及partition。
  • 提供MM2的metrics。
  • 高可用以及可水平扩展的框架。

1.4使用限制

  1. 为保证生产集群的数据完整和安全,必须先在测试集群进行模拟测试
  2. 源集群与目标集群的Kafka软件版本为2.12_2.4.1及以上。
  3. MM2 迁移任务会增加CPU和内存的占用,需根据集群资源负载情况,进行迁移任务,防止因资源抢占导致业务出现中断。

2迁移集群配置说明

2.1关键参数

2.1.1listeners

作用:Broker 实际监听的地址(绑定哪块网卡、哪个端口)。

格式:LISTENER_NAME://host:port(可多个,用逗号分隔)

例:listeners=PLAINTEXT://0.0.0.0:9092(所有网卡都监听 9092)。

2.1.2advertised.listeners

作用:Broker 对外"公布"的地址,客户端真正用来连的地址。

典型用途: 容器 / 云环境中,Broker 监听的是容器内网 IP,但要公布成宿主机公网 IP / 域名。

例:advertised.listeners=INTERNAL://域名:9092,EXTERNAL:// 公网IP:9093

注意: 不能用 0.0.0.0,必须是真实 IP 或域名,不配时,默认等于 listeners 的值。

2.1.3listener.security.protocol.map

作用:把监听器名称映射到安全协议,例如 PLAINTEXT、SSL、SASL_PLAINTEXT、SASL_SSL。

格式:NAME:PROTOCOL,NAME2:PROTOCOL2。

例:listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT

2.1.4inter.broker.listener.name

作用:指定 Broker 之间复制 / 内部通信用哪个 Listener 名称。一般设成走内网的那个,

例:inter.broker.listener.name=INTERNAL

2.2内外网多地址配置方案

2.2.1配置文件参数说明

两集群均需新增可通信地址,并将地址配置在advertised.listeners中,且

假设每个 Kafka 节点有:

  • 内网 IP

  • 外网 IP(或端口映射后对外 IP)

    #################### Listener 相关 ####################

    实际监听的地址(绑定网卡)------内网 + 外网 + controller

    listeners=INTERNAL:// 内网ip或域名:9092,EXTERNAL:// 公网IP:9093,CONTROLLER:// 内网ip或域名:9094

    每个 listener 使用的安全协议,这里全部明文,可按需改成 SSL / SASL

    listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT

    对外公布的地址:内网业务用内网 IP,外网业务用公网 IP

    advertised.listeners=INTERNAL://内网ip或域名:9092,EXTERNAL://公网IP:9093

    Broker 间复制统一走内网

    inter.broker.listener.name=INTERNAL

    Controller 使用的 listener 名称,要在 listeners 中存在

    controller.listener.names=CONTROLLER

客户端连接方式:​

内网程序:bootstrap.servers=内网ip或域名:9092

外网程序:bootstrap.servers=内网ip或域名:9093

注:集群中每个节点都按此模板修改对应的 IP、端口。

2.2.2网络打通说明

如果进行源集群进行向目标集群的数据迁移,则需要能够连接目标集群全部kafka节点的advertised.listeners配置的地址。

如果进行源集群和目标集群的双向数据迁移,则需要两集群都需要能够正常连接advertised.listeners配置的地址。

2.2.3容器环境变量配置

在kubernetes环境下,需要添加或更改如下配置,外部环境并使用NodePort进行访问,需要打通网络,并将localhost更改为打通网络地址。

2.2.3.1控制器ENV配置

复制代码
env:
- name: KAFKA_CFG_LISTENERS
  value: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
- name: KAFKA_CFG_ADVERTISED_LISTENERS
  value: PLAINTEXT://KafkaPod域名:9092,EXTERNAL://localhost:9094
- name: KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP
  value: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT

2.2.3.2外部访问 Service(NodePort)

复制代码
apiVersion: v1
kind: Service
metadata:
  name: kafka-external
spec:
  type: NodePort
  selector:
    app: kafka
  ports:
    - name: external
      port: 29092
      targetPort: 29092
      nodePort: 29092
相关推荐
only-qi2 小时前
RabbitMQ 深度解析:从架构原理到消息全链路可靠性保障
分布式·架构·rabbitmq
隔壁小邓4 小时前
TIDB分布式数据库
数据库·分布式·tidb
蜜獾云4 小时前
Kafka(2)-kafka架构-基本原理
分布式·架构·kafka
隔叶听风4 小时前
RocketMQ 与 Kafka 长轮询详解
数据库·kafka·rocketmq
IvanCodes4 小时前
二、Kafka核心架构与分布式存储
大数据·分布式·架构·kafka
indexsunny4 小时前
互联网大厂Java面试实录:Spring Boot与微服务在电商场景中的应用解析
java·spring boot·面试·kafka·spring security·电商·microservices
空空潍4 小时前
【超详细】RabbitMQ安装延迟消息插件
分布式·rabbitmq
逻极4 小时前
Temporal 完全指南:分布式应用的后台“总指挥”
分布式·微服务·wpf·消息中间件·temporal
deng-c-f4 小时前
Linux C/C++ 学习日记(73):Kafka(一):基本介绍
分布式·学习·kafka