zookeeper 高可用叢集搭建

張少林同學發表於2019-01-23

zookeeper 高可用叢集搭建

前言

記錄Zookeeper叢集搭建的過程!

什麼是 Zookeeper ?

ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要元件。它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務、分散式同步、組服務等。

劃重點:分散式應用程式協調服務,在分散式系統中,通常需要一個通用的服務註冊與發現中心,因此Zookeeper就是充當這樣的角色,國內非常出名的分散式框架Dubbo也建議使用Zookeeper作為服務註冊與發現中心。

zookeeper 高可用叢集搭建

環境準備

準備三臺Linux虛擬機器,前往官網下載zookeeper壓縮包,如果不知道官網如何下載,可在公眾號「張少林同學」回覆Java工具獲取網盤下載連結

OS 主機名 ip zookeeper/埠
centos7 LIHETEST6 192.168.2.216 zookeeper-3.4.11.tar.gz/2181
centos7 LIHETEST7 192.168.2.217 zookeeper-3.4.11.tar.gz/2181
centos7 LIHETEST8 192.168.2.218 zookeeper-3.4.11.tar.gz/2181

配置伺服器 hosts 對映

在三臺伺服器分別做以下操作,這裡以 LIHETEST6 為例:

  • 檢視本機主機名:hostname
  • vim /etc/hostname 刪除原有內容,新增主機名:LIHETEST6
  • 設定主機名及IP對映 : vim /etc/hosts 在檔案尾部新增內容,格式為: IP 地址 主機名 (中間用空格分割),儲存退出,例如:192.168.2.216 LIHETEST6
  • 重啟網路服務:systemctl restart network

單機部署

Zookeeper壓縮包上傳到伺服器後,解壓

//上傳壓縮包
scp zookeeper-3.4.11.tar.gz root@192.168.2.219:/home/tools
//登入到伺服器目錄 解壓
tar -zxvf zookeeper-3.4.11.tar.gz
//進入zookeeper主目錄
cd zookeeper-3.4.11
複製程式碼

解壓後看看都有哪些內容:

zookeeper 高可用叢集搭建

我們只需要把焦點定位到這兩個目錄:

  • bin目錄:指令碼執行目錄,裡面放置一些Zookeeper啟動指令碼等
  • conf目錄:配置檔案目錄

執行指令碼命令./bin/zkServer.sh start 啟動Zookeeper,結果如下:

zookeeper 高可用叢集搭建

提示找不到 ../conf/zoo.cfg檔案,但是最後卻列印STARTED,於是執行./bin/zkServer.sh status看看當前Zookeeper狀態,結果如下:

zookeeper 高可用叢集搭建

上述結果很清晰明瞭了,Zookeeper啟動失敗,原因是找不到配置檔案:./conf/zoo.cfg./bin/zkServer.sh start命令啟動時,預設會使用此配置檔案啟動,而初始化時./conf目錄下並無此檔案,檢視./conf中存在一個樣例配置檔案./conf/zoo_sample.cfg,於是執行cp ./conf/zoo_sample.cfg ./conf/zoo.cfg複製一份./conf/zoo.cfg檔案出來,再次執行命令啟動Zookeeper,結果如下:

zookeeper 高可用叢集搭建

可以看出Zookeeper已經啟動了,並且是單機模式啟動。

再看看啟動日誌資訊cat zookeeper.out:

zookeeper 高可用叢集搭建

zookeeper啟動,繫結在2181埠,檢視一下程式是否存在:netstat -lntp | grep 2181,結果如下:

tcp6       0      0 :::2181                 :::*                    LISTEN      27201/java 
複製程式碼

配置檔案解析

zookeeper 高可用叢集搭建

  • tickTime:客戶端與服務端保持心跳的毫秒數
  • initLimit:初始容忍的心跳數
  • syncLimit:等待最大容忍的心跳數
  • dataDir:儲存快照的目錄,這裡預設是使用系統臨時目錄,真實使用時建議自定義目錄
  • clientPort:暴露給客戶端訪問的埠

單機偽叢集部署

有時候我們會在本機搭建一個偽叢集,用於專案程式碼測試,那麼只需要啟動三個不同配置的Zookeeper即可,只要埠不同,即可視為不同的程式。

./conf目錄下新增zoo1.cfgzoo2.cfgzoo3.cfg配置檔案,其中dataDir目錄依次都不同,clientPort分別配置為218121822183。啟動Zookeeper時,顯式指定配置檔案,如:./bin/zkServer.sh start conf/zoo3.cfg ,依次啟動三個Zookeeper配置檔案。。那麼最終執行netstat -lntp看下埠監聽情況:

zookeeper 高可用叢集搭建

可以看到啟動了三個監聽不同埠的Zookeeper.

多機叢集部署

在真實生產環境中,我們一般會搭建一個多機器叢集的,目的很明顯,為了提高容錯能力。

在三臺機器中,每檯安裝一個Zookeeper服務,這三臺機器形成一個小規模的叢集。

在每臺機器中修改./conf/zoo.cfg配置檔案如下:

  initLimit=10 // 初始容忍的心跳數
  syncLimit=5  // 等待最大容忍的心跳數
  dataDir=/home/wwwroot/easywits/tools/zookeeper-3.4.11/data    //資料儲存目錄
  dataLogDir=/home/wwwroot/easywits/tools/zookeeper-3.4.11/logs //資料日誌檔案目錄
  clientPort=2181 //zookeeper 監聽埠
  server.1=192.168.2.216:2888:3888 //主機ip/服務間心跳連線埠/資料埠
  server.2=192.168.2.217:2888:3888
  server.3=192.168.2.218:2888:3888
複製程式碼

分別在每臺伺服器 資料目錄 /home/wwwroot/easywits/tools/zookeeper-3.4.11/data 中新增名為 myid 文字檔案,內容依次為 0,1,2,這是叢集中每臺 Zookeeper服務的唯一標識,不能重複,以第一臺為例:

echo "0"  > /home/wwwroot/easywits/tools/zookeeper-3.4.11/data/myid
複製程式碼

啟動 Zookeeper : ./bin/zkServer.sh start

檢視每臺伺服器中,Zookeeper狀態:./bin/zkServer.sh status,結果分別如下:

  Using config: /home/wwwroot/easywits/tools/zookeeper-3.4.11/bin/../conf/zoo.cfg
  Mode: follower

  Using config: /home/wwwroot/easywits/tools/zookeeper-3.4.11/bin/../conf/zoo.cfg
  Mode: leader

  Using config: /home/wwwroot/easywits/tools/zookeeper-3.4.11/bin/../conf/zoo.cfg
  Mode: follower
複製程式碼

可以看到啟動模式,第一臺與第三臺為follower,而第二臺為leader

注意:Zookeeper叢集規模,機器數量只能是奇數個,在三臺機器叢集的情況下,最多隻能掛掉其中一臺,如果主節點掛掉,剩下兩臺服務會重新選舉一臺作為主節點。

總結

  • Zookeeper啟動失敗,可以在./zookeeper.out檔案檢視異常日誌
  • 每臺機器的myid中內容為服務的唯一標識,不能重複
  • 確保每臺機器必須能ping通,必要時請先關閉防火牆
  • 在阿里雲伺服器上,請使用內網ip進行配置
  • 確保使用的埠未被佔用
  • Zookeeper叢集機器數量只能是奇數個,詳見 www.cnblogs.com/LeeScofiled…

ps:關於需要用到的工具,可在公眾號「張少林同學」回覆Java工具獲取網盤下載連結

最後

記錄一波Zookeeper搭建過程,後續會不定期更新原創文章,歡迎關注公眾號 「張少林同學」!

zookeeper 高可用叢集搭建

相關文章