实战Kafka之异地双活

前言

异地灾备能够防止一个机房出现灾难而致使整个系统没法提供服务的问题。
异地双活在异地灾备的基础上减小了数据的冗余,而且提升了对数据双向同步及同步实时性的要求。
Kafka做为在双活中扮演了很重要的角色,一方面是两个区域的正常业务的消息数据分发、另外一方面则是elasticsearch等中间件集群的双活方案有时须要依赖kafka的双活。那么在保证明时性的前提下作好kafka的双活呢?下面博主抛砖引玉给出本身实现的基于Kafka自带组件Mirror-Maker的两种方案,读者能够根据本身须要进行改进。git

Kafka-Mirror-Maker

MirrorMaker是Kafka官方提供的用来作跨机房同步的组件。在kafka的安装目录的bin目录下有一个kafka-mirror-maker.sh文件就是MirrorMaker的入口。github


image.png
  • 工做原理:

一、MirrorMaker本质上既是一个生产者又是一个消费者
二、MirrorMaker从一个机房的某个主题消费消息,再把消费到的消息生产到另外一个机房的相同的主题下。docker

  • 如何使用:
bin/kafka-mirror-maker.sh --consumer.config consumer.properties  --producer.config producer.properties --num.streams 3 --whitelist=".*"

参数解释:
--producer.config:mirrormaker中的生产者,与咱们常规的生产者配置是同样的,咱们能够参照生产者配置文档进行参数配置
--consumer.config:mirrormaker中的消费者,与咱们常规的消费者配置相同,能够参照消费者配置文档进行参数配置
--num.streams:mirrormaker中消费者线程的个数
--whitelist:mirrormaker中消费者指定消费的主题,.*表示全部主题,常规可使用 | 分割开多个主题。
固然还有不少其余参数,咱们能够执行bin/kafka-mirror-maker.sh --help来查看网络

  • 疑问解答:

一、mirrormaker应该从哪一个机房消费,向哪一个机房生产。
答:应该从异地机房消费向本地机房生产。若是反过来,当网络异常的时候就会产生消费的消息没有及时获得转发。
二、mirrormaker怎么配置生产者和消费者?
答:参照这个连接里的配置 就能够了 https://www.orchome.com/511elasticsearch

方案1、各机房自主题

  • 实现原理

一、假设有北方机房和南方机房须要实现双活
二、南方机房的kafka包含江苏、广东、上海三个topic。北方机房包含黑龙江、甘肃、四川三个topic。每一个机房的消费者只向本身机房的topic生产消息和消费消息。
三、启动两个Mirror-Maker分别负责从北向南同步数据和从南向北同步数据,保证两遍的机房都有六个省份的全量数据。
四、考虑异常状况,若是北方机房挂了或者南方机房挂了,那么另外一个机房都会有全量数据能够提供服务。固然不排除小部分数据丢失,但灾难状况下是没法避免的。ui

各分区自主题.png

方案2、各机房同主题

  • 背景

有的业务不能或者很难作topic主题拆分,这就要求两边机房的主题必须是相同的,而且消费者须要消费全量数据。可是原始的Mirror-Maker有一个特性,若是两遍机房的主题相同,那么互相搬运就会致使死循环消费消息。加密

  • 实现原理:

一、假设有北方机房和南方机房须要实现双活
二、南方机房负责南方全部消息的分发,北方机房负责北方全部消息的分发
三、两方机房都要有全量数据而且主题不能拆分。
四、启动4个mirrormaker,分别负责北->北全、北->南全 、南->南全、南->北全的消息搬运url


各机房同主题
  • 疑问解答:

一、mirrormak只能把消息搬运到另外一个机房的相同主题里,如何解决两个mirrormaker不会出现死循环搬运的问题?
答:MirrorMaker提供了一个--message.handler参数和一个--message.handler.args参数供开发者扩展。咱们能够实现MessageHandler类,来对消息即将生产到的主题进行更改,更改方案github上有现成的,咱们能够会直接使用便可:https://github.com/opencore/mirrormaker_topic_rename
固然你也能够本身实现其余的扩展,这里使用的时候须要注意kafka的版本。
二、如何使用上述的扩展源码呢?
答:很简单。
第1、mvn clean package 打成jar包
第2、export CLASSPATH=/home/sliebau/mmchangetopic-1.0-SNAPSHOT.jar 在你的机器上导入环境变量让kafka可以找到jar包
第3、--consumer.config consumer.properties --producer.config producer.properties --whitelist test_.* --message.handler com.opencore.RenameTopicHandler --message.handler.args `test_source,test_target;test_source2,test_target2` 启动mirrormaker的时候再加上两个参数,前面表示使用的类,后边表示类传入的参数,注意其中的格式。.net

实现高可伸缩

  • 背景:

为了让mirrormaker服务可以随着数据量的增长而自由的伸缩,咱们决定把mirrormaker服务化而且打包成docker。这样当数据量增大的时候咱们能够经过增长mirror-maker的数量来承载。线程

docker run -itd -e SOURCE=消费ip:9092 -e DESTINATION=生产到的ip:9092 -e GROUP_ID=消费者组ID -e USERNAME=用户名 -e PASSWORD=密码 -e FROM_TOPIC_TO_TOPIC="从哪一个主题到哪一个主题使用逗号隔开,多个主题对使用分号隔开" -e CONSUMER_COUNT=消费者数量  -e WHITE_LIST="消费者主题白名单" xiao5aha/mirror-maker:v13_sasl

二、对于没有加密的kafka请使用xiao5aha/mirror-maker:v9版本

docker run -itd -e SOURCE=ip:9092 -e DESTINATION=ip:9092 -e GROUP_ID=group -e MESSAGE_HANDLER=com.opencore.RenameTopicHandler -e MESSAGE_HANDLER_ARGS="nanfang-center,china" -e STREAM_COUNT=3  -e WHITE_LIST="wuxi-center" xiao5aha/mirror-maker:v9
  • 如何制做镜像:

一、从上边的git地址拉下来源码
二、去kafka官网找到你的kafka版本,并下载下来,我这里用的是0.11.0.0,这个版本有个bug,就是在broker重启的时候offset错乱的问题,建议你们本身下一个升级版本
三、用你的kafka版本替换个人kafka版本,注意是整个目录替换哦
四、若是须要修改mirrormaker的producer和consumer配置,打开scripts下边的start.sh,在下边图片部分添加或者删除或者修改。好比去掉其中的用户认证和权限认证。


image.png

五、所有修改完成以后docker build . docker tag 成本身的镜像就可使用了

最后

转载请注明出处。

相关文章
相关标签/搜索