1. 訊息佇列(MQ)
1.1 什么是訊息佇列
訊息佇列不知道大家看到這個詞的時候,會不會覺得它是一個比較高端的技術,訊息佇列,一般我們會簡稱它為MQ(Message Queue). 訊息佇列是一種幫助開發人員解決系統間異步通信的中間件,常用于解決系統解耦和請求的削峰平谷的問題,
佇列(Queue):
Queue 是一種先進先出的資料結構,容器

訊息(Message):
不同應用之間傳送的資料,
訊息佇列:
我們可以把訊息佇列比作是一個存放訊息的容器,當我們需要使用訊息的時候可以取出訊息供自己使用,訊息佇列是分布式系統中重要 的組件,使用訊息佇列主要是為了通過異步處理提高系統性能和削峰、降低系統耦合性,佇列 Queue 是一種先進先出的資料結構,所以消 費訊息時也是按照順序來消費的,比如生產者發送訊息1,2,3...對于消費者就會按照1,2,3...的順序來消費,

MQ方式

1.2 訊息佇列的應用場景
訊息佇列在實際應用中包括如下四個場景:
- 1) 應用耦合:多應用間通過訊息佇列對同一訊息進行處理,避免呼叫介面失敗導致整個程序失敗;
- 2) 異步處理:多應用對訊息佇列中同一訊息進行處理,應用間并發處理訊息,相比串行處理,減少處理時間;
- 3) 限流削峰:廣泛應用于秒殺或搶購活動中,避免流量過大導致應用系統掛掉的情況;
- 4) 訊息驅動的系統:系統分為訊息佇列、訊息生產者、訊息消費者,生產者負責產生訊息,消費者(可能有多個)負責對訊息進行處理
下面詳細介紹上述四個場景以及訊息佇列如何在上述四個場景中使用
1.2.1 異步處理
具體場景:
用戶為了使用某個應用,進行注冊,系統需要發送注冊郵件并驗證短信,
對這兩個子系統操作的處理方式有兩種:串行及并行,
涉及到三個子系統:注冊系統、郵件系統、短信系統
1)串行方式:新注冊資訊生成后,先發送注冊郵件,再發送驗證短信;

2) 并行處理:新注冊資訊寫入后,由發短信和發郵件并行處理

在這種方式下,發短信和發郵件 需處理完成后再回傳給客戶端,
假設以上三個子系統處理的時間均為50ms,且不考慮網路延遲,則總的處理時間:
串行:50+50+50=150ms
并行:50+50 = 100ms
如果引入訊息佇列, 在來看整體的執行效率:

在寫入訊息佇列后立即回傳成功給客戶端,則總的回應時間依賴于寫入訊息佇列的時間,而寫入訊息佇列的時間本身是可以很快的,基本 可以忽略不計,因此總的處理時間為50ms,相比串行提高了2倍,相比并行提高了一倍;
1.2.2 應用耦合
具體場景:
用戶使用QQ相冊上傳一張圖片,人臉識別系統會對該圖片進行人臉識別,
一般的做法是,服務器接收到圖片后,圖片上傳系統立即呼叫人臉識別系統,
呼叫完成后再回傳成功,如下圖所示: 呼叫方式:webService、Http協議(HttpClient、RestTemplate)、Tcp協議(Dubbo)

該方法有如下缺點:
1) 人臉識別系統被調失敗,導致圖片上傳失敗;
2) 延遲高,需要人臉識別系統處理完成后,再回傳給客戶端,即使用戶并不需要立即知道結果;
3) 圖片上傳系統與人臉識別系統之間互相呼叫,需要做耦合;
若使用訊息佇列:

客戶端上傳圖片后,圖片上傳系統將圖片資訊批次寫入訊息佇列,直接回傳成功;
人臉識別系統則定時從訊息佇列中取資料,完成對新增圖片的識別,
圖片上傳系統并不需要關心人臉識別系統是否對這些圖片資訊的處理、以及何時對這些圖片資訊進行處理,
事實上,由于用戶并不需要立即知道人臉識別結果,人臉識別系統可以選擇不同的調度策略,按照閑時、忙時、正常時間,對佇列中的圖 片資訊進行處理,
1.2.3 限流削峰
具體場景:
購物網站開展秒殺活動,一般由于瞬時訪問量過大,服務器接收過大,會導致流量暴增,相關系統無法處理請求甚至崩潰,
而加入訊息佇列后,系統可以從訊息佇列中取資料,相當于訊息佇列做了一次緩沖,

該方法有如下優點:
請求先入訊息佇列,而不是由業務處理系統直接處理,做了一次緩沖,極大地減少了業務處理系統的壓力;
佇列長度可以做限制,事實上,秒殺時,后入佇列的用戶無法秒殺到商品,這些請求可以直接被拋棄,回傳活動已結束或商品已售完信 息;
1.2.4 訊息事件驅動的系統
具體場景:
用戶新上傳了一批照片 ---->人臉識別系統需要對這個用戶的所有照片進行聚類 -------> 由對賬系統重新生成用戶的人臉索引(加快查 詢),
這三個子系統間由訊息佇列連接起來,前一個階段的處理結果放入佇列中,后一個階段從佇列中獲取訊息繼續處理,

該方法有如下優點:
避免了直接呼叫下一個系統導致當前系統失敗;
每個子系統對于訊息的處理方式可以更為靈活,可以選擇收到訊息時就處理,可以選擇定時處理,也可以劃分時間段按不同處理速度處 理;
1.3 訊息佇列的兩種模式
訊息佇列包括兩種模式,點對點模式(point to point, queue)和發布/訂閱模式(publish/subscribe,topic)
1.3.1 點對點模式
點對點模式下包括三個角色
- 訊息佇列
- 發送者 (生產者)
- 接收者(消費者)
每個訊息都被發送到一個特定的佇列,接收者從佇列中獲取訊息,佇列保留著訊息,可以放在記憶體 中也可以持久化,直到他們被消費或超 時,

點對點模式特點:
- 每個訊息只有一個消費者,一旦被消費,訊息就不再在訊息佇列中;
- 發送者和接收者間沒有依賴性,發送者發送訊息之后,不管有沒有接收者在運行,都不會影響到發送者下次發送訊息;
- 接收者在成功接收訊息之后需向佇列應答成功,以便訊息佇列洗掉當前接收的訊息;
1.3.2 發布/訂閱模式
發布/訂閱模式下包括三個角色:
- 角色主題(Topic)
- 發布者(Publisher)
- 訂閱者(Subscriber)
訊息生產者(發布)將訊息發布到topic中,同時有多個訊息消費者(訂閱)消費該訊息,和點對點方式不同,發布到topic的訊息會被多個 訂閱者消費,

發布/訂閱模式特點:
- 每個訊息可以有多個訂閱者;
- 發布者和訂閱者之間有時間上的依賴性
- 為了消費訊息,訂閱者必須保持在線運行,
1.4 訊息佇列實作機制
1.4.1 JMS
JMS(JAVA Message Service,Java訊息服務)是一個Java平臺中關于面向訊息中間件的API 允許應用程式組件基于JavaEE平臺創建、發送、接收和讀取訊息
是一個訊息服務的標準或者說是規范,是 Java 平臺上有關面向訊息中間件的技術規范
便于訊息系統中的 Java 應用程式進行訊息交換,并且通過提供標準的產生、發送、接收訊息的介面,簡化企業應用的開發,
JMS 訊息機制主要分為兩種模型:PTP 模型和 Pub/Sub 模型,
實作產品:Apache ActiveMQ
1.4.2 AMQP
AMQP,即Advanced Message Queuing Protocol,一個提供統一訊息服務的應用層標準高級訊息佇列協議,是應用層協議的一個開 放標準,為面向訊息的中間件設計,基于此協議的客戶端與訊息中間件可傳遞訊息,并不受客戶端/中間件不同產品,不同的開發語言等條 件的限制,Erlang中的實作有RabbitMQ等,

1.4.2 JMS VS AMQP

1.5常見的訊息佇列產品


綜合上面的材料得出以下兩點: (
1)中小型軟體公司:
建議選RabbitMQ.一方面,erlang語言天生具備高并發的特性,而且他的管理界面用起來十分方便,正所謂,成也蕭何,敗也蕭何!他的 弊端也在這里,雖然RabbitMQ是開源的,然而國內有幾個能定制化開發erlang的程式員呢?所幸,RabbitMQ的社區十分活躍,可以解決 開發程序中遇到的bug,這點對于中小型公司來說十分重要,不考慮rocketmq和kafka的原因是,一方面中小型軟體公司不如互聯網公司, 資料量沒那么大,選訊息中間件,應首選功能比較完備的,所以kafka排除,不考慮rocketmq的原因是,rocketmq是阿里出品,如果阿里 放棄維護rocketmq,中小型公司一般抽不出人來進行rocketmq的定制化開發,因此不推薦,
(2)大型軟體公司:
根據具體使用在rocketMq和kafka之間二選一,一方面,大型軟體公司,具備足夠的資金搭建分布式環境,也具備足夠大的資料量,針 對rocketMQ,大型軟體公司也可以抽出人手對rocketMQ進行定制化開發,畢竟國內有能力改JAVA原始碼的人,還是相當多的,至于kafka,根 據業務場景選擇,如果有日志采集功能,肯定是首選kafka了,
2. kafka的基本介紹
2.1 什么是Kafka
官網:http://kafka.apache.org/

Kafka是最初由Linkedin公司開發,是一個分布式、磁區的、多副本的、多訂閱者,基于zookeeper協調的分布式日志系統(也可以當做 MQ系統),常見可以用于web/nginx日志、訪問日志,訊息服務等等,Linkedin于2010年貢獻給了Apache基金會并成為頂級開源專案,
主要應用場景是:日志收集系統和訊息系統,
Kafka主要設計目標如下:
- 以時間復雜度為O(1)的方式提供訊息持久化能力,即使對TB級以上資料也能保證常數時間的訪問性能,
- 演算法復雜度:時間復雜度和空間復雜度
- 以時間復雜度為O(1)的方式:常數時間運行和資料量的增長無關,假如操作一個鏈表,那么無論鏈表的大還是小,操作時間是一 樣的
- 高吞吐率,即使在非常廉價的商用機器上也能做到單機支持每秒100K條訊息的傳輸,
- 支持普通服務器每秒百萬級寫入請求
- Memory mapped Files
- 支持Kafka Server間的訊息磁區,及分布式消費,同時保證每個partition內的訊息順序傳輸,
- 同時支持離線資料處理和實時資料處理,
- Scale out:支持在線水平擴展
2.2 kafka的特點
(1)解耦,Kafka具備訊息系統的優點,只要生產者和消費者資料兩端遵循介面約束,就可以自行擴展或修改資料處理的業務程序,
(2)高吞吐量、低延遲,即使在非常廉價的機器上,Kafka也能做到每秒處理幾十萬條訊息,而它的延遲最低只有幾毫秒, (
3)持久性,Kafka可以將訊息直接持久化在普通磁盤上,且磁盤讀寫性能優異,
(4)擴展性,Kafka集群支持熱擴展,Kaka集群啟動運行后,用戶可以直接向集群添,
(5)容錯性,Kafka會將資料備份到多臺服務器節點中,即使Kafka集群中的某一臺加新的Kafka服務節點宕機,也不會影響整個系統的功 能,
(6)支持多種客戶端語言,Kafka支持Java、.NET、PHP、Python等多種語言,
(7) 支持多生產者和多消費者,
2.3 kafka的主要應用場景

3. kafka的架構
3.1 架構案例


Kafka Cluster:由多個服務器組成,每個服務器單獨的名字broker(掮客),
kafka broker:kafka集群中包含的服務器
Kafka Producer:訊息生產者、發布訊息到 kafka 集群的終端或服務,
Kafka consumer:訊息消費者、負責消費資料,
Kafka Topic: 主題,一類訊息的名稱,存盤資料時將一類資料存放在某個topci下,消費資料也是消費一類資料,
訂單系統:創建一個topic,叫做order,
用戶系統:創建一個topic,叫做user,
商品系統:創建一個topic,叫做product,
注意:Kafka的元資料都是存放在zookeeper中,
3.2 架構剖析
kafka架構的內部細節剖析:


說明:kafka支持訊息持久化,消費端為拉模型來拉取資料,消費狀態和訂閱關系有客戶端負責維護,訊息消費完 后,不會立即洗掉,會保 留歷史訊息,因此支持多訂閱時,訊息只會存盤一份就可以了,
- Broker:kafka集群中包含一個或者多個服務實體,這種服務實體被稱為Broker
- Topic:每條發布到kafka集群的訊息都有一個類別,這個類別就叫做Topic
- Partition:磁區,物理上的概念,每個topic包含一個或多個partition,一個partition對應一個檔案夾,這個檔案夾下存盤partition的 資料和索引檔案,每個partition內部是有序的
3.3 關系解釋
Topic & Partition
- Topic 就是資料主題,是資料記錄發布的地方,可以用來區分業務系統,
- Kafka中的Topics總是多訂閱者模式,一個topic可以擁有一個或者多個消費者來訂閱它的資料,
- 一個topic為一類訊息,每條訊息必須指定一個topic,
- 對于每一個topic, Kafka集群都會維持一個磁區日志,
- 如下圖 每個磁區都是有序且順序不可變的記錄集,并且不斷地追加到結構化的commit log檔案,
- 磁區中的每一個記錄都會分配一個id號來表示順序,稱之為offset,offset用來唯一的標識磁區中每一條記錄,


在每一個消費者中唯一保存的元資料是offset(偏移量)即消費在log中的位置,偏移量由消費者所控制:通常在讀取記錄后,消費者會以線 性的方式增加偏移量 ,但是實際上,由于這個位置由消費者控制,所以消費者可以采用任何順序來消費記錄,例如,一個消費者可以重置到一個舊的偏移量,從 而重新處理過去的數 據;也可以跳過最近的記錄,從"現在"開始消費,
這些細節說明Kafka 消費者是非常廉價的—消費者的增加和減少,對集群或者其他消費者沒有多大的影響,
4. kafka集群環境搭建
ZooKeeper 作為給分布式系統提供協調服務的工具被 kafka 所依賴,在分布式系統中,消費者需要知道有哪些生產者是可用的,而如果 每次消費者都需要和生產者建立連接并測驗是否成功連接,那效率也太低了,顯然是不可取的,而通過使用 ZooKeeper 協調服務,Kafka 就能將 Producer,Consumer,Broker 等結合在一起,同時借助 ZooKeeper,Kafka 就能夠將所有組件在無狀態的條件下建立起生產者和 消費者的訂閱關系,實作負載均衡,

4.1 準備作業
kafka集群所需包
鏈接:https://pan.baidu.com/s/1rX6LuEbRk6fAYxiZ107cSg
提取碼:27fh
環境準備:
準備三臺服務器, 安裝jdk1.8 ,其中每一臺虛擬機的hosts檔案中都需要配置如下的內容
192.168.200.11 node1
192.168.200.12 node2
192.168.200.13 node3
1、修改IP地址
修改網卡組態檔 vi /etc/sysconfig/network-scripts/ifcfg-ens33
(1)bootproto=static,表示使用靜態IP
(2)onboot=yes,表示將網卡設定為開機啟用
(3)將原有的原有IP修改為192.168.200.11

注意: 修改ip地址后,還需修改ip映射與主機名
(4)重啟網路服務
service network restart
(5)安裝目錄創建
安裝包存放的目錄:/export/software
安裝程式存放的目錄:/export/servers
資料目錄:/export/data
日志目錄:/export/logs
創建各級目錄命令:
mkdir -p /export/servers/
mkdir -p /export/software/
mkdir -p /export/data/
mkdir -p /export/logs/
(6)修改host
(1)vi /etc/sysconfig/network
修改HOSTNAME=node1
(2)vim /etc/hostname
填寫主機名:node1
(3)vim /etc/hosts
執行命令”/etc/init.d/network restart“ 重啟hosts;
執行命令”cat /etc/hosts“可以查看到hosts檔案修改成功,
4.2 Zookeeper集群搭建
1. JDK安裝(略)
2.Linux 安裝Zookeeper,三臺Linux都安裝,以搭建Zookeeper集群
- 上傳zookeeper-3.4.14.tar.gz
- 解壓并配置zookeeper(配置data目錄,集群節點)
# node1操作
# 解壓到/opt目錄
tar -zxf zookeeper-3.4.14.tar.gz -C /opt
# 配置
cd /opt/zookeeper-3.4.14/conf
# 組態檔重命名后生效
cp zoo_sample.cfg zoo.cfg
#編輯
vi zoo.cfg
# 設定資料目錄
dataDir=/var/lagou/zookeeper/data
# 添加
server.1=node1:2881:3881
server.2=node2:2881:3881
server.3=node3:2881:3881
# 退出vim
mkdir -p /var/lagou/zookeeper/data
echo 1 > /var/lagou/zookeeper/data/myid
# 配置環境變數
vi /etc/profile
# 添加
export ZOOKEEPER_PREFIX=/opt/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_PREFIX/bin
export ZOO_LOG_DIR=/var/lagou/zookeeper/log
# 退出vim,讓配置生效
source /etc/profile
node2 、node3 略...
zookeeper集群部署可查看 Zookeeper詳解--(入門、原理及實戰)_程式猿二鍋頭的博客-CSDN博客

4.3 下載安裝包
中文網站: http://kafka.apachecn.org/
英文網站: http://kafka.apache.org/

4.4 上傳安裝包并解壓
使用 ftp 將安裝包上傳至 /export/software
1) 切換目錄上傳安裝包
cd /export/software2) 解壓安裝包到指定目錄下
tar -zxvf kafka_2.11-1.0.0.tgz -C /export/servers/
cd /export/servers/3) 重命名(由于名稱太長)
mv kafka_2.11-1.0.0 kafka
4.5 修改kafka的核心組態檔
cd /export/servers/kafka/config/
vi server.properties
主要修改一下6個地方:
1) broker.id 需要保證每一臺kafka都有一個獨立的broker
2) log.dirs 資料存放的目錄
3) zookeeper.connect zookeeper的連接地址資訊
4) delete.topic.enable 是否直接洗掉topic
5) host.name 主機的名稱
6) 修改: listeners=PLAINTEXT://node1:9092
#broker.id 標識了kafka集群中一個唯一broker,
broker.id=0
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
# 存放生產者生產的資料 資料一般以topic的方式存放
log.dirs=/export/data/kafka
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
# zk的資訊
zookeeper.connect=node1:2181,node2:2181,node3:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
delete.topic.enable=true
host.name=node1
4.6 將配置好的kafka分發到其他二臺主機
cd /export/servers
scp -r kafka/ node2:$PWD
scp -r kafka/ node3:$PWD
Linux scp 命令用于 Linux 之間復制檔案和目錄,
scp 是 secure copy 的縮寫, scp 是 linux 系統下基于 ssh 登陸進行安全的遠程檔案拷貝命令,
- 拷貝后, 需要修改每一臺的broker.id 和 host.name和listeners
ip為11的服務器: broker.id=0 , host.name=node1 listeners=PLAINTEXT://node1:9092
ip為12的服務器: broker.id=1 , host.name=node2 listeners=PLAINTEXT://node2:9092
ip為13的服務器: broker.id=2 , host.name=node3 listeners=PLAINTEXT://node3:9092
- 在每一臺的服務器執行創建資料檔案的命令
mkdir -p /export/data/kafka
4.7 啟動集群
注意事項:在kafka啟動前,一定要讓zookeeper啟動起來
cd /export/servers/kafka/bin
#前臺啟動
./kafka-server-start.sh /export/servers/kafka/config/server.properties
#后臺啟動
nohup ./kafka-server-start.sh /export/servers/kafka/config/server.properties 2>&1 &
注意:可以啟動一臺broker,單機版,也可以同時啟動三臺broker,組成一個kafka集群版
#kafka停止
./kafka-server-stop.sh
登錄zookeeper: zkCli.sh
執行: ls /brokers/ids

4.8 安裝kafka-manager (后續完善的,與前面IP有些不同,請自行更改)
鏈接:https://pan.baidu.com/s/1rX6LuEbRk6fAYxiZ107cSg
提取碼:27fh
unzip -o kafka-manager-1.3.3.7.zip
cd kafka-manager-1.3.3.7
vi conf/application.conf
修改組態檔的下面一行
kafka-manager.zkhosts="IP:2181,IP2:2181"
basicAuthentication.enabled=true
啟動kafka-manager
nohup bin/kafka-manager >/dev/null 2>&1 &
需要注意:
kafka-manager默認的埠是9000,可以在組態檔中修改
測驗訪問:http://192.168.40.171:9000/


4.9 Docker環境下的Kafka集群搭建

4.9.1 準備作業
1) 克隆VM,修改IP地址為192.168.40.150 建議記憶體2G
修改網路配置、映射、主機名 參考 4.1 準備作業
2) 安裝docker - compose
Compose 是用于定義和運行多容器 Docker 應用程式的工具,
如果我們還是使用原來的方式操作docker,那么就需要下載三個鏡像:Zookeeper、Kafka、Kafka-Manager,需要對Zookeeper安裝三次 并配置集群、需要對Kafka安裝三次,修改組態檔,Kafka-Manager安裝一次,但是需要配置埠映射機器Zooker、Kafka容器的資訊, 但是引入Compose之后可以使用yaml格式的組態檔配置好這些資訊,每個image只需要撰寫一個yaml檔案,可以在檔案中定義集群信 息、埠映射等資訊,運行該檔案即可創建完成集群,
通過 Compose,您可以使用 YML 檔案來配置應用程式需要的所有服務,然后,使用一個命令,就可以從 YML 檔案配置中創建并啟動所有 服務,
Compose 使用的兩個步驟:
- 使用 docker-compose.yml 定義構成應用程式的服務,這樣它們可以在隔離環境中一起運行,
- 執行 docker-compose up 命令來啟動并運行整個應用程式,
#curl 是一種命令列工具,作用是發出網路請求,然后獲取資料
curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose#如果慢可以換一個源
curl -L "https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#chmod(change mode)命令是控制用戶對檔案的權限的命令
chmod +x /usr/local/bin/docker-compose#查看版本
docker-compose --version
3)拉取鏡像
#拉取Zookeeper鏡像
docker pull zookeeper:3.4
#拉取kafka鏡像
docker pull wurstmeister/kafka
#拉取kafka-manager鏡像
docker pull sheepkiller/kafka-manager:latest

4) 創建集群網路
基于Linux宿主機而作業的,也是在Linux宿主機創建,創建之后Docker容器中的各個應用程式可以使用該網路,
#創建
docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 kafka#查看
docker network ls
5)網路設定
新建網段之后可能會出現:WARNING: IPv4 forwarding is disabled. Networking will not work.
解決方式:第一步:在宿主機上執行: echo "net.ipv4.ip_forward=1" >>/usr/lib/sysctl.d/00-system.conf
第二步:重啟network和docker服務[root@docker-master data]# systemctl restart network && systemctl restart docker
4.9.2 搭建程序
每個鏡像一個Yml檔案,Zookeeper、Kafka、Kafka-Manager一個 撰寫yml檔案
1)docker-compose-zookeeper.yml
version: '2' #指定compose 檔案的版本
services:
zoo1:
image: zookeeper:3.4 #使用的鏡像
restart: always #當Docker重啟時,該容器重啟
hostname: zoo1 #類似于在基于Linux虛擬機Kafka集群中hostname
container_name: zoo1
ports:
- 2184:2181 #埠映射
environment: #集群環境
ZOO_MY_ID: 1 #當前Zookeeper實體的id
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
networks: #使用的網路配置
kafka:
ipv4_address: 192.168.0.11
zoo2:
image: zookeeper:3.4
restart: always
hostname: zoo2
container_name: zoo2
ports:
- 2185:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888
networks:
kafka:
ipv4_address: 192.168.0.12
zoo3:
image: zookeeper:3.4
restart: always
hostname: zoo3
container_name: zoo3
ports:
- 2186:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888
networks:
kafka:
ipv4_address: 192.168.0.13
networks:
kafka:
external:
name: kafka
2)docker-compose-kafka.yml
version: '2'
services:
kafka1:
image: wurstmeister/kafka
restart: always
hostname: kafka1
container_name: kafka1
privileged: true
ports:
- 9092:9092
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka1
KAFKA_LISTENERS: PLAINTEXT://kafka1:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
external_links:
- zoo1
- zoo2
- zoo3
networks:
kafka:
ipv4_address: 192.168.0.14
kafka2:
image: wurstmeister/kafka
restart: always
hostname: kafka2
container_name: kafka2
privileged: true
ports:
- 9093:9093
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka2
KAFKA_LISTENERS: PLAINTEXT://kafka2:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9093
KAFKA_ADVERTISED_PORT: 9093
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
external_links:
- zoo1
- zoo2
- zoo3
networks:
kafka:
ipv4_address: 192.168.0.15
kafka3:
image: wurstmeister/kafka
restart: always
hostname: kafka3
container_name: kafka3
privileged: true
ports:
- 9094:9094
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka3
KAFKA_LISTENERS: PLAINTEXT://kafka3:9094
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka3:9094
KAFKA_ADVERTISED_PORT: 9094
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
external_links:
- zoo1
- zoo2
- zoo3
networks:
kafka:
ipv4_address: 192.168.0.16
networks:
kafka:
external:
name: kafka
3)docker-compose-manager.yml
version: '2'
services:
kafka-manager:
image: sheepkiller/kafka-manager:latest
restart: always
container_name: kafka-manager
hostname: kafka-manager
ports:
- 9000:9000
environment:
ZK_HOSTS: zoo1:2181,zoo2:2181,zoo3:2181
KAFKA_BROKERS: kafka1:9092,kafka2:9092,kafka3:9092
APPLICATION_SECRET: letmein
KM_ARGS: -Djava.net.preferIPv4Stack=true
networks:
kafka:
ipv4_address: 192.168.0.17
networks:
kafka:
external:
name: kafka
4)將yaml檔案上傳到Docker宿主機中
5)開始部署
使用命令:docker-compose up -d
引數說明: up表示啟動, -d表示后臺運行引數說明: -f:表示加載指定位置的yaml檔案
docker-compose -f /home/docker-compose-zookeeper.yml up -d
docker-compose -f /home/docker-compose-kafka.yml up -d
docker-compose -f /home/docker-compose-manager.yml up -d
6)測驗
瀏覽器訪問宿主機: http://192.168.40.150:9000/
添加集群節點,測驗

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299939.html
標籤:其他

