1. 程式人生 > >Zookeeper之——Zookeeper的安裝模式

Zookeeper之——Zookeeper的安裝模式

ZooKeeper的安裝模式分為三種,分別為:單機模式(stand-alone)、叢集模式和叢集偽分佈模式。ZooKeeper 單機模式的安裝相對比較簡單,如果第一次接觸ZooKeeper的話,建議安裝ZooKeeper單機模式或者叢集偽分佈模式。

1)單機模式

首先,從Apache官方網站下載一個ZooKeeper 的最近穩定版本。

為了今後操作的方便,我們需要對 ZooKeeper 的環境變數進行配置,方法如下,在 /etc/profile 檔案中加入如下的內容:

#Set ZooKeeper Enviroment
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.9
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
ZooKeeper 伺服器包含在單個 JAR 檔案中,安裝此服務需要使用者建立一個配置文件,並對其進行設定。我們在 ZooKeeper-*.*.* 目錄(我們以當前 ZooKeeper 的最新版 3.4.9 為例,故此下面的“ ZooKeeper-*.*.* ”都將寫為“ ZooKeeper-3.4.9” )的 conf 資料夾下建立一個 zoo.cfg 檔案,它包含如下的內容:
tickTime=2000
dataDir=/var/zookeeper
clientPort=2181
在這個檔案中,我們需要指定 dataDir 的值,它指向了一個目錄,這個目錄在開始的時候需要為空。下面是每個引數的含義:
tickTime :基本事件單元,以毫秒為單位。它用來指示心跳,最小的 session 過期時間為兩倍的 tickTime. 。
dataDir :儲存記憶體中資料庫快照的位置,如果不設定引數,更新事務日誌將被儲存到預設位置。
clientPort :監聽客戶端連線的埠
使用單機模式時使用者需要注意:這種配置方式下沒有 ZooKeeper 副本,所以如果 ZooKeeper 伺服器出現故障, ZooKeeper 服務將會停止。
以下程式碼清單 A 是我們的根據自身情況所設定的 zookeeper 配置文件: zoo.cfg
程式碼清單 A : zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# the directory where the snapshot is stored.
dataDir=/usr/local/zookeeper-3.4.9/snapshot/data
# the port at which the clients will connect
clientPort=2181

2)叢集模式

為了獲得可靠的 ZooKeeper 服務,使用者應該在一個叢集上部署 ZooKeeper 。只要叢集上大多數的 ZooKeeper 服務啟動了,那麼總的 ZooKeeper 服務將是可用的。另外,最好使用奇數臺機器。 如果 zookeeper 擁有 5 臺機器,那麼它就能處理 2 臺機器的故障了。
之後的操作和單機模式的安裝類似,我們同樣需要對 JAVA 環境進行設定,下載最新的 ZooKeeper 穩定版本並配置相應的環境變數。不同之處在於每臺機器上 conf/zoo.cfg 配置檔案的引數設定,參考下面的配置:
tickTime=2000
dataDir=/var/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
“server.id=host:port:port. ”指示了不同的 ZooKeeper 伺服器的自身標識,作為叢集的一部分的機器應該知道 ensemble 中的其它機器。使用者可以從“ server.id=host:port:port. ”中讀取相關的資訊。 在伺服器的 data ( dataDir 引數所指定的目錄)目錄下建立一個檔名為 myid 的檔案,這個檔案中僅含有一行的內容,指定的是自身的 id 值。比如,伺服器“ 1 ”應該在 myid 檔案中寫入“ 1 ”。這個 id 值必須是 ensemble 中唯一的,且大小在 1 到 255 之間。這一行配置中,第一個埠( port )是從( follower )機器連線到主( leader )機器的埠,第二個埠是用來進行 leader 選舉的埠。在這個例子中,每臺機器使用三個埠,分別是: clientPort , 2181 ; port , 2888 ; port , 3888 。
我們在擁有三臺機器的 Hadoop 叢集上測試使用 ZooKeeper 服務,下面程式碼清單 B 是我們根據自身情況所設定的 ZooKeeper 配置文件:
程式碼清單 B : zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/usr/local/zookeeper-3.4.9/snapshot/d1
# the port at which the clients will connect
clientPort=2181
server.1=IP1:2887:3887
server.2=IP2:2888:3888
server.3=IP3:2889:3889
清單中的 IP 分別對應的配置分散式 ZooKeeper 的 IP 地址。當然,也可以通過機器名訪問 zookeeper ,但是需要在 ubuntu 的 hosts 環境中進行設定。讀者可以查閱 Ubuntu 以及 Linux 的相關資料進行設定。

3)叢集偽分佈

簡單來說,叢集偽分佈模式就是在單機下模擬叢集的ZooKeeper服務。
那麼,如何對配置 ZooKeeper 的叢集偽分佈模式呢?其實很簡單,在 zookeeper 配置文件中, clientPort 引數用來設定客戶端連線 zookeeper 的埠。 server.1=IP1:2887:3887 中, IP1 指示的是組成 ZooKeeper 服務的機器 IP 地址, 2887 為用來進行 leader 選舉的埠, 3887 為組成 ZooKeeper 服務的機器之間通訊的埠。叢集偽分佈模式我們使用每個配置文件模擬一臺機器,也就是說,需要在單臺機器上執行多個 zookeeper 例項。但是,我們必須要保證各個配置文件的 clientPort 不能衝突。
下面是我們所配置的叢集偽分佈模式,通過 zoo1.cfg , zoo2.cfg , zoo3.cfg 模擬了三臺機器的 ZooKeeper 叢集。詳見程式碼清單 C :
程式碼清單C : zoo1.cfg :
# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

dataDir=/usr/local/zookeeper-3.4.9/d_1

# the port at which the clients will connect

clientPort=2181

server.1=localhost:2887:3887

server.2=localhost:2888:3888

server.3=localhost:2889:3889
zoo2.cfg :
# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

dataDir=/usr/local/zookeeper-3.4.9/d_2

# the port at which the clients will connect

clientPort=2182

#the location of the log file

dataLogDir=/usr/local/zookeeper-3.4.9/logs

server.1=localhost:2887:3887

server.2=localhost:2888:3888

server.3=localhost:2889:3889
zoo3.cfg :
# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

dataDir=/usr/local/zookeeper-3.4.9/d_2

# the port at which the clients will connect

clientPort=2183

#the location of the log file

dataLogDir=/usr/local/zookeeper-3.4.9/logs

server.1=localhost:2887:3887

server.2=localhost:2888:3888

server.3=localhost:2889:3889
從上述三個程式碼清單中可以看到,除了 clientPort 不同之外, dataDir 也不同。另外,不要忘記在 dataDir 所對應的目錄中建立 myid 檔案來指定對應的 zookeeper 伺服器例項。