前言
異地災備能夠防止一個機房出現災難而致使整個系統沒法提供服務的問題。
異地雙活在異地災備的基礎上減小了數據的冗餘,而且提升了對數據雙向同步及同步實時性的要求。
Kafka做爲在雙活中扮演了很重要的角色,一方面是兩個區域的正常業務的消息數據分發、另外一方面則是elasticsearch等中間件集羣的雙活方案有時須要依賴kafka的雙活。那麼在保證明時性的前提下作好kafka的雙活呢?下面博主拋磚引玉給出本身實現的基於Kafka自帶組件Mirror-Maker的兩種方案,讀者能夠根據本身須要進行改進。git
Kafka-Mirror-Maker
MirrorMaker是Kafka官方提供的用來作跨機房同步的組件。在kafka的安裝目錄的bin目錄下有一個kafka-mirror-maker.sh文件就是MirrorMaker的入口。github
- 工做原理:
一、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
方案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的數量來承載。線程
服務版鏡像地址:https://hub.docker.com/repository/docker/xiao5aha/mirror-maker
服務版鏡像製做地址:https://github.com/KouLouYiMaSi/mirror-maker-service
如何使用這個鏡像
一、對於sasl_plaintext和scram加密,請使用xiao5aha/mirror-maker:v13_sasl版本
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 成本身的鏡像就可使用了
最後
轉載請註明出處。