Zookeeper
1) 簡介
Zk使用的是一個類似文件系統的數結構來管理。每個節點在zk中為znode,有一個唯一的標識路徑。Znode中可以再包含znode或者存放數據;znode中的數據可以由多個版本,因為這些數據在同一個目錄下,所以在查詢的時候必須帶上版本號。
(1) 臨時節點:EPHEMERAL,zk中的節點分為臨時節點與永久性節點。臨時節點的生命周期依賴於其創建的會話。當創建這個znode的客戶端與服務器失去聯系,這個znode的session即失效,znode中的數據將被刪除。臨時節點是不能有子節點的。永久性節點只有在客戶端顯示的刪除才會從zk中去除。
(2) 監控。如果znode中的數據或者子節點的目錄發生變化,可以通知設置監控的客戶端。即watches.客戶端在節點上設置watch,當節點狀態發生改變會觸發watch所對應的操作。當watch被觸發,zk向客戶端發送一條通知。
(3) 數據訪問。每個節點存儲的數據都是原子性的操作。讀取返回節點中的所有數據,寫入將會替換節點中的所有數據。
(4) 順序節點。創建znode時,用戶可以請求在zk的路徑后面加一個遞增的計數。這個計數對於父節點來說是唯一的。
(5) 持久順序節點:PERSISTENT_SEQUENTIAL,與持久節點不同的是,父節點會記錄下每個子節點的創建順序,可以利用這個屬性,zk給節點后面添加一個后綴,作為新的節點名稱。有范圍的限制,其值為整型的最大值。
(6) 臨時順序節點:EPHEMRAL_SEQUENTIAL,利用臨時順序節點可以實現共享鎖。
每個znode由3部分組成:
Stats:狀態描述,權限、版本等
Childen:該節點下的子節點
Data:相關的數據信息
問題:
- zk中有沒有訪問控制,授權的設置?
有,zk中的ACL
- 什么時候需要創建臨時節點?
比如zookeeper發布服務時,服務啟動時將自己的信息注冊為順序節點,當服務斷掉之后,臨時節點也會被刪除。
- 順序節點的作用?
可以有助於生成序列號
- 為什么kafka要使用zookeeper,zk主要應用於什么場景?
Kafka使用zk將消息生成、存儲、消費等過程結合在一起。借助zk,能夠將所有組件在無狀態的情況下組合在一起,實現生產者與消費者的負載均衡。
- 注冊broker,注冊topic,獲知每個topic的partition
- 負載均衡consumer,存儲offset
管理kafka中各種狀態信息。
其中zk使用的場景包括:
1、 需要進行統一的命名服務,zk使用的是樹形結構,可以避免產生一樣的名稱
2、 配置管理,在多服務器的情況下,將公共的配置信息放在zk中,利用watch,一旦配置信息發生了改變,每個服務器都將得到信息。
3、 集群管理。獲取每台服務器的狀態,新增或者宕機都必須馬上通知其他的機器,實現主從的集群配置。
4、 共享鎖。在跨進程或者跨
2) zkCli命令
利用bin下的zkCli來對zk進行管理。
ZkCli.sh -server 127.0.0.1:2181完成服務器連接,切記,server前面只有一個橫線
(1) 查看按當前zk中包含的內容
ls
[cluster, controller, controller_epoch, brokers, zookeeper, admin, isr_change_notification, consumers, config]
看到這里不禁問,這些分別代表什么,一個個的進行闡述
Cluster
Controller
管理leader election及各種failover,管理partition及副本狀態,如果當前的controller失敗,會從其它正常的broker中選擇一個出來,那么這個與leader之間的區別呢?leader是否可能是controller?
所有的partition都會有一個leader,這個由controller決定,這個controller只是broker中的一個。而有多少個partition就會有多少個leader。
Config
其下的節點為:changes,clients,topics,從名稱中可以看出是客戶及topics的信息
Admin
估摸是與授權有關系。
(2) 創建節點
Create /zk/node1 在zk目錄下創建一個node1的節點
在其下設置其關聯的字符串:set /zk/node1 “node1”
(3) 獲取節點信息
get /zk/node1
得到的結果如下:
node1 cZxid = 0x20000038e ctime = Tue May 09 20:30:02 CST 2017 mZxid = 0x200000393 mtime = Wed May 10 08:37:00 CST 2017 pZxid = 0x20000038e cversion = 0 dataVersion = 2 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 5 numChildren = 0 |
(4) 刪除節點
Delete /zk/node1
問題:1.如何正確退出zkCli.sh的命令台
3) Zk的四字字母命令
(1) Conf 輸出相關服務配置的詳細信息
echo conf |nc 127.0.0.1 2181
得到的結果為:
clientPort=2181 dataDir=/home/zookeeper/data/version-2 dataLogDir=/home/zookeeper/log/version-2 tickTime=2000 maxClientCnxns=60 minSessionTimeout=4000 maxSessionTimeout=40000 serverId=2 initLimit=10 syncLimit=5 electionAlg=3 electionPort=3888 quorumPort=2888 peerType=0 |
可以看到主要是一些設置的信息
重要的配置信息:
tickTime:CS通信的心跳間隔時間。是在服務器之間或者服務器與客戶端之間維持的心跳時間間隔。該值設置的過小,會導致會話容易超時。
minSessionTimeout:客戶端與服務器之間保持連接的最小超時時間。
maxSessionTimeout:最大的超時時間,所以客戶端在設置會話的超時時間時,其值必須處於最大超時與最小超時之間,否則會被強制設置為最大或者最小值。
initLimit:備份節點與主節點之間初次連接時能夠容忍的最多心跳數,該值*tickTime為能夠容忍的時間。
syncLimit:同步時,備份節點與主節點之間能夠容忍的最多心跳數。
electionAlg:選舉算法。3對應FastLeaderElection算法,該值為默認值
electionPort:進行選舉采用的端口,其中3888,在選舉階段監聽其它服務器的連接。
quorumPort:其中Quorum為分布式系統中用來保證數據冗余和最終一致性的投票算法。2888為服務器之間通信的端口。如果該服務器為領導者,用來監聽追隨者。
peerType:是否為觀察者,主要有兩種:觀察者或者參與者。0代表參與者
問題:
- initLimit: 是完成的時間還是建立連接能夠容忍的時間?
是指leader允許follower在此時間內完成同步的工作。
- syncLimit: 即同步必須在此時間內完成or主節點可以比備份節點異步的時間間隔?
在通信的過程中,檢測follower的存活狀態,如果在該時間內沒有收到follower的響應則認為follower已經失效了。
- 觀察者與參與者時間的區別
因為寫入操作必須是達到投票的半數,才能夠生效,所以,如果隨着節點不斷增加,相應的寫入成本會增加。基於此,觀察者加入,觀察者也可以處理讀取與寫入,會將這些請求給領導者,但是它與觀察者之間有一點區別,不參與投票,只監聽結果,所以增加觀察者不會影響zk服務的。
- 2181與2888,3888之間的區別
其中2181是監聽zk客戶端的連接。
- Nc是什么命令
它其實是netcat的簡寫,一個簡單、可靠的網絡工具,這里的具體可以去查看相關資料
(2) Cons 得到連接信息的情況
/127.0.0.1:60098[1](queued=0,recved=213973,sent=213994,sid=0x25abaf5919b0000,lop=PING,est=1493971756904,to=6000,lcxid=0x2e2,lzxid=0x200000399,lresp=1494398623479,llat=0,minlat=0,avglat=0,maxlat=501) /127.0.0.1:44204[0](queued=0,recved=1,sent=0) |
可以看到包括的信息有:
Ip,端口,接收包數、發送包數、連接的session id,最后的操作方式等信息
(3) 查看是否已經啟動了某服務
echo ruok|nc 127.0.0.1 2181
Imok
返回的lmok表示已經啟動了本地的zk服務
相對的,使用
(4) Stat
狀態信息及連接信息,比如是否為leader,
相應的有個mntr能夠得到更多的監控zk的健康狀態等各種信息,包括追隨者數目等
(5) Wchs
有watch path的連接數及watch的路徑數
(6) Wchc
則更為細致的指出watch的有關path
4) ZkServer.sh
Status得到zk服務的狀態:./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/software/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: leader
包括使用的配置文件,當前的mode
問題:
- 如何實現一套zookeeper管理多個Kafka集群?
(1)首先在zk中創建節點
(2)可以選擇在kafka的配置文件中的zookeeper添加節點的路徑
(3)如果是不同的集群可以創建不同的節點,然后不同的broker連接到不同的節點路徑下
- 如何正確關閉zk集群
直接到bin文件夾中啟動 zkServer.sh stop
- 如何正確關閉kafka
直接到bin文件夾中啟動 kafka-server-stop.sh