[TOC]
第一節(jié) Kafka 集群
承前
如果你是開(kāi)發(fā), 對(duì)搭建kafka集群沒(méi)什么興趣, 可以跳過(guò)這一章, 直接看明天的內(nèi)容.
如果你覺(jué)得多了解一點(diǎn)沒(méi)有什么壞處的話(huà), 請(qǐng)繼續(xù)看下去.
提醒一下, 本章圖多
Kafka 集群搭建
概述
kafka集群的搭建還是比較繁瑣的, 雖然只是下載文件,修改配置,但數(shù)據(jù)比較多.
基本環(huán)境需要3臺(tái)zk服務(wù)器 和3臺(tái) kafka服務(wù)器.
操作流程
看圖

看上去就比較長(zhǎng), 所以我不用這種方法, 使用docker 來(lái)簡(jiǎn)化一點(diǎn)流程.
Kafka 集群快速搭建
安裝 Docker
算復(fù)習(xí)
uname -a
yum -y install docker
service docker start
# 或
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
鏡像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://uzoia35z.mirror.aliyuncs.com"]
}
zookeeper集群
docker-compose 已裝好
新建docker網(wǎng)絡(luò)
docker network create --driver bridge --subnet 172.29.0.0/25 \
--gateway 172.29.0.1 elk_zoo
docker network ls
yml 腳本
配置太長(zhǎng),這里先放個(gè)結(jié)構(gòu), 源文件稍后會(huì)放在博客上.

列出的項(xiàng)目基本都要配置, 重點(diǎn)注意:
- ports: # 端口
- volumes: # 掛載卷
- environment: 環(huán)境變量
- networks: 有兩部分, ip 和共有網(wǎng)絡(luò)
請(qǐng)參考配置文件印證.
docker-compose up -d
驗(yàn)證
ZooInspector
cd zookeeper/src/contrib/zooinspector/
# 打開(kāi)失敗,需要驗(yàn)證
Kafka集群
鏡像
docker pull wurstmeister/kafka
docker pull sheepkiller/kafka-manager
yml 腳本
配置太長(zhǎng),這里先放個(gè)結(jié)構(gòu), 源文件稍后會(huì)放在博客上.

? 列出的項(xiàng)目基本都要配置, 重點(diǎn)注意:
- ports: # 端口
- volumes: # 掛載卷
- environment: 環(huán)境變量
- external_links 外連
- networks: 有兩部分, ip 和共有網(wǎng)絡(luò)
請(qǐng)參考配置文件印證.
docker-compose up -d
驗(yàn)證

使用 kafka-manager 的管理頁(yè)面,本機(jī)ip加9000端口

搞定收工.
本著對(duì)懶惰之神的信仰, 用docker短時(shí)間搞定了集群的搭建, 鼓掌.
明天開(kāi)始命令行實(shí)操,敬請(qǐng)期待.
今天的三張圖都比較復(fù)雜, 不需要記憶, 對(duì)照配置文件理清楚流程即可.
第二節(jié) 集群管理工具
先來(lái)一個(gè)問(wèn)題吧, 昨天我搭完了kafka的集群, 管理工具也裝好了, 一切如截圖所示.
有沒(méi)有同學(xué)能看出或猜出該集群存在的問(wèn)題呢? 對(duì)自己有信心的可以加我好友私聊, 思路對(duì)的話(huà), 我也可以發(fā)個(gè)小紅包鼓勵(lì)的.
集群管理工具
概述
kafa-manager 是一個(gè)常用的 kafka集群管理工具, 類(lèi)似工具還有很多, 也有公司自己開(kāi)發(fā)類(lèi)型的工具.
操作流程
當(dāng)集群配置好之后, 可以通過(guò)瀏覽器登錄kafa-manager , 并添加集群管理.

添加完畢后, 會(huì)顯示這樣
查看Broker信息

點(diǎn)擊Topic 可以查看Topic

再點(diǎn)擊可以進(jìn)行單條信息的設(shè)置

其他
Preferred Replica Election
Reassign Partitions
Consumers
分別涉及副本選舉, 分區(qū)和消費(fèi)者, 后續(xù)講到了再介紹.
因?yàn)榧簞偨ê? 很多信息會(huì)看不到,后面幾篇會(huì)結(jié)合命令行操作一同展示.
集群 Issues
下面記錄一些常見(jiàn)故障,及排查思路:
-
單機(jī)可以用, 集群發(fā)送信息失敗
host 名字不能設(shè)置為127.0.0.1
-
升級(jí)后不能消費(fèi)信息
檢查 默認(rèn)的topic
__consumer_offsets
-
響應(yīng)比較慢
使用性能測(cè)試腳本:
kafka-producer-perf-test.sh
分析生成報(bào)告
檢查 jstack信息 或定位源碼排查
-
日志持續(xù)報(bào)異常
檢查kafka日志, 檢查GC日志, 檢查zk日志和GC日志, 檢查節(jié)點(diǎn)內(nèi)存監(jiān)控
最后把報(bào)異常的節(jié)點(diǎn)下線(xiàn)再回復(fù)解決
-
docker遇到 掛載數(shù)據(jù)卷無(wú)限重啟
查看logs發(fā)現(xiàn)沒(méi)權(quán)限, 配置
privileged: true
-
docker里運(yùn)行kafka命令時(shí)提示地址被占用
unset JMX_PORT;bin/kafka-topics.sh ..
比較取巧的一個(gè)辦法, 取消掉 kafka-env.sh 腳本定義了JMX_PORT變量.
第三節(jié) 使用命令操縱集群
正常情況下, Kafka都是通過(guò)代碼連接的.
但是, 偶然你想確認(rèn)下是Kafka錯(cuò)了,還是你的代碼錯(cuò)了.
或者并沒(méi)有條件及時(shí)間搞出一段代碼的時(shí)候, 簡(jiǎn)單用命令行還是可以的.
docker
docker inspect zookeeper
zookeeper
集群查看
? 登錄集群,判斷狀態(tài)
docker exec -it zoo1 bash
zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Mode: leader
# 注意 Mode: standalone 為單機(jī)
? 配置文件
如果狀態(tài)是單機(jī), 檢查以下文件:
vi zoo.cfg # server.1=zoo1:2888:3888 之類(lèi), 多臺(tái)
vi myid # 1或2等
# 也可能是環(huán)境變量形式
ZOO_MY_ID=3 \
ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888"
? 啟動(dòng)zk集群
./zkServer.sh start
jps # QuorumPeerMain
kafka查看
docker exec -it zoo1 bash
zkCli.sh
ls /
ls /brokers/ids
# 查看kafka 的節(jié)點(diǎn)id
[1, 2, 3]
topic
創(chuàng)建topic
注意, 以下命令全部在kafka的目錄下執(zhí)行
cd /opt/kafka_2.12-2.3.0/
unset JMX_PORT;bin/kafka-topics.sh --create --zookeeper zoo1:2181 --replication-factor 1 --partitions 1 --topic test1
# 加參數(shù) --bootstrap-server localhost:9091 可以用自帶zk
# --config delete.retention.ms=21600000 日志保留6小時(shí)
創(chuàng)建集群topic
副本因子1, 分區(qū)數(shù)3, 名字為test.
unset JMX_PORT;bin/kafka-topics.sh --create --zookeeper zoo1:2181,zoo2:2181,zoo3:2181 --replication-factor 1 --partitions 3 --topic test
查看topic
列表及詳情
unset JMX_PORT; bin/kafka-topics.sh --list --zookeeper zoo1:2181,zoo2:2181,zoo3:2181
unset JMX_PORT;bin/kafka-topics.sh --describe --zookeeper zoo1:2181,zoo2:2181,zoo3:2181 --topic __consumer_offsets
刪除topic
默認(rèn)標(biāo)記刪除
unset JMX_PORT;bin/kafka-topics.sh --delete --zookeeper zoo1:2181,zoo2:2181,zoo3:2181 --topic test
#設(shè)置 delete.topic.enable=true 真實(shí)刪除
生產(chǎn)者
發(fā)送消息
cat config/server.properties |grep listeners # 獲取監(jiān)聽(tīng)地址
unset JMX_PORT;bin/kafka-console-producer.sh --broker-list broker1:9091 --topic test2
# 運(yùn)行起來(lái)后可以輸入信息
吞吐量測(cè)試
unset JMX_PORT;bin/kafka-producer-perf-test.sh --num-records 100000 --topic test --producer-props bootstrap.servers=b
roker1:9091,broker2:9092,broker3:9093 --throughput 5000 --record-size 102400 --print-metrics
# 3501 records sent, 699.2 records/sec (68.28 MB/sec), 413.5 ms avg latency, 1019.0 ms max latency.
消費(fèi)者
接受消息
unset JMX_PORT;bin/kafka-console-consumer.sh --bootstrap-server broker1:9091 --topic test2
# 實(shí)時(shí)接受, 要從頭接收使用 --from-beginning
列出消費(fèi)者
unset JMX_PORT;bin/kafka-consumer-groups.sh --bootstrap-server broker1:9091 --list
# KafkaManagerOffsetCache
# console-consumer-26390
查看分區(qū)消息
查看當(dāng)前分區(qū)最新收到的消息
unset JMX_PORT;bin/kafka-console-consumer.sh --bootstrap-server broker1:9091 --topic test2 --offset latest --partition 0
吞吐量測(cè)試
bin/kafka-consumer-perf-test.sh --topic test --messages 100000 --num-fetch-threads 10 --threads 10 --broker-list broker1:9091,broker2:9092,broker3:9093 --group console-consumer-26390
容錯(cuò)
unset JMX_PORT;bin/kafka-topics.sh --describe --zookeeper zoo1:2181,zoo2:2181,zoo3:2181 --topic test2
docker stop broker3
# 干掉一臺(tái)broker, 再用上述命令查看, 注意 Leader: -1
unset JMX_PORT;bin/kafka-topics.sh --describe --zookeeper zoo1:2181,zoo2:2181,zoo3:2181 --topic test2

全部命令都手打了一遍, 保證可用.
涉及的命令都比較長(zhǎng), 請(qǐng)把代碼框的命令一次復(fù)制上去, 不要考慮換行.
第四節(jié) Kafka 術(shù)語(yǔ)說(shuō)明
昨天說(shuō)到命令行操作kafka集群, 其實(shí)有個(gè)小小故障的.
在運(yùn)行生產(chǎn)者吞吐量測(cè)試時(shí), 把集群打掛了.
阿里云的空間有限,kafka-producer-perf-test.sh 命令短時(shí)間填滿(mǎn)了所有的磁盤(pán)空間.

今天會(huì)科普一些kafka的基礎(chǔ)知識(shí). 新手向, 大牛請(qǐng)略過(guò)
簡(jiǎn)介
- ? Kafka是用Scala語(yǔ)言寫(xiě)的,
- ? 官方主頁(yè) kafka.apache.org ,
- ? 定義為分布式實(shí)時(shí)流處理平臺(tái),
- ? 其性能?chē)?yán)重依賴(lài)磁盤(pán)的性能,
- ? 消息無(wú)狀態(tài), 需要定時(shí)或定量刪除.
用途
消息系統(tǒng)
這個(gè)沒(méi)什么說(shuō)的, 著名的消息中間件.
應(yīng)用監(jiān)控
監(jiān)控中主要配合ELK使用.
用戶(hù)行為追蹤
記錄承載用戶(hù)多方面的海量信息, 再轉(zhuǎn)給各種大數(shù)據(jù)軟件處理, 如Hadoop,Spark,Strom
流處理
收集流數(shù)據(jù)
這塊是我的空缺, 昨天命令行操作時(shí), 配置文件出了點(diǎn)錯(cuò)誤, 后面會(huì)補(bǔ)上.
持久性日志
主要應(yīng)用Kafka的性能特性, 再配合Flume + HDFS, 相當(dāng)好用.
?
性能
? 據(jù)說(shuō)Kafka千萬(wàn)級(jí)的性能, 我司沒(méi)有這么大的量, 不敢評(píng)論. 不過(guò)百萬(wàn)級(jí)是公認(rèn)的.
? 性能好的原因是大量使用操作系統(tǒng)頁(yè)緩存,不直接參與物理I/O操作. 同時(shí)使用追加寫(xiě)入方式, 避免隨機(jī)寫(xiě)入導(dǎo)致硬盤(pán)的性能噩夢(mèng).
還以sendfile為代表的零拷貝技術(shù), 在內(nèi)核區(qū)完成數(shù)據(jù)拷貝, 避開(kāi)用戶(hù)緩存.
數(shù)據(jù)保存
以下為Zookeeper中 Kafka 保存信息的幾個(gè)目錄, 可以適當(dāng)了解. 查看方法:
docker exec -it zoo1 bash
zkCli.sh
ls /
ls /brokers/ids
...
| 目錄名 | 用途 |
|---|---|
| brokers | 存放集群和topic信息 |
| controller | 存放節(jié)點(diǎn)選舉相關(guān)信息 |
| admin | 存放腳本命令的輸出結(jié)果 |
| isr_change_notification | 記錄變化的ISR |
| config | 記錄集群id 和版本號(hào) |
| controller_epoch | 記錄 controller版本號(hào), 避免墓碑問(wèn)題 |
專(zhuān)用名詞
| 名稱(chēng) | 用途 |
|---|---|
| broker | 指Kafka的服務(wù)器 |
| 集群 | 指多個(gè)broker組成的工作單元 |
| 消息 | 最基礎(chǔ)數(shù)據(jù)單元 |
| 批次 | 指一組消息 |
| 副本 | 消息的冗余形式 |
| 消息模式 | 消息序列化的方式 |
| 提交 | 更新分區(qū)當(dāng)前位置 |
| 主題 | mysql 中表格, 對(duì)應(yīng)命令是topic |
| 分區(qū) | 對(duì)應(yīng)命令是 partition |
| 生產(chǎn)者 | 負(fù)責(zé)消息輸入 |
| 消費(fèi)者 | 負(fù)責(zé)消息輸出 |
補(bǔ)充:
消息定位:
由tpoic, partition, offset 可以定位到唯一的一條消息.副本分為 leader replica和follower replica.
follower作用就是復(fù)制數(shù)據(jù)
在leader掛掉時(shí), 從follower中選出新的leader.
follower作用就是復(fù)制數(shù)據(jù), 并在leader掛掉 時(shí),從中選出新的leader.
- topic可以設(shè)置多個(gè)分區(qū),其中有多個(gè)segment以存放消息
配置文件
主要有以下4個(gè)相關(guān)配置文件:
| 用途 | 文件名 |
|---|---|
| broker 配置 | server.properties |
| zookeeper 配置 | zookeeper.properties |
| 消費(fèi)者配置 | consumer.properties |
| 生產(chǎn)者配置 | producer.properties |
基礎(chǔ)就是基礎(chǔ). yann也是學(xué)完這些基礎(chǔ)的東西, 再次看到時(shí)才能鄙視以上內(nèi)容的. 所以, 加油.
第五節(jié) Kafka 集群工作原理
承前
昨天把自己的公眾號(hào)發(fā)給大佬看, 結(jié)果被批評(píng)了. 說(shuō)格式太亂, 看不下去. 然后我就開(kāi)始進(jìn)行調(diào)整格式之旅, 連著發(fā)了幾十個(gè)預(yù)覽, 感覺(jué)自己都暈掉了.
所以,今天的內(nèi)容會(huì)有點(diǎn)水, 見(jiàn)諒.
集群原理
這里簡(jiǎn)單說(shuō)一下, kafka的集群原理. 之前就說(shuō)明過(guò), kafka的集群是由三臺(tái)ZooKeeper, 和三臺(tái)kafka的集群組成的.
想互的關(guān)系大約類(lèi)似下面這張圖:

相互的關(guān)系不重要, 只要知道 ZooKeeper相當(dāng)于數(shù)據(jù)庫(kù), Kakka 相當(dāng)于實(shí)例. 雙方個(gè)體都足夠強(qiáng)(有三個(gè)節(jié)點(diǎn)), 組合起來(lái)就更強(qiáng)了.
那Kafka為什么要報(bào)zk的大腿呢? 其實(shí)是使用zk解決分布一致性的問(wèn)題. 三個(gè)節(jié)點(diǎn)分布在三臺(tái)服務(wù)器上, 要保持?jǐn)?shù)據(jù)一致, 雖然很多系統(tǒng)是自己維護(hù)的, 不過(guò)Kafak是叫外援了.
但是, 光有 ZooKeeper 還不夠, 自身也要做相當(dāng)?shù)呐?
Kafka的集群主要是通過(guò)數(shù)據(jù)復(fù)制和領(lǐng)袖選舉來(lái)保證一致性的.
數(shù)據(jù)復(fù)制是指雖然有三個(gè)副本, 但只有 leader 對(duì)外服務(wù). follower 時(shí)刻觀(guān)察著 leader 副本的動(dòng)向, 一但有新的變更, 就果斷拉給自己.
領(lǐng)袖選舉是指如果勞模 leader 不幸掛掉了, 會(huì)從 follower 里面選一個(gè)最接近的, 榮升新的 leader.
那怎么知道, leader 掛掉了呢, 每個(gè)Kafka實(shí)例啟動(dòng)后,都會(huì)以會(huì)話(huà)形式把自己注冊(cè)到ZooKeeper服務(wù)中, 一但出了問(wèn)題, 其與ZooKeeper的會(huì)話(huà)便不能維持下去了,從而超時(shí)失效.
就像上班打卡一樣, 一段時(shí)間沒(méi)打卡了, 就知道 leader 涼了.
補(bǔ)充一個(gè)名詞
ISR: leader 節(jié)點(diǎn)將會(huì)跟蹤與其保持同步的副本列表,該列表稱(chēng)為ISR(In-Sync Replica)
工作流程
知道了集群原理后, 再來(lái)看一下工作的流程.
應(yīng)用程序先連接 ZooKeeper 集群, 獲取Kafka集群的一些消息. 其中, 最重要的是知道誰(shuí)是 leader. 下面的事情就簡(jiǎn)單了:
- 應(yīng)用程序把消息發(fā)送給 leader
- leader 將消息寫(xiě)入本地文件
- follower 知道后來(lái)同步消息
- follower 同步好消息后告訴 leader
- leader 收集到所有副的ACK信號(hào)后告訴應(yīng)用程序
大致的流程就是以上幾步, 但還會(huì)有一些細(xì)節(jié), 同時(shí)可以用參數(shù)微調(diào).
比方說(shuō), leader 不是一收到消息就寫(xiě)入硬盤(pán)的, 會(huì)有時(shí)間或條數(shù)的一個(gè)閥值. Partiton在物理上對(duì)應(yīng)一個(gè)文件夾, 一個(gè)分區(qū)的多個(gè)副本一般不會(huì)分配在同一臺(tái)物理機(jī)上等. 而是先反饋給應(yīng)用還是先保證同步, 消息寫(xiě)到哪個(gè)分區(qū), 則時(shí)靠參數(shù)來(lái)控制了.
Kafka有一個(gè)重要的特性, 保證消息在單個(gè)分區(qū)內(nèi)的順序. 原因就是 Kafka會(huì)單獨(dú)開(kāi)辟一塊磁盤(pán)空間,順序?qū)懭霐?shù)據(jù). 分區(qū)內(nèi)會(huì)有多組segment文件, 滿(mǎn)足條件就寫(xiě)入磁盤(pán), 寫(xiě)完就再開(kāi)新的segment 片段.
消費(fèi)機(jī)制
? 最后說(shuō)一下消費(fèi), 消費(fèi)者其實(shí)也是應(yīng)用程序. 其實(shí)應(yīng)用是主動(dòng)到Kafka拉取消息的. 當(dāng)然也是找 leader 拉取. 鑒于Kafka的強(qiáng)悍性能, 可以同時(shí)加多個(gè)消費(fèi)者, 同時(shí)消費(fèi)者可以組成消費(fèi)者組. 同一個(gè)消費(fèi)組者的消費(fèi)者可以消費(fèi)同一topic下不同分區(qū)的數(shù)據(jù).
在分區(qū)量充足的時(shí)候, 可能有一個(gè)消費(fèi)者消費(fèi)多個(gè)分區(qū)的情況, 但如果消費(fèi)都多于分區(qū)數(shù)量, 可能就有消費(fèi)者什么事都不做, 躺在一邊待機(jī)了.所以,不要讓消費(fèi)者的數(shù)量超過(guò)主題分區(qū)的數(shù)量.
所有權(quán)
客戶(hù)端崩潰時(shí)消息的處理.
- ? 消費(fèi)者組共享接收
- ? 所有權(quán)轉(zhuǎn)移 再均衡 rebalance
- ? 消費(fèi)者向broker發(fā)送心跳來(lái)維持所有權(quán)
- ? 客戶(hù)端拉取數(shù)據(jù), 記錄消費(fèi)
日志壓縮
- ? 針對(duì)一個(gè)topic的partition
- ? 壓縮不會(huì)重排序消息
- ? 消息的offset是不會(huì)變
- ? 消息的offset是順序
總結(jié)
實(shí)在抱歉, 感覺(jué)有些虎頭蛇尾的感覺(jué)。 前兩節(jié)寫(xiě)的很詳細(xì), 后面卻草草結(jié)束。畢竟Kafka是一個(gè)中間件, 而不是一個(gè)平臺(tái)。 再深入的話(huà), 就需要寫(xiě)生產(chǎn)架構(gòu)或敘述業(yè)務(wù)流程,與初衷不付。畢竟本來(lái)打算寫(xiě)一個(gè)簡(jiǎn)單的 Kafka科普的。
先打個(gè)掛點(diǎn)吧, 有其他的想法再補(bǔ)充進(jìn)來(lái)。 后面搭 ELK 的時(shí)候遇到了再補(bǔ)充一點(diǎn)。
? 謝謝閱讀。
附 Kafka配置文件:
# 創(chuàng)建網(wǎng)絡(luò):docker network create --driver bridge --subnet 172.69.0.0/25 --gateway 172.69.0.1 kafka_zoo
version: '2'
services:
broker1:
image: wurstmeister/kafka
restart: always
hostname: broker1
container_name: broker1
ports:
- "9091:9091"
external_links:
- zoo1
- zoo2
- zoo3
environment:
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_HOST_NAME: broker1
KAFKA_ADVERTISED_PORT: 9091
KAFKA_HOST_NAME: broker1
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
KAFKA_LISTENERS: PLAINTEXT://broker1:9091
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker1:9091
JMX_PORT: 9988
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- "/root/kafka/broker1/:/kafka"
networks:
default:
ipv4_address: 172.69.0.11
broker2:
image: wurstmeister/kafka
restart: always
hostname: broker2
container_name: broker2
ports:
- "9092:9092"
external_links:
- zoo1
- zoo2
- zoo3
environment:
KAFKA_BROKER_ID: 2
KAFKA_ADVERTISED_HOST_NAME: broker2
KAFKA_ADVERTISED_PORT: 9092
KAFKA_HOST_NAME: broker2
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
KAFKA_LISTENERS: PLAINTEXT://broker2:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker2:9092
JMX_PORT: 9988
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- "/root/kafka/broker2/:/kafka"
networks:
default:
ipv4_address: 172.69.0.12
broker3:
image: wurstmeister/kafka
restart: always
hostname: broker3
container_name: broker3
ports:
- "9093:9093"
external_links:
- zoo1
- zoo2
- zoo3
environment:
KAFKA_BROKER_ID: 3
KAFKA_ADVERTISED_HOST_NAME: broker3
KAFKA_ADVERTISED_PORT: 9093
KAFKA_HOST_NAME: broker3
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
KAFKA_LISTENERS: PLAINTEXT://broker3:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker3:9093
JMX_PORT: 9988
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- "/root/kafka/broker3/:/kafka"
networks:
default:
ipv4_address: 172.69.0.13
kafka-manager:
image: sheepkiller/kafka-manager
restart: always
container_name: kafa-manager
hostname: kafka-manager
ports:
- "9002:9000"
links: # 連接本compose文件創(chuàng)建的container
- broker1
- broker2
- broker3
external_links: # 連接本compose文件以外的container
- zoo1
- zoo2
- zoo3
environment:
ZK_HOSTS: zoo1:2181,zoo2:2181,zoo3:2181
KAFKA_BROKERS: broker1:9091,broker2:9092,broker3:9093
APPLICATION_SECRET: letmein
KM_ARGS: -Djava.net.preferIPv4Stack=true
networks:
default:
ipv4_address: 172.69.0.10
networks:
default:
external:
name: kafka_zoo
# mkdir -p /root/kafka/broker1
# mkdir -p /root/kafka/broker2
# mkdir -p /root/kafka/broker3
本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!
發(fā)布在平臺(tái)的文章, 和原文存在格式差異, 閱讀不便請(qǐng)見(jiàn)諒
最新內(nèi)容歡迎關(guān)注公眾號(hào):
https://upload-images.jianshu.io/upload_images/20093046-21c21c78c13c98ae.jpeg
