Kafka集群部署搭建完美标准版
Kafka集群部署并啟動
在本文中將從演示如何搭建一個Kafka集群開始,然后簡要介紹一下關于Kafka集群的一些基礎知識點。但本文僅針對集群做介紹,對于Kafka的基本概念不做過多說明,這里假設讀者擁有一定的Kafka基礎知識。
首先,我們需要了解Kafka集群的一些機制:
- Kafka是天然支持集群的,哪怕是一個節點實際上也是集群模式
- Kafka集群依賴于Zookeeper進行協調,并且在早期的Kafka版本中很多數據都是存放在Zookeeper的
- Kafka節點只要注冊到同一個Zookeeper上就代表它們是同一個集群的
- Kafka通過brokerId來區分集群中的不同節點
Kafka的集群拓撲圖如下:
Kafka集群中的幾個角色:
- Broker:一般指Kafka的部署節點
- Leader:用于處理消息的接收和消費等請求,也就是說producer是將消息push到leader,而consumer也是從leader上去poll消息
- Follower:主要用于備份消息數據,一個leader會有多個follower
在本例中,為了更貼近實際的部署情況,使用了四臺虛擬機作演示:
| 192.168.99.1 | master | broker server | 0 |
| 192.168.99.2 | slave1 | broker server | 1 |
| 192.168.99.3 | slave2 | broker server | 2 |
| 192.168.99.4 | slave3 | 集群協調者 |
Zookeeper安裝
Kafka是基于Zookeeper來實現分布式協調的,所以在搭建Kafka節點之前需要先搭建好Zookeeper節點。而Zookeeper和Kafka都依賴于JDK,我這里已經事先安裝好了JDK:
[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的官網下載地址,復制下載鏈接:
- https://zookeeper.apache.org/releases.html#download
然后到Linux中使用wget命令進行下載,如下:
[root@192.168.99.4 ~]# cd /usr/local/src [root@192.168.99.4 /usr/local/src]# wget https://archive.apache.org/dist/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默認的配置文件名稱:
[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 --reloadKafka安裝
安裝完Zookeeper后,接下來就可以安裝Kafka了,同樣的套路首先去Kafka的官網下載地址,復制下載鏈接:
- https://zookeeper.apache.org/releases.html#download
然后到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 172.21.254.169:/usr/local/kafka [root@192.168.99.1 ~]# rsync -av /usr/local/kafka 172.21.254.170:/usr/local/kafka然后修改一下這兩個節點的brokerId和監聽的ip:
[root@192.168.99.2 /usr/local/kafka/config]# cd /usr/local/kafka/kafka/config [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.1 ~]# vim /etc/profile export KAFKA_HOME=/usr/local/kafka export PATH=$PATH:$KAFKA_HOME/bin [root@192.168.99.1 ~]# source /etc/profile # 讓配置生效 [root@192.168.99.1 ~]# /usr/local/kafka/kafka/bin/kafka-server-start.sh /usr/local/kafka/kafka/config/server.properties & [root@192.168.99.2 /usr/local/kafka/config]# cd /usr/local/kafka/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]# [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 # 讓配置生效 [root@192.168.99.1 ~]# /usr/local/kafka/kafka/bin/kafka-server-start.sh /usr/local/kafka/kafka/config/server.properties &配置修改完成后,按之前所介紹的步驟啟動這兩個節點。啟動成功后進入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副本集
關于Kafka的副本集:
- Kafka副本集是指將日志復制多份,我們知道Kafka的數據是存儲在日志文件中的,這就相當于數據的備份、冗余
- Kafka可以通過配置設置默認的副本集數量
- Kafka可以為每個Topic設置副本集,所以副本集是相對于Topic來說的
一個Topic的副本集可以分布在多個Broker中,當一個Broker掛掉了,其他的Broker上還有數據,這就提高了數據的可靠性,這也是副本集的主要作用。
我們都知道在Kafka中的Topic只是個邏輯概念,實際存儲數據的是Partition,所以真正被復制的也是Partition。如下圖:
關于副本因子:
- 副本因子其實決定了一個Partition的副本數量,例如副本因子為1,則代表將Topic中的所有Partition按照Broker的數量復制一份,并分布到各個Broker上
副本分配算法如下:
- 將所有N Broker和待分配的i個Partition排序
- 將第i個Partition分配到第(i mod n)個Broker上
- 將第i個Partition的第j個副本分配到第((i + j) mod n)個Broker上
Kafka節點故障原因及處理方式
Kafka節點(Broker)故障的兩種情況:
- Kafka節點與Zookeeper心跳未保持視為節點故障
- 當follower的消息落后于leader太多也會視為節點故障
Kafka對節點故障的處理方式:
- Kafka會對故障節點進行移除,所以基本不會因為節點故障而丟失數據
- Kafka的語義擔保也很大程度上避免了數據丟失
- Kafka會對消息進行集群內平衡,減少消息在某些節點熱度過高
Kafka Leader選舉機制簡介
Kafka集群之Leader選舉:
- 如果有接觸過其他一些分布式組件就會了解到大部分組件都是通過投票選舉來在眾多節點中選舉出一個leader,但在Kafka中沒有采用投票選舉來選舉leader
- Kafka會動態維護一組Leader數據的副本(ISR)
- Kafka會在ISR中選擇一個速度比較快的設為leader
“巧婦難為無米之炊”:Kafka有一種無奈的情況,就是ISR中副本全部宕機。對于這種情況,Kafka默認會進行unclean leader選舉。Kafka提供了兩種不同的方式進行處理:
- 等待時間較長,會降低可用性,或ISR中的所有Replica都無法恢復或者數據丟失,則該Partition將永不可用
- 并未包含所有已被之前Leader Commit過的消息,因此會造成數據丟失,但可用性較高
Leader選舉配置建議:
- 禁用unclean leader選舉
- 手動設置最小ISR
關于ISR更詳細的內容可以參考:
- https://www.jianshu.com/p/ff296d51385a
- https://blog.csdn.net/qq_37502106/article/details/80271800
總結
以上是生活随笔為你收集整理的Kafka集群部署搭建完美标准版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ajax入门篇
- 下一篇: android高仿天天动听,Androi