Zookeeper + Kafka


ZooKeeper 是一個分布式服務框架,它主要是用來解決分布式應用中經常遇到的一些數據管理問題,
如:命名服務、狀態同步、配置中心、集群管理等。借用阿里的Dubbo圖詳細解釋。

 

 

1. 生產者啟動
2. 生產者注冊至zookeeper
3. 消費者啟動並訂閱頻道
4. zookeeper 通知消費者事件
5. 消費者調用生產者
6. 監控中心負責統計和監控服務狀態

========================================================

節點角色狀態:
LOOKING:尋找 Leader狀態,處於該狀態需要進入選舉流程
LEADING:領導者狀態,處於該狀態的節點說明是角色已經是Leader
FOLLOWING:跟隨者狀態,表示 Leader已經選舉出來,當前節點角色是follower
OBSERVER:觀察者狀態,表明當前節點角色是 observer
選舉 ID:
ZXID(zookeeper transaction id):每個改變 Zookeeper狀態的操作都會形成一個對應的zxid。
ZXID最大的節點優先選為Leader
myid:服務器的唯一標識(SID),通過配置 myid 文件指定,集群中唯一,當ZXID一樣時,myid大的節
點優先選為Leader
zookeeper 集群選舉過程:
當集群中的 zookeeper 節點啟動以后,會根據配置文件中指定的 zookeeper節點地址進行leader 選擇
操作,過程如下:每個zookeeper 都會發出投票,由於是第一次選舉leader,因此每個節點都會把自己當做leader
角色進行選舉,每個zookeeper 的投票中都會包含自己的myid和zxid,此時zookeeper 1 的投票
為myid 為 1,初始zxid有一個初始值0x0,后期會隨着數據更新而自動變化,zookeeper2 的投票
為myid 為2,初始zxid 為初始生成的值。
每個節點接受並檢查對方的投票信息,比如投票時間、是否狀態為LOOKING狀態的投票。
對比投票,優先檢查zxid,如果zxid 不一樣則 zxid 大的為leader,如果zxid相同則繼續對比
myid,myid 大的一方為 leader
成為 Leader 的必要條件: Leader 要具有最高的zxid;當集群的規模是 n 時,集群中大多數的機
器(至少n/2+1)得到響應並follower 選出的 Leader。
心跳機制:Leader 與 Follower 利用PING 來感知對方的是否存活,當 Leader無法響應PING 時,將重
新發起 Leader 選舉。
當 Leader 服務器出現網絡中斷、崩潰退出與重啟等異常情況時,ZAB(Zookeeper Atomic Broadcast)
協議就會進入恢復模式並選舉產生新的Leader服務器。這個過程大致如下:
Leader election(選舉階段):節點在一開始都處於選舉階段,只要有一個節點得到超半數節點的
票數,它就可以當選准 leader。
Discovery(發現階段):在這個階段,followers 跟准 leader 進行通信,同步 followers 最近接
收的事務提議。
Synchronization(同步階段):同步階段主要是利用 leader 前一階段獲得的最新提議歷史,同步集
群中所有的副本。同步完成之后 准 leader 才會成為真正的 leader。
Broadcast(廣播階段) :到了這個階段,Zookeeper 集群才能正式對外提供事務服務,並且
leader 可以進行消息廣播。同時如果有新的節點加入,還需要對新節點進行同步
[19:50:46 root@zookeeper-node1 ~]#cat /usr/local/zookeeper/conf/zoo.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
clientPort=2181
maxClientCnxns=128
autopurge.snapRetainCount=3
autopurge.purgeInterval=24
server.1=10.0.0.201:2888:3888
server.2=10.0.0.202:2888:3888
server.3=10.0.0.203:2888:3888

[19:50:46 root@zookeeper-node1 ~]#echo 1 > /usr/local/zookeeper/data/myid
[19:51:11 root@zookeeper-node1 ~]#echo 2 > /usr/local/zookeeper/data/myid
[19:52:31 root@zookeeper-node1 ~]#echo 3 > /usr/local/zookeeper/data/myid

如果想使用nc命令監控狀態,用於zabbix等,需要添加一下選項,不然會報錯
[19:53:36 root@zookeeper-node1 ~]#echo stat | nc 10.0.0.201 2181
stat is not executed because it is not in the whitelist.
[19:53:49 root@zookeeper-node1 ~]#cat /usr/local/zookeeper/conf/zoo.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
clientPort=2181
maxClientCnxns=128
autopurge.snapRetainCount=3
autopurge.purgeInterval=24
server.1=10.0.0.201:2888:3888
server.2=10.0.0.202:2888:3888
server.3=10.0.0.203:2888:3888

4lw.commands.whitelist=stat,ruok,conf,isro
[19:53:55 root@zookeeper-node1 ~]#echo stat | nc 10.0.0.201 2181
Zookeeper version: 3.6.3--6401e4ad2087061bc6b9f80dec2d69f2e3c8660a, built on 04/08/2021 16:35 GMT
Clients:
 /10.0.0.201:34424[0](queued=0,recved=1,sent=0)
 /10.0.0.202:50822[1](queued=0,recved=3,sent=3)
 /10.0.0.201:34420[1](queued=0,recved=3,sent=3)

Latency min/avg/max: 0/1.0/2
Received: 8
Sent: 7
Connections: 3
Outstanding: 0
Zxid: 0x10000006f
Mode: follower
Node count: 39
=== 查看集群狀態

[19:55:52 root@zookeeper-node1 ~]#zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

[19:58:50 root@zookeeper-node2 ~]#zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

[19:57:37 root@zookeeper-node3 spring-boot-helloWorld]#zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

=== 停掉leader,查看其余follower情況,node2自動提升為leader
[19:57:55 root@zookeeper-node3 spring-boot-helloWorld]#systemctl stop zookeeper.service

[19:59:01 root@zookeeper-node2 ~]#zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

[19:55:55 root@zookeeper-node1 ~]#zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

=== 恢復node3,變為follower,其余node不變
[20:01:18 root@zookeeper-node3 spring-boot-helloWorld]#zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

[20:00:26 root@zookeeper-node1 ~]#zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

[20:00:22 root@zookeeper-node2 ~]#zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

  到此,zookeeper配置完畢,開始安裝kafka,首先了解kafka是什么

Kafka用於構建實時數據管道和流應用程序。 它具有水平可伸縮性,容錯性,快速性,可在數千家組織
中同時投入生產協同工作。 

 

 

特點
分布式: 多機實現,不允許單機
分區: 一個消息.可以拆分出多個,分別存儲在多個位置
多副本: 防止信息丟失,可以多來幾個備份
多訂閱者: 可以有很多應用連接kafka
zookeeper:前提環境zookeeper
優勢
kafka 通過 O(1)的磁盤數據結構提供消息的持久化,這種結構對於即使數以 TB 級別以上的消息存
儲也能夠保持長時間的穩定性能。
高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒數百萬的消息。支持通過Kafka 服務器分
區消息。
支持 Hadoop 並行數據加載。
通常用於大數據場合,傳遞單條消息比較大(Rabbitmq 消息主要是傳輸業務的指令數據,單條數據較
小) 

 

 

kafka最主要的是分區和副本概念,分片是負載均衡,解決單台服務器容量問題,副本技術是高可用,解決存儲數據問題

 

 

 

Broker 依賴於 Zookeeper,每個Broker 的id 和 Topic、Partition這些元數據信息都會寫入
Zookeeper 的 ZNode 節點中
consumer 依賴於Zookeeper,Consumer 在消費消息時,每消費完一條消息,會將產生的offset
保存到 Zookeeper 中,下次消費在當前offset往后繼續消費.kafka0.9 之前Consumer 的offset 存
儲在 Zookeeper 中,kafka0,9 以后offset存儲在本地。
Partition 依賴於 Zookeeper,Partition 完成Replication 備份后,選舉出一個Leader,這個是依
托於 Zookeeper 的選舉機制實現的 
關鍵配置在於集群配置:唯一的broker.id, zookeeper.connect -》zookeeper集群
[20:01:48 root@zookeeper-node2 ~]#cat /usr/local/kafka/config/server.properties
broker.id=2
listeners=PLAINTEXT://10.0.0.202:9092
log.dirs=/usr/local/kafka/data
num.partitions=1
log.retention.hours=168
zookeeper.connect=10.0.0.201:2181,10.0.0.202:2181,10.0.0.203:2181
zookeeper.connection.timeout.ms=6000h

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM