1. 程式人生 > >Centos-7.2 下搭建 Zookeeper-3.5.3 叢集的搭建與測試

Centos-7.2 下搭建 Zookeeper-3.5.3 叢集的搭建與測試

《 Centos7下Zookeeper叢集的搭建與測試 》

前言:

在這兒通過搭建三個 zookeeper 例項,實現 zookeeper 的叢集環境的搭建工作,在實際開發工作中,將對應的 zookeeper 例項修改為各個 zookeeper 伺服器節點即可實現同樣的效果。
如果對 zookeeper 的相關操作,不是很熟悉,建議先從 《 搭建單機版 Zookeeper 分散式應用程式協調服務 》開始!!!



搭建環境:

作業系統:Centos7

zookeeper 版本:zookeeper-3.5.3

JDK 版本 : jdk-1.8

1、搭建 zookeeper 前準備

1)、儲存快照檔案snapshot的目錄。預設情況下,事務日誌也會儲存在這裡,所以在這兒需要建立三個 “資料檔案” 目錄:

“ mkdir /home/temp/cluster_zk/data/zk_data_001 -p ”
“ mkdir /home/temp/cluster_zk/data/zk_data_002 -p ”
“ mkdir /home/temp/cluster_zk/data/zk_data_003 -p ”
建立完成後,如下圖:





注意:建立完成後,在每個 data 目錄下,建立一個 myid,直接輸入命令 “ vi myid ”,輸入值儲存即可,id 範圍: 1001~1003 後面好用!
或者輸入命令 “ echo "1001">myid ” 進行設值,輸入命令 “ cat myid ” 可以檢視是否設值成功,這個比較好用喲!!!


2)、日誌的目錄,將日誌存放在指定的日誌目錄中:
“ mkdir /home/temp/cluster_zk/logs/zk_logs_001 -p ”
“ mkdir /home/temp/cluster_zk/logs/zk_logs_002 -p ”
“ mkdir /home/temp/cluster_zk/logs/zk_logs_003 -p ”
建立完成後,如下圖:




2、建立三個 zookeeper 例項:

“ cp zookeeper-3.5.3-beta /usr/local/zk_cluster/zk_service_001 -r ”
“ cp zookeeper-3.5.3-beta /usr/local/zk_cluster/zk_service_002 -r ”
“ cp zookeeper-3.5.3-beta /usr/local/zk_cluster/zk_service_003 -r ”
建立完成後,如下圖:




3、修改 zookeeper 配置檔案:

使用埠範圍:2001~2003

配置詳解:

# zookeeper 中的一個時間單元,以毫秒為單位  
tickTime=2000  
# follower 在啟動過程中,會從leader同步所有最新資料,然後確定自己能夠對外服務的起始狀態。  
# leader 允許在 initLimit 時間內完成這個工作  
initLimit=10  
# 如果 leader 發出心跳包在 syncLimit 之後,還沒有從 follower 那裡收到響應,那麼就認為這個已經不線上了  
syncLimit=5  
# 儲存快照檔案snapshot的目錄。預設情況下,事務日誌也會儲存在這裡。  
# 建議同時配置引數dataLogDir, 事務日誌的寫效能直接影響zk效能。  
dataDir=/home/temp/cluster_zk/data/zk_data_001/
# 在這個指定了日誌的目錄,日誌存放在指定的日誌目錄中  
dataLogDir=/home/temp/cluster_zk/logs/zk_logs_001/
# 客戶端連線server的埠,即對外服務埠  
clientPort=2001  
# 單個客戶端與單臺伺服器之間的連線數的限制,是ip級別的,預設是60,  
# 如果設定為0,那麼表明不作任何限制  
#maxClientCnxns=60  
# 這個引數和下面引數配合使用  
# 指定了需要保留的檔案數目。預設是保留3個  
#autopurge.snapRetainCount=3  
# 3.4.0 及之後版本,zookeeper 提供了自動清理事務日誌和快照檔案的功能,  
# 這個引數指定了清理頻率,單位是小時,需要配置一個1或更大的整數,  
# 0表示不開啟自動清理功能  
#autopurge.purgeInterval=1  
# 這兒三臺機器都可以一樣
# 語法格式:server + myid = IP + 選舉埠 + 投票埠
server.1001=192.168.78.141:3001:4001
server.1002=192.168.78.141:3002:4002
server.1003=192.168.78.141:3003:4003




zookeeper 例項一:zk_service_001 配置後,如下圖:




zookeeper 例項二:zk_service_002 配置後,如下圖:




zookeeper 例項三:zk_service_003 配置後,如下圖:




注意:需要先將 zookeeper 的配置檔案修改為 “ zoo.cfg ”,不能直接使用 “ zoo_simple.cfg ” 配置檔案,不然後面會報錯;

4、編寫 zookeeper 叢集啟動指令碼兒

為了方便啟動節點,不用每次都去單個節點啟動,這兒編寫一個啟動指令碼兒,輸入命令 “ vi zk_cluster_start_all.sh ” ,
啟動指令碼兒建立完成後,還需要新增可執行的許可權,輸入命令 “ chmod +x zk_cluster_start_all.sh ” ,如下圖:


指令碼兒內容:





測試啟動指令碼兒,如下圖:




5、編寫 zookeeper 叢集停止指令碼兒

不用每次都去單個節點停止,這兒再編寫一個停止指令碼兒,輸入命令 “ vi zk_cluster_stop_all.sh ” ,
zookeeper 叢集服務停止指令碼兒建立完成後,還需要新增可執行的許可權,輸入命令 “ chmod +x zk_cluster_stop_all.sh ” ,如下圖:




測試停止指令碼兒,如下圖:




6、zookeeper 叢集環境測試

1)、連線到 zookeeper 例項一 
輸入命令 “ zk_service_001/bin/zkCli.sh -server 192.168.78.141:2001 ” 
當然也可以直接輸入命令 “  zk_service_001/bin/zkCli.sh ” 進行連線,
關於這個連線命令沒有特殊要求,上面個連線命令是我個人習慣!!!
並新建一個永久節點,輸入命令 “ create /zk/node_001 huazai ”
獲取節點的元資料,輸入命令 “ get /zk/node_001 ”
操作內容如下圖:




2)、檢視節點同步情況,連線到 zookeeper 例項二
輸入命令 “ zk_service_002/bin/zkCli.sh -server 192.168.78.141:2002 ” 




3)、檢視節點同步情況,連線到 zookeeper 例項三
輸入命令 “ zk_service_003/bin/zkCli.sh -server 192.168.78.141:2003 ” 




7、zookeeper 主從節點測試

在一個叢集環境中,當一個 “ leader ” 實力宕機的時候,從節點 “ follower ” 自動選舉;
在剩餘的  “ follower ” 中選舉出一個 “ leader ” ,讓生產環境可以繼續正常的工作,這就是叢集實際存在的意義。
下面我將模擬叢集中的 “ leader ” 主機出現宕機的情況,也就是把 zookeeper 例項二幹掉,在檢視狀態時;
發現 zookeeper 例項三被選舉為了 “ leader ” 了。
如下圖:






在叢集啟動時,你可能遇到 zookeeper 叢集啟動成功,但是連結失敗的問題如下圖:




在這兒再介紹兩個在 zookeeper 使用上比較多的場景或比較實用的場景:

  • 一)、共享鎖(Locks)
共享鎖在同一個程序中很容易實現,但是在跨程序或者在不同 Server 之間就不好實現了。Zookeeper 卻很容易實現這個功能,實現方式也是需要獲得鎖的 Server 建立一個 EPHEMERAL_SEQUENTIAL 目錄節點,然後呼叫 getChildren方法獲取當前的目錄節點列表中最小的目錄節點是不是就是自己建立的目錄節點,如果正是自己建立的,那麼它就獲得了這個鎖,如果不是那麼它就呼叫 exists(String path, boolean watch) 方法並監控 Zookeeper 上目錄節點列表的變化,一直到自己建立的節點是列表中最小編號的目錄節點,從而獲得鎖,釋放鎖很簡單,只要刪除前面它自己所建立的目錄節點就行了。


  • 二)、佇列管理
Zookeeper 可以處理兩種型別的佇列:
1)、當一個佇列的成員都聚齊時,這個佇列才可用,否則一直等待所有成員到達,這種是同步佇列。
2)、 佇列按照 FIFO 方式進行入隊和出隊操作,例如實現生產者和消費者模型。
同步佇列用 Zookeeper 實現的實現思路如下:
建立一個父目錄 /synchronizing,每個成員都監控標誌(Set Watch)位目錄 /synchronizing/start 是否存在,然後每個成員都加入這個佇列,加入佇列的方式就是建立 /synchronizing/member_i 的臨時目錄節點,然後每個成員獲取 / synchronizing 目錄的所有目錄節點,也就是 member_i。判斷 i 的值是否已經是成員的個數,如果小於成員個數等待 /synchronizing/start 的出現,如果已經相等就建立 /synchronizing/start。











好了,關於 zookeeper 叢集環境的搭建就到此結束了,如果還有什麼疑問或遇到什麼問題,可以給我留言。
歇後語:“共同學習,共同進步”,也希望大家多多關注CSND的IT社群。
需要了解更多關於 zookeeper 相關的內容,請點選下面 圖示 進入官網: