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
相关推荐
qq_297574671 小时前
第十四篇:RabbitMQ监控与日志分析——快速排查线上问题
分布式·rabbitmq·ruby
小的~~1 小时前
CentOS7安装CDH6.3.2
hive·hdfs·kafka
2401_840192273 小时前
k8s的crd、operator、cr分别是什么?
运维·分布式·kubernetes·prometheus
covco5 小时前
星链引擎矩阵系统:分布式任务调度与万级账号批量作业自动化技术实践
分布式·矩阵·自动化·批量作业
Little Tomato7 小时前
深入浅出高并发:从 JVM 锁竞争到分布式事务的性能博弈
jvm·分布式
zshs0008 小时前
从 Raft 到 MySQL:我是怎么推导出半同步复制原理的
数据库·分布式·mysql
凯瑟琳.奥古斯特8 小时前
页面置换算法详解与对比
开发语言·分布式·职场和发展
KANGBboy9 小时前
hadoop冷热数据分离
大数据·hadoop·分布式
skilllite作者9 小时前
Evotown——开启本地化、可验证的AI智能体进化新时代
人工智能·分布式·安全·搜索引擎·agentskills
敏君宝爸10 小时前
RabbitMQ多线程消费与死信队列方案
分布式·rabbitmq