在本文中將從演示如何搭建一個Kafka集羣開始,而後簡要介紹一下關於Kafka集羣的一些基礎知識點。但本文僅針對集羣作介紹,對於Kafka的基本概念不作過多說明,這裏假設讀者擁有必定的Kafka基礎知識。html
首先,咱們須要瞭解Kafka集羣的一些機制:java
Kafka的集羣拓撲圖以下:算法
Kafka集羣中的幾個角色:apache
在本例中,爲了更貼近實際的部署狀況,使用了四臺虛擬機做演示:vim
機器IP | 做用 | 角色 | brokerId |
---|---|---|---|
192.168.99.1 | 部署Kafka節點 | broker server | 0 |
192.168.99.2 | 部署Kafka節點 | broker server | 1 |
192.168.99.3 | 部署Kafka節點 | broker server | 2 |
192.168.99.4 | 部署Zookeeper節點 | 集羣協調者 |
Kafka是基於Zookeeper來實現分佈式協調的,因此在搭建Kafka節點以前須要先搭建好Zookeeper節點。而Zookeeper和Kafka都依賴於JDK,我這裏已經事先安裝好了JDK:tcp
[root@192.168.99.4 ~]# java --version java 11.0.5 2019-10-15 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.5+10-LTS) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.5+10-LTS, mixed mode) [root@txy-server2 ~]#
準備好JDK環境後,到Zookeeper的官網下載地址,複製下載連接:分佈式
而後到Linux中使用wget命令進行下載,以下:ide
[root@192.168.99.4 ~]# cd /usr/local/src [root@192.168.99.4 /usr/local/src]# wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
解壓下載好的壓縮包,並將解壓後的目錄移動和重命名:學習
[root@192.168.99.4 /usr/local/src]# tar -zxvf apache-zookeeper-3.6.1-bin.tar.gz [root@192.168.99.4 /usr/local/src]# mv apache-zookeeper-3.6.1-bin ../zookeeper
進入到Zookeeper的配置文件目錄,將zoo_sample.cfg這個示例配置文件拷貝一份並命名爲zoo.cfg,這是Zookeeper默認的配置文件名稱:ui
[root@192.168.99.4 /usr/local/src]# cd ../zookeeper/conf/ [root@192.168.99.4 /usr/local/zookeeper/conf]# ls configuration.xsl log4j.properties zoo_sample.cfg [root@192.168.99.4 /usr/local/zookeeper/conf]# cp zoo_sample.cfg zoo.cfg
修改一下配置文件中的dataDir配置項,指定一個磁盤空間較大的目錄:
[root@192.168.99.4 /usr/local/zookeeper/conf]# vim zoo.cfg # 指定Zookeeper的數據存儲目錄,類比於MySQL的dataDir dataDir=/data/zookeeper [root@192.168.99.4 /usr/local/zookeeper/conf]# mkdir -p /data/zookeeper
若是隻是學習使用的話,這一步其實能夠忽略,採用默認配置便可
接下來就能夠進入bin目錄,使用啓動腳原本啓動Zookeeper了,以下示例:
[root@192.168.99.4 /usr/local/zookeeper/conf]# cd ../bin/ [root@192.168.99.4 /usr/local/zookeeper/bin]# ./zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@192.168.99.4 /usr/local/zookeeper/bin]#
啓動完成後,能夠經過查看是否正常監聽端口號來判斷是否啓動成功,以下則是啓動成功了:
[root@192.168.99.4 ~]# netstat -lntp |grep 2181 tcp6 0 0 :::2181 :::* LISTEN 7825/java [root@192.168.99.4 ~]#
若是你的機器開啓了防火牆的話,則須要開放Zookeeper的端口,不然其餘節點沒法註冊上來:
[root@192.168.99.4 ~]# firewall-cmd --zone=public --add-port=2181/tcp --permanent [root@192.168.99.4 ~]# firwall-cmd --reload
安裝完Zookeeper後,接下來就能夠安裝Kafka了,一樣的套路首先去Kafka的官網下載地址,複製下載連接:
而後到Linux中使用wget命令進行下載,以下:
[root@192.168.99.1 ~]# cd /usr/local/src [root@192.168.99.1 /usr/local/src]# wget https://mirror.bit.edu.cn/apache/kafka/2.5.0/kafka_2.13-2.5.0.tgz
解壓下載好的壓縮包,並將解壓後的目錄移動和重命名:
[root@192.168.99.1 /usr/local/src]# tar -xvf kafka_2.13-2.5.0.tgz [root@192.168.99.1 /usr/local/src]# mv kafka_2.13-2.5.0 ../kafka
進入Kafka的配置文件目錄,修改配置文件:
[root@192.168.99.1 /usr/local/src]# cd ../kafka/config/ [root@192.168.99.1 /usr/local/kafka/config]# vim server.properties # 指定該節點的brokerId,同一集羣中的brokerId須要惟一 broker.id=0 # 指定監聽的地址及端口號,該配置項是指定內網ip listeners=PLAINTEXT://192.168.99.1:9092 # 若是須要開放外網訪問,則在該配置項指定外網ip advertised.listeners=PLAINTEXT://192.168.99.1:9092 # 指定kafka日誌文件的存儲目錄 log.dirs=/usr/local/kafka/kafka-logs # 指定zookeeper的鏈接地址,如有多個地址則用逗號分隔 zookeeper.connect=192.168.99.4:2181 [root@192.168.99.1 /usr/local/kafka/config]# mkdir /usr/local/kafka/kafka-logs
在完成配置文件的修改後,爲了方便使用Kafka的命令腳本,咱們能夠將Kafka的bin目錄配置到環境變量中:
[root@192.168.99.1 ~]# vim /etc/profile export KAFKA_HOME=/usr/local/kafka export PATH=$PATH:$KAFKA_HOME/bin [root@192.168.99.1 ~]# source /etc/profile # 讓配置生效
這樣就可使用以下命令啓動Kafka了:
[root@192.168.99.1 ~]# kafka-server-start.sh /usr/local/kafka/config/server.properties &
執行以上命令後,啓動日誌會輸出到控制檯,能夠經過日誌判斷是否啓動成功,也能夠經過查看是否監聽了9092端口來判斷是否啓動成功:
[root@192.168.99.1 ~]# netstat -lntp |grep 9092 tcp6 0 0 192.168.99.1:9092 :::* LISTEN 31943/java [root@192.168.99.1 ~]#
一樣的,開啓了防火牆的話,還須要開放相應的端口號:
[root@192.168.99.1 ~]# firewall-cmd --zone=public --add-port=9092/tcp --permanent [root@192.168.99.1 ~]# firwall-cmd --reload
到此爲止,咱們就完成了第一個Kafka節點的安裝,另外兩個節點的安裝步驟也是同樣的,只須要修改一下配置文件中的brokerId和監聽的ip就行了。因此我這裏直接將該節點中的Kafka目錄拷貝到另外兩臺機器上:
[root@192.168.99.1 ~]# rsync -av /usr/local/kafka 192.168.99.2:/usr/local/kafka [root@192.168.99.1 ~]# rsync -av /usr/local/kafka 192.168.99.3:/usr/local/kafka
而後修改一下這兩個節點的brokerId和監聽的ip:
[root@192.168.99.2 /usr/local/kafka/config]# vim server.properties # 修改brokerId broker.id=1 # 指定監聽的地址及端口號,該配置項是指定內網ip listeners=PLAINTEXT://192.168.99.2:9092 # 若是須要開放外網訪問,則在該配置項指定外網ip advertised.listeners=PLAINTEXT://192.168.99.2:9092 [root@192.168.99.2 /usr/local/kafka/config]# [root@192.168.99.3 /usr/local/kafka/config]# vim server.properties # 修改brokerId broker.id=2 # 指定監聽的地址及端口號,該配置項是指定內網ip listeners=PLAINTEXT://192.168.99.3:9092 # 若是須要開放外網訪問,則在該配置項指定外網ip advertised.listeners=PLAINTEXT://192.168.99.3:9092 [root@192.168.99.3 /usr/local/kafka/config]#
配置修改完成後,按以前所介紹的步驟啓動這兩個節點。啓動成功後進入Zookeeper中,在/brokers/ids下有相應的brokerId數據表明集羣搭建成功:
[root@192.168.99.4 ~]# /usr/local/zookeeper/bin/zkCli.sh [zk: localhost:2181(CONNECTED) 4] ls /brokers/ids [0, 1, 2] [zk: localhost:2181(CONNECTED) 5]
咱們都知道在Kafka中的Topic只是個邏輯概念,實際存儲數據的是Partition,因此真正被複制的也是Partition。以下圖:
關於副本因子:
副本分配算法以下:
Kafka節點(Broker)故障的兩種狀況:
Kafka對節點故障的處理方式:
Kafka集羣之Leader選舉:
「巧婦難爲無米之炊」:Kafka有一種無奈的狀況,就是ISR中副本所有宕機。對於這種狀況,Kafka默認會進行unclean leader選舉。Kafka提供了兩種不一樣的方式進行處理:
等待ISR中任一Replica恢復,並選它爲Leader
Leader選舉配置建議:
關於ISR更詳細的內容能夠參考:
原文連接:https://www.jianshu.com/p/cc0b90636715 做者:端碗吹水