1. 程式人生 > >zookeeper 偽叢集搭建

zookeeper 偽叢集搭建

簡介

Zookeeper 是 一個分散式。開放原始碼的分散式應用程式協調服務,是Google Chubby的一個開源實現,大多數的分散式應用都需要Zookeeper的支援,這篇文章先簡單的和大家分享如何搭建一個zookeeper叢集。(筆者注:Chubby是一個lock service,通過這個lock service可以解決分散式中的一致性問題。為這個lock service的實現是一個分散式的檔案系統。

  • 環境: 由於我是用自己的筆記本做實驗,所以就用了一臺虛擬機器;其實和真實的差不多;也就配置有些許不同。
    這是我的虛擬機器版本
  • 步驟

第一步:在你的虛擬機器上安裝JDK/JRE ;
第二步:下載zookeeper:

http://mirrors.hust.edu.cn/apache/zookeeper/
這邊下載版本的需要注意了。3.4.6 和3.4.8+ 是有區別的,後面具體說一下,建議下載3.4.8+。
第三步:建立相關目錄,解壓zk 目錄和日誌目錄。
mkdir /tools/zookeeper/zookeeper-3.4.6/server1
mkdir /tools/zookeeper/zookeeper-3.4.6/server2
mkdir /tools/zookeeper/zookeeper-3.4.6/server3
mkdir /data/dataLogs/zookeeper/s1
mkdir /data/dataLogs/zookeeper/s2
mkdir /data/dataLogs/zookeeper/s3

這裡寫圖片描述

這裡寫圖片描述

第四步:上傳安裝包到伺服器到 server1 目錄;
第五步: 解壓使用 “tar -xzvf zookeeper-3.4.8.tar.gz “來 解壓安裝包 。
解壓後的目錄如下:
zookeeper 解壓目錄

第五步:修改zookeeper配置檔案(叢集和資料目錄的配置)
使用“cp zoo_sample.cfg zoo.cfg”來建立一個zookeeper配置檔案,在zoo.cfg中配置syncLimit,dataDir,clientPort,autopurge.purgeInterval,以及叢集的server list

這裡寫圖片描述

這幾個引數主要是注意一下:
dataDir zk 的放置一下資料的目錄如版本號,id 等等,所以每一個節點都區分一下如,/data/dataLogs/zookeeper/s1;

clientPort 接受客戶端請求的埠,每個節點都需要不一樣。如:2181

server.X 這個數字就是對應 data/myid中的數字。你在3個server的myid檔案中分別寫入了1,2,3,那麼每個server中的zoo.cfg都配server.1,server.2,server.3就OK了。因為在同一臺機器上,後面連著的2個埠3個server都不要一樣,否則埠衝突,其中第一個埠用來叢集成員的資訊交換,第二個埠是在leader掛掉時專門用來進行選舉leader所用。

具體的檔案,我會附在附件中。

好了,現在一個節點已經配置好了,其他就使用cp 命令直接複製到server2 ,server3 下;主要需要更改clientPort dataDir.

第六步: 建立myid 檔案,分別在dataDir 設定的目錄下建立myid,裡面內容填寫server.X 中的X 就好,比如我上面寫的1,2,3;

這裡寫圖片描述

到這一步之後基本就完成了配置,現在我們來啟動看看。

使用命令 :
./zkServer.sh start

./ zkServer.sh status

這裡寫圖片描述

好了已經啟動。已經成功了!

注意:如果你是第一啟動,看到日誌裡面報錯類似下面的:

 [myid:2] - WARN  [WorkerSender[myid=2]:QuorumCnxManager@382] - Cannot open channel to 3 at election address /127.0.0.1:3890
java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:341)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:449)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:430)
    at java.lang.Thread.run(Thread.java:745)

不要擔心,這個只是其他節點沒有開啟,它在嘗試連線而已。把其他節點都啟動了,就可以了。

下面講一下我在部署偽叢集過程出的錯,真的是鬱悶死了。。

我剛開始下載的3.4.6 版本的zk ,下載後也是按照上述的步驟配置後,一直報:

Error: Could not find or load main class org.apache.zookeeper.server.quorum.

一直說找不到這類,開始我還以為是jdk 版本的問題,但是我想也不對啊。這類明顯是zk 自己的啊,我就去目錄下找了一下;發現3.4.6 目錄加壓後是沒有lib 和 zookeeper-3.4.x.jar.
這裡寫圖片描述

所以如果你下載的是3.4.6以下的版本的,需要手動加,火車票在伺服器上下載這些資源。