Zookeeper叢集 + Kafka叢集

无敌小鲁班發表於2024-07-18

目錄
  • 1.Zookeeper 概述
    • (1)Zookeeper工作機制
    • (2)Zookeeper資料結構
    • (3)Zookeeper選舉機制
  • 2.部署 Zookeeper 叢集
    • (1)安裝前準備
    • (2)安裝 Zookeeper
  • 3.Kafka 概述
    • (1)為什麼需要訊息佇列(MQ)
    • (2)訊息佇列的兩種模式
    • (3)Kafka元件
    • (4)Kafka 的特性
    • (5)Kafka 系統架構
    • (6)kafka如何保證資料的可靠性?
    • (7)問你們公司用的kafka是如何部署的?
  • 4.部署 kafka 叢集
  • 5.Kafka 架構深入

1.Zookeeper 概述

Zookeeper 簡稱 ZK ,分散式協調服務
用來解決分散式應用叢集中應用系統的資料一致性問題。能讓分散式應用叢集的每個例項同時獲取到同一份資訊的服務。

(1)Zookeeper工作機制

註冊中心+檔案系統+通知機制
用於註冊各種分散式應用,儲存和管理這些分散式應用的後設資料,如果應用資料或服務狀態發生變化就會通知並同步給分散式應用叢集中的其它例項。

(2)Zookeeper資料結構

ZooKeeper資料模型的結構與Linux檔案系統很類似,整體上可以看作是一棵樹,每個節點稱做一個ZNode。每一個ZNode預設能夠儲存1MB的資料,每個ZNode都可以透過其路徑唯一標識。

(3)Zookeeper選舉機制

伺服器數量要求至少大於等於3的奇數臺。

第一次leader選舉:先比較伺服器的myid,誰的myid最大就能獲取到其它伺服器的選票,當選票超過伺服器數量的半數時則當選leader,其它伺服器則為follower。即使以後再有其它myid更大的伺服器加入叢集也不會影響之前的選舉結果。

非第一次選舉:
1)如果是follower故障,替換的新伺服器繼續作為follower,與現存的leader建立連線並同步資料
2)如果是leader故障,則需要重新選舉新的leader,先比較當前存活伺服器的epoch(參與選舉的次數),如有epoch最大的伺服器則直接當選leader
若epoch有相同的伺服器,再比較zxid(寫操作的事務id),如有zxid最大的伺服器則直接當選leader
若zxid也有相同的伺服器,繼續比較sid(等同於myid),最後由sid最大的伺服器當選leader

2.部署 Zookeeper 叢集

準備 3 臺伺服器做 Zookeeper 叢集
20.0.0.100
20.0.0.110
20.0.0.130

(1)安裝前準備

關閉防火牆

systemctl disable --now firewalld
setenforce 0
vim /etc/selinux/config
    disabled


安裝 JDK

java -version
#yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel  沒安裝yum安裝

下載安裝包
官方下載地址:https://archive.apache.org/dist/zookeeper/

cd /opt/
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.4/apache-zookeeper-3.6.4-bin.tar.gz

(2)安裝 Zookeeper

cd /opt/
rz -E 上傳apache-zookeeper-3.6.4-bin.tar.gz
ls
tar xf apache-zookeeper-3.6.4-bin.tar.gz
mv apache-zookeeper-3.6.4-bin /usr/local/zookeeper


修改配置檔案

cd /usr/local/zookeeper/
ls
cd conf/
ls
cp zoo_sample.cfg zoo.cfg
ls
vim zoo.cfg



注:server.A=B:C:D
●A是一個數字,表示這個是第幾號伺服器。叢集模式下需要在zoo.cfg中dataDir指定的目錄下建立一個檔案myid,這個檔案裡面有一個資料就是A的值,Zookeeper啟動時讀取此檔案,拿到裡面的資料與zoo.cfg裡面的配置資訊比較從而判斷到底是哪個server。
●B是這個伺服器的地址。
●C是這個伺服器Follower與叢集中的Leader伺服器交換資訊的埠。
●D是萬一叢集中的Leader伺服器掛了,需要一個埠來重新進行選舉,選出一個新的Leader,而這個埠就是用來執行選舉時伺服器相互通訊的埠。

20.0.0.100
在每個節點上建立資料目錄和日誌目錄

mkdir data logs

複製配置好的 Zookeeper 配置檔案到其他機器上

scp -r zookeeper/ 20.0.0.110:/usr/local/
scp -r zookeeper/ 20.0.0.130:/usr/local/


20.0.0.110
20.0.0.130

在每個節點的dataDir指定的目錄下建立一個 myid 的檔案

cd /usr/local/zookeeper/
echo 1 > data/myid
cat data/myid
vim conf/zoo.cfg



20.0.0.110

20.0.0.130

啟動指令碼

cd /usr/local/zookeeper/bin/
vim zkServer.sh
./zkServer.sh start
netstat -lntp | grep 2181
./zkServer.sh status  ##檢視狀態



3.Kafka 概述

中介軟體作用:實現應用解耦、非同步處理
訊息佇列型(MQ):Redis、Kafka、RabbitMQ、RocketMQ、ActiveMQ
Web應用型(代理):Nginx、HAProxy、Tomcat、PHP

(1)為什麼需要訊息佇列(MQ)

主要原因是由於在高併發環境下,同步請求來不及處理,請求往往會發生阻塞。比如大量的請求併發訪問資料庫,導致行鎖表鎖,最後請求執行緒會堆積過多,從而觸發 too many connection 錯誤,引發雪崩效應。

訊息佇列的好處:應用解耦、非同步處理、資料緩衝、流量削峰、可恢復 等

MQ傳統應用場景之非同步處理

(2)訊息佇列的兩種模式

(1)點對點模式(一對一,消費者主動拉取資料,訊息收到後訊息清除)

(2)釋出/訂閱模式(一對多,又叫觀察者模式,消費者消費資料之後不會清除訊息)

(3)Kafka元件

Broker         kafka伺服器
Producer       生產者,釋出訊息到broker中的topic
Consumer       訊息者
Consumer Group 簡稱GC,消費者組,是訊息的時間訂閱者,一個消費者組可包含一個或多個消費者,一個組內的成員不能重複消費同一個Partition資料

Topic          主題,一個訊息佇列的分類,儲存在Broker中

Partition      分割槽,Topic可以包含一個或多個Partition,可以提高資料的擴充套件和併發讀寫能力
               kafka只能保證Partition分割槽內的訊息順序,消費時無法保證Partition之間的順序

Replica        副本,一個Partition可以有多個副本,用來保證Partition資料的高可用,分 leader 和 follower 兩種角色
               leader:一個Partition的副本有且只有一個leader,負責Partition資料的讀寫
			   follower:僅負責備份的leader資料,不負責資料的讀寫

offset         偏移量,記錄消費者上一次消費的訊息位置

Zookeeper      儲存和管理kafka叢集的後設資料,並同步資料給叢集中的其它例項,生產者和消費者的動作也需要zookeeper的管理和支援。
               比如生產者推送資料到kafka叢集需要先透過zk尋找到kafka叢集伺服器的位置,消費者可以從zk獲取offset記錄的上一次消費的位置再繼續往後消費。

Producer -> Topic -> 一個或多個Partition分割槽 -> 一個或多個replica副本(leader,follower)

(4)Kafka 的特性

高吞吐量、低延遲
可擴充套件性
永續性、可靠性
容錯性
高併發

(5)Kafka 系統架構

(1)Broker
(2)Topic
(3)Partition

(6)kafka如何保證資料的可靠性?

kafka是透過 ack 應答機制來保證資料的可靠性。
在生產者配置檔案producer.properties中設定ack應答機制引數 request.required.ack
ack 引數值設定為:
0,表示生產者不等待kafka確認就會繼續傳送下一條訊息。此機制效能最高,但可靠性最低,當leader的broker故障可能會導致資料丟失
1(預設值),表示生產者會等待leader接收資料並確認後才會傳送下一條資料。此機制效能其次,可靠性一般,當follower同步備份完成前leader故障可能會導致資料丟失
-1或all,表示生產者需要等待所有的follower都同步備份完成並確認後才會傳送下一條資料。此機制效能最低,可靠性最高。

(7)問你們公司用的kafka是如何部署的?

先說明kafka的版本,
1)如果是 2.X 版本,則要先部署 3或5 個伺服器的zookeeper叢集,然後在每個zookeeper伺服器上部署kafka應用。
2)如果是 3.X 版本,kafka不再依賴zookeeper,所以可以直接在java17的環境上部署 3或5 個伺服器的kafka叢集。

4.部署 kafka 叢集

20.0.0.100
安裝 Kafka

cd /opt/
rz -E 上傳kafka_2.13-2.8.2.tgz
tar xf kafka_2.13-2.8.2.tgz
mv kafka_2.13-2.8.2 /usr/local/kafka


修改配置檔案

cd /usr/local/kafka/config/
cp server.properties{,.bak}
vim server.properties





kafka檔案儲存機制

index檔案和log檔案的結構示意圖

cd /usr/local/
scp -r kafka/ 20.0.0.110:/usr/local/
scp -r kafka/ 20.0.0.130:/usr/local/


20.0.0.110


20.0.0.130

分別啟動 Kafka

cd /usr/local/kafka/bin/
ls
./kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
netstat -lntp | grep 9092

修改環境變數

vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_391
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH



Kafka 命令列操作

建立topic
ln -s /usr/local/kafka/bin/* /usr/local/bin/
./kafka-topics.sh --create --zookeeper 20.0.0.100:2181,20.0.0.110:2181,20.0.0.130:2181 --replication-factor 2 --partitions 3 --topic test

注:
--zookeeper:定義 zookeeper 叢集伺服器地址,如果有多個 IP 地址使用逗號分割,一般使用一個 IP 即可
--replication-factor:定義分割槽副本數,1 代表單副本,建議為 2 
--partitions:定義分割槽數 

--topic:定義 topic 名稱



kafka/bin/kafka-topics.sh --zookeeper IP1:2181,IP2:2181,IP3:2181 --create --topic 主題名 --partitions 分割槽數 --replication-factor 副本數      #建立topic
kafka/bin/kafka-topics.sh --zookeeper IP1:2181,IP2:2181,IP3:2181 --list                                             #檢視topic列表
kafka/bin/kafka-topics.sh --zookeeper IP1:2181,IP2:2181,IP3:2181 --describe --topic 主題名                          #檢視topic詳細資訊
kafka/bin/kafka-topics.sh --zookeeper IP1:2181,IP2:2181,IP3:2181 --delete --topic 主題名                            #刪除topic
kafka/bin/kafka-topics.sh --zookeeper IP1:2181,IP2:2181,IP3:2181 --alter --topic 主題名 --partitions 分割槽數         #修改topic的分割槽數(只能增不能減)

kafka/bin/kafka-console-producer.sh --broker-list IP1:9092,IP2:9092,IP3:9092 --topic 主題名                           #向topic推送資料
kafka/bin/kafka-console-consumer.sh --bootstrap-server IP1:9092,IP2:9092,IP3:9092 --topic 主題名 [--from-beginning]   #從topic拉取資料






5.Kafka 架構深入

部署 Zookeeper+Kafka 叢集
部署 Filebeat
20.0.0.140

cd /usr/local/filebeat/

vim filebeat.yml

output.kafka:
  enabled: true
  hosts: ["20.0.0.100:9092","20.0.0.110:9092","20.0.0.130:9092"]   #指定 Kafka 叢集配置
  topic: "nginx"   #指定 Kafka 的 topic



#啟動 filebeat
./filebeat -e -c filebeat.yml

部署 ELK,在 Logstash 元件所在節點上新建一個 Logstash 配置檔案
20.0.0.150

cd /etc/logstash/conf.d/
vim kafka.conf

#啟動 logstash
logstash -t -f kafka.conf
logstash -f kafka.conf  

相關文章