apache-kafka-3.2.0集群复制详解

apache-kafka-3.2.0集群复制详解

文章目录

  • apache-kafka-3.2.0集群复制详解
  • 1 mirror maker简介
  • 2 mirror maker2简介
    • 2.1 mirror maker2架构
    • 2.2 mirror maker2内部topic
      • 2.2.1 heartbeat topic
      • 2.2.2 checkpoints topic
      • 2.2.3 offset sync
    • 2.3 mirror maker2独立集群部署
  • 参考文档

​ 本文将展示如何基于apache-kafka-3.2.0实现集群复制

1 mirror maker简介

​ 在kafka早先版本的时候,kafka针对这种场景就有推出一个叫mirror maker的工具(mirror maker1,以下mm1即代表mirror maker1),用来同步两个kafka集群的数据。

​ 最开始版本的mirror maker本质上就是一个消费者 + 生产者的程序。但它有诸多诸多不足,包括

  1. 目标集群的Topic使用默认配置创建,但通常需要手动repartition。
  2. acl和配置修改的时候不会自动同步,给多集群管理带来一些困难
  3. 消息会被DefaultPartitioner打散到不同分区,即对一个topic ,目标集群的partition与源集群的partition不一致。
  4. 任何配置修改,都会使得集群变得不稳定。比如比较常见的增加topic到whitelist。
  5. 无法让源集群的producer或consumer直接使用目标集群的topic。
  6. 不保证exactly-once,可能出现重复数据到情况
  7. mm1支持的数据备份模式较简单,比如无法支持active <-> active互备
  8. rebalance会导致延迟

​ 因为存在这些问题,mirror maker难以在生产环境中使用。所以kafka2.4版本,推出一个新的mirror maker2(以下mm2即代表mirror maker2)。mirror maker2基于kafka connect工具,解决了上面说的大部分问题。

​ 今天主要介绍mirror maker2的设计,主要功能和部署。

2 mirror maker2简介

​ mirror maker2是基于kafka connect框架进行开发的,可以简单地将mirror maker2视作几个source connectorsink connector的组合。包括:

  • MirrorSourceConnector, MirrorSourceTask:用来进行同步数据的connector
  • MirrorCheckpointConnector, MirrorCheckpointTask:用来同步辅助信息的connector,这里的辅助信息主要是consumer的offset
  • MirrorHeartbeatConnector, MirrorHeartbeatTask:维持心跳的connector

​ 不过虽然mirror maker2基于kafka connect框架,但它却做了一定的改造,可以单独部署一个mirror maker2集群,当然也可以部署在kafka connect单机或kafka connect集群环境上。这部分后面介绍部署的时候再介绍。

​ 和mm1一样,在最简单的主从备份场景中,mm2建议部署在目标(target)集群,即从远端消费然后本地写入。如果部署在源集群端,那么出错的时候可能会出现丢数据的情况。

2.1 mirror maker2架构

apache-kafka-3.2.0集群复制详解_第1张图片

2.2 mirror maker2内部topic

​ mm2会在kafka生成多个内部topic ,来存储源集群topic相关的状态和配置信息,以及维持心跳。主要有三个内部topic:

2.2.1 heartbeat topic

​ 在默认的配置中,源集群和目标集群都会有一个用于发送心跳的topic,consumer 客户端通过这个 topic,一方面可以确认当前的 connector 是否存活,另一方面确认源集群是否处于可用状态。

heartbeat topic的schema如下:

  • target cluster:接收心跳集群
  • source cluster:发送心跳的集群
  • timestamp:时间戳

2.2.2 checkpoints topic

​ 对应的connector(即MirrorCheckpointConnector)会定期向目标集群发送checkpoint信息,主要是consumer group提交的offset ,以及相关辅助信息。

​ checkpoints topic 的schema如下:

  • consumer group id (String)
  • topic (String) :包含源集群和目标集群的 topic
  • partition (int)
  • upstream offset (int): 源集群指定consumer group已提交的offset(latest committed offset in source cluster)
  • downstream offset (int): 目标集群已同步的offset(latest committed offset translated to target cluster)
  • metadata (String):partition元数据
  • timestamp

mm2提供的另一个功能,consumer切换集群消费就是通过这个topic实现的。因为这个topic中存放了源集群consumer group的消费offset,在某些场景(比如源集群故障)下要切换consumer到目标集群,就可以通过这个topic获取消费offset然后继续消费。

2.2.3 offset sync

​ 这个topic ,主要是在两个集群间同步topic partition的offset。这里的offset并不是consumer的offset,而是日志的offset。

​ 它的 schema 如下:

  • topic (String):topic 名
  • partition (int)
  • upstream offset (int):源集群的 offset
  • downstream offset (int):目标集群的 offset,和源集群的应该保持一致

2.3 mirror maker2独立集群部署

​ 需要有两个独立的kafka集群,前面已经搭建了一个(ip为:192.168.123.103),然后可以再用两样的办法在另一个机器 上(ip为:192.168.123.113)再搭建一个;

​ 然后部署mm2集群,在config/写个配置文件(这里命名为:connect-103-113-mm.properties):

clusters = A, B

# connection information for each cluster
# This is a comma separated host:port pairs for each cluster
# for e.g. "A_host1:9092, A_host2:9092, A_host3:9092"
A.bootstrap.servers = 192.168.123.103:19092,192.168.123.103:29092,192.168.123.103:39092
B.bootstrap.servers = 192.168.123.113:19092,192.168.123.113:29092,192.168.123.113:39092

# enable and configure individual replication flows
A->B.enabled = true

# regex which defines which topics gets replicated. For eg "foo-.*"
A->B.topics = .*

# B->A.enabled = true
# B->A.topics = .*

# Setting replication factor of newly created remote topics
replication.factor=1

############################# Internal Topic Settings  #############################
# The replication factor for mm2 internal topics "heartbeats", "B.checkpoints.internal" and
# "mm2-offset-syncs.B.internal"
# For anything other than development testing, a value greater than 1 is recommended to ensure availability such as 3.
checkpoints.topic.replication.factor=1
heartbeats.topic.replication.factor=1
offset-syncs.topic.replication.factor=1

# The replication factor for connect internal topics "mm2-configs.B.internal", "mm2-offsets.B.internal" and
# "mm2-status.B.internal"
# For anything other than development testing, a value greater than 1 is recommended to ensure availability such as 3.
offset.storage.replication.factor=1
status.storage.replication.factor=1
config.storage.replication.factor=1

​ 然后使用一条命令就可以启动了:

./bin/connect-mirror-maker.sh ./config/connect-103-113-mm.properties

​ mm2集群,一般是在目标集群上部署;

​ 启动后用jps观察进程,再list下topic,可以发现多了许多个topic,这种时候应该就启动成功了。
apache-kafka-3.2.0集群复制详解_第2张图片
​ 先在目标集群机器上查看主题:

./bin/kafka-topics.sh --list --bootstrap-server 192.168.123.113:19092

​ 结果显示:
image-mm2-topics-list
​ 在源集群机器开启一个消费主题的客户端:

./bin/kafka-console-consumer.sh --bootstrap-server 192.168.123.103:29092 --topic yx-test

​ 在目标集群机器开启一个消费主题的客户端:

./bin/kafka-console-consumer.sh --bootstrap-server 192.168.123.113:39092 --topic A.yx-test

​ 在源集群上生产消息:
image-mm2-src-producer
​ 在源集群上消费消息:
image-mm2-src-consumer
​ 在目标集群上消费消息:
image-mm2-dest-consumer

​ 由此可见,数据同步成功;

​ 最后,还做了些异常情况模拟,比如mm2集群跨掉,或源端跨掉、目标端跨掉的情况,最后数据都能完美的进行同步;

参考文档

(1):KIP-382: MirrorMaker 2.0
(2):kafka异步双活方案 mirror maker2深度解析

你可能感兴趣的:(geo-replication,kafka,apache)