向廣告低頭,Netflix 考慮推出更便宜訂閱計劃
一、Zookeeper原理與指令碼啟動
1、zkServer命令
./zkServer.sh start
./zkServer.sh status
檢查是否啟動zk:jps 檢視是否有QorumPeerMain
2、zkCli.sh命令
help:檢視所有命令
create /itcast 8000$
get /itcast
set /itcast xxx
ls /
3、zoo.cfg配置檔案詳解
tickTime=2000 //每個tickTime 時間 leader和follower之間傳送一個心跳
dataDir=D:/devtools/zookeeper-3.2.2/build //存放資料目錄
clientPort=2181 //應用客戶端連線zk埠請求
initLimit=5 //leader接受新的follower初始化連線最大忍受的心跳個數, 例如5*2s=10s
syncLimit=2 //leader 與 follower 之間傳送訊息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 2*2000=4 秒
server.1=192.168.211.1:2888:3888 //2888埠:伺服器與叢集中的Leader 伺服器交換資訊的埠
server.2=192.168.211.2:2888:3888 //3888埠:萬一叢集中的Leader 伺服器掛了,需要一個埠來重新進行選舉,選出一個新的 Leader,而這個埠就是用來執行選舉時伺服器相互通訊的埠。
二、叢集配置
1新增一個zoo.cfg配置檔案 $ZOOKEEPER/conf mv zoo_sample.cfg zoo.cfg 2修改配置檔案(zoo.cfg) dataDir=/itcast/zookeeper-3.4.5/data server.1=192.168.186.128:2888:3888 server.2=192.168.186.129:2888:3888 server.3=192.168.186.130:2888:3888 3在(dataDir=/itcast/zookeeper-3.4.5/data)建立一個myid檔案,裡面內容是server.N中的N(server.2裡面內容為2) echo "1" > myid 指定對應上述server的id號 4將配置好的zk拷貝到其他節點 scp -r /itcast/zookeeper-3.4.5/ [email protected]:/itcast/ scp -r /itcast/zookeeper-3.4.5/ [email protected]:/itcast/ 5注意:在其他節點上一定要修改myid的內容 在itcast06應該講myid的內容改為6 (echo "2" > myid) 在itcast07應該講myid的內容改為7 (echo "3" > myid)
a、演示三臺機器,1臺機器啟動後zk的狀態,2臺啟動後的狀態,3臺啟動的狀態
1臺啟動,需等待其他2臺
2臺啟動
超過半數即可
b、演示leader機器宕機,其餘follow節點自動選舉成為leader節點,leader節點重啟後,自動變成follow節點
注意:如果不起來,先啟用./zkCli.sh,再使用./zkServer.sh status
實驗演示:當修改follower節點,資料也會自動同步
三、Znode資料結構介紹
1. 唯一標識:每個子目錄項如NameService 都被稱作為 znode,這個 znode 是被它所在的路徑唯一標識,如 Server1 這個 znode 的標識為 /NameService/Server1
2. 支援子節點:znode 可以有子節點目錄,並且每個 znode 可以儲存資料,注意 EPHEMERAL 型別的目錄節點不能有子節點目錄
3. znode 具有版本號:每個 znode 中儲存的資料可以有多個版本,也就是一個訪問路徑中可以儲存多份資料
4. znode 支援臨時節點特性:一旦建立這個 znode 的客戶端與伺服器失去聯絡,這個 znode 也將自動刪除,Zookeeper 的客戶端和伺服器通訊採用長連線方式,每個客戶端和伺服器通過心跳來保持連線,這個連線狀態稱為 session,如果 znode 是臨時節點,這個 session 失效,znode 也就刪除了
5. znode 的目錄名自動遞增編號:如 App1 已經存在,再建立的話,將會自動命名為 App2
6. znode 可被監控:包括這個目錄節點中儲存的資料的修改,子節點目錄的變化等,一旦變化可以通知設定監控的客戶端,這個是 Zookeeper 的核心特性,Zookeeper 的很多功能都是基於這個特性實現的。
四、Zookper叢集管理應用
/GoupMembers:EPHEMERAL臨時節點
/client1: EPHEMERAL_SEQUENTIA節點
/client2: EPHEMERAL_SEQUENTIA節點
1、所有client,監聽getChildren(String path, boolean watch)
這裡監聽 /GroupMembers目錄,當任一客戶端掛了後,這個目錄節點也自動刪除,其他server都知道某臺sever掛了。
2、ZK如何實現Leader選舉的
給每臺Server編號,我們可以選擇當前是最小編號的Server為Master,假如這個最小編號的Server死去,由於是EPHEMERAL節點,死去的Server對應的節點也被刪除,所以當前的節點列表中又出現一個最小編號的節點,我們就選擇這個節點為當前Master。這樣就實現了動態選擇Master,避免了傳統意義上單Master容易出現單點故障的問題
五、Zookeeper分散式鎖應用
共享鎖在同一個程序中很容易實現,但是在跨程序或者在不同 Server 之間就不好實現了。Zookeeper 卻很容易實現這個功能,實現方式也是需要獲得鎖的 Server 建立一個 EPHEMERAL_SEQUENTIAL 目錄節點,然後呼叫 getChildren方法獲取當前的目錄節點列表中最小的目錄節點是不是就是自己建立的目錄節點,如果正是自己建立的,那麼它就獲得了這個鎖,如果不是那麼它就呼叫 exists(String path, boolean watch) 方法並監控 Zookeeper 上目錄節點列表的變化,一直到自己建立的節點是列表中最小編號的目錄節點,從而獲得鎖,釋放鎖很簡單,只要刪除前面它自己所建立的目錄節點就行了。