导读
Kafka 是最广泛使用的大数据消息分发组件,由于各种原因,大部分 Kafka 的用户都在不同的环境下保有多个集群,而数据整合分析的需求又要求这些集群的数据可以汇聚到一起。于是集群间的数据镜像成为了 Kafka 的一个重要需求。本文将详细描述集群间信息复制的场景和方案。
作者介绍
徐为
腾讯云微服务团队高级解决方案构架师
毕业于欧盟 Erasmus Mundus IMMIT,获得经济和IT管理硕士学位
自2006年以来,曾就职于SonyEricsson、SAP、Alibaba Cloud等多家公司,历任软件开发工程师,数据开发工程师,解决方案架构师
集群复制场景
Kafka 集群复制主要有2个场景,一个是基于地理位置的场景,一个是基于业务生命周期的场景。
- 基于地理位置的场景
跨国跨地域的公司由于性能,法规等要求,在业务所在地创建了 Kafka 集群对当地的业务数据进行收集和处理。在相应客户需求之外,这部分源数据也是母公司对整个业务线进行分析和考核的重要组成部分,于是把数据以镜像的形式传递回母公司所在的区域也成为了一个非常重要的业务流程。
“分公司数据向母公司汇聚”
- 基于业务生命周期的场景
另一个场景由业务数据生命周期的属性决定。有些业务比如 IoT 和 V2X,在接入云端时整个 Kafka 集群的任务就是实时的汇聚和分发。很多数据在分发出去之后又被导入到另一个 Topic 继续汇聚和分发。
在业务的高峰时刻,所有的计算资源都被用来处理实时业务。存储介质也倾向更快的读取能力,为了解决开销,存储的大小会被尽量的压缩。而到了业务低峰期,所有的计算资源都可以被拿来处理积攒一天的数据,数据的读取速度不用最大的优化,但是存储量最好足够大,因为有时候夜间需要把之前一周的数据重新跑一遍。这个场景里,性能优化的 Kafka 集群会把数据同步到存储价格最优的 Kafka 集群。
“实时数据集群向线下数据分析集群汇聚”
这2个场景涉及不同可用区(Availability Zone)或者不同地域(Region),但是万变不离其宗,本质上是2个网络互连互通的 Kafka 集群之间的数据镜像处理。
- 集群复制前提
如果2个或者多个集群想做复制,首先要考虑的是网络互连互通的问题。基于当前腾讯云网络的结构,主要需要考虑 VPC 之间的互连互通逻辑。解决方案都在 VPC 的服务下,一个是云联网,一个是对等链接。
架构示意图如下,取自腾讯云官网:
对等链接是相对较早的 VPC Peering 方案,而云联网是近几年比较火的 SD-WAN 的解决方案,不管哪一种,都可以做到网络互连互通。
集群复制方案
目前集群复制方案有2个,一个叫 MirrorMaker ,一个叫 Confluent Replicator 。MirrorMaker 是相对简单的 stand-alone 工具,针对 Kafka 的2个集群做点对点的复制。而 Replicator 的方案更复杂也支持更多的功能。下面针对两个方案做了一个对比,摘自 MirrorMaker 的官方文档:
具体实施
- MirrorMaker
1. 创建 Kafka 原集群和目标集群,并确保网络互连互通 – 这里的 Kafka 可以是自建集群也可以是托管版本的 CKafka 集群。
2. 在某一台可以同时连接两个 Kafka 集群的 CVM 上下载 Kafka 的包,然后准备配置文件如下:
代码语言:javascript复制# Consumer指向源Kafka集群
$ cat sourceClusterConsumer.config
bootstrap.servers=172.16.0.4:9092 # source server access endpoint
exclude.internal.topics=true
client.id=mirror_maker_consumer
group.id=mirror_maker_consumer
代码语言:javascript复制# Producer指向目标Kafka集群
$ cat targetClusterConsumer.config
bootstrap.servers=localhost:9092 # target server access endpoint
acks=1
batch.size=50
client.id=mirror_maker_test_producer
3. 在配置好之后,用下面的命令(需要调整好路径,和需要同步的 topic )来做拉取和向目标写入。
代码语言:javascript复制/bin/kafka-mirror-maker.sh --consumer.config ./demo-config/sourceClusterConsumer.config --num.streams 1 --producer.config ./demo-config/targetClusterConsumer.config -whitelist=".*"
4. 在这个命令执行之后,可以在目标的 Kafka 机器跑一个 Consumer 来验证数据。
- Confluent Replicator
第二个方案从设计角度更加完善,考虑了更多的容错和支持更多的功能。
方案本身和上面的 MirrorMaker 很像:
1. 创建 Kafka 原集群和目标集群,并确保网络互连互通 – 这里的 Kafka 可以是自建集群也可以是托管版本的CKafka集群
2. 在某一台可以同时连接2个 Kafka 集群的 CVM 上下载 Kafka 的包,然后准备配置文件如下
3. 用下面的命令来(需要调整好路径,和需要同步的 topic )来做拉取和向目标写入
代码语言:javascript复制./bin/replicator --cluster.id replicator --consumer.config my-examples/consumer.properties --producer.config my-examples/producer.properties --replication.config my-examples/replication.properties --whitelist 'test-topic'
其中两个额外的参数:
代码语言:javascript复制--cluster.id - An identifier used to determine which Replicator cluster this executable should join. Multiple Replicator executable instances with the same cluster.id will work together. Replicator是以多个instance来复制的逻辑,只要cluster Id一样的,就可以协同工作。
--replication.config - The path to a file containing any non connection specific configuration. Command line arguments will override these configurations. 其他的和连接无关的参数配置。
具体的配置可以参考 :
https://docs.confluent.io/platform/current/multi-dc-deployments/replicator/replicator-run.html#replicator-executable-command-line-parameters
4. 在这个命令执行之后,可以在目标的 Kafka 机器跑一个 Consumer 来验证数据。
参考文档
云联网:
https://cloud.tencent.com/document/product/877/18675
对等链接:
https://cloud.tencent.com/document/product/553
MirrorMaker 官方文档:
https://docs.confluent.io/4.0.0/multi-dc/mirrormaker.html
CKafka集群:
https://cloud.tencent.com/product/ckafka
https://dzone.com/articles/how-to-use-mirrormaker-with-apache-kafka-clusters
https://docs.confluent.io/platform/current/multi-dc-deployments/replicator/replicator-quickstart.html