ZooKeeper系列(二) Zookeeper的環境配置

一、Zookeeper的搭建方式

Zookeeper安裝方式有三種,單機模式和集羣模式以及僞集羣模式。

1.單機模式:Zookeeper只運行在一臺服務器上,適合測試環境;

2.僞集羣模式:就是在一臺物理機上運行多個Zookeeper 實例。

3.集羣模式:Zookeeper運行於一個集羣上,適合生產環境,這個計算機集羣被稱爲一個“集合體”(ensemble)。

Zookeeper通過複製來實現高可用性,只要集合體中半數以上的機器處於可用狀態,它就能夠保證服務繼續。爲什麼一定要超過半數呢?這跟Zookeeper的複製策略有關:zookeeper確保對znode 樹的每一個修改都會被複制到集合體中超過半數的機器上。

1.1 Zookeeper的單機模式搭建

(1)下載ZooKeeper:http://pan.baidu.com/s/1pJlwbR9

(2)解壓:tar -zxvf zookeeper-3.4.5.tar.gz 重命名:mv zookeeper-3.4.5 zk

(3)配置文件:在conf目錄下刪除zoo_sample.cfg文件,創建一個配置文件zoo.cfg

tickTime=2000
dataDir=/usr/local/zk/data
dataLogDir=/usr/local/zk/dataLog        
clientPort=2181

(4)配置環境變量:爲了今後操作方便,我們需要對Zookeeper的環境變量進行配置,方法如下在/etc/profile文件中加入如下內容:

export ZOOKEEPER_HOME=/usr/local/zk
export PATH=.:HADOOP H OME/bin: ZOOKEEPER_HOME/bin:JAVA H OME/bin: PATH

(5)啓動ZooKeeper的Server:zkServer.sh start;關閉ZooKeeper的Server:zkServer.sh stop

1.2 Zookeeper的僞集羣模式搭建

Zookeeper不但可以在單機上運行單機模式Zookeeper,而且可以在單機模擬集羣模式 Zookeeper的運行,也就是將不同節點運行在同一臺機器。我們知道僞分佈模式下Hadoop的操作和分佈式模式下有着很大的不同,但是在集羣爲分佈 式模式下對Zookeeper的操作卻和集羣模式下沒有本質的區別。顯然,集羣僞分佈式模式爲我們體驗Zookeeper和做一些嘗試性的實驗提供了很大 的便利。比如,我們在實驗的時候,可以先使用少量數據在集羣僞分佈模式下進行測試。當測試可行的時候,再將數據移植到集羣模式進行真實的數據實驗。這樣不 但保證了它的可行性,同時大大提高了實驗的效率。這種搭建方式,比較簡便,成本比較低,適合測試和學習,如果你的手頭機器不足,就可以在一臺機器上部署了 3個server。

1.2.1. 注意事項

在一臺機器上部署了3個server,需要注意的是在集羣爲分佈式模式下我們使用的每個配置文檔模擬一臺機器,也就是說單臺機器及上運行多個Zookeeper實例。但是,必須保證每個配置文檔的各個端口號不能衝突,除了clientPort不同之外,dataDir也不同。另外,還要在dataDir所對應的目錄中創建myid文件來指定對應的Zookeeper服務器實例。

(1)clientPort端口:如果在1臺機器上部署多個server,那麼每臺機器都要不同的 clientPort,比如 server1是2181,server2是2182,server3是2183,

(2)dataDir和dataLogDir:dataDir和dataLogDir也需要區分下,將數據文件和日誌文件分開存放,同時每個server的這兩變量所對應的路徑都是不同的。

(3)server.X和myid: server.X 這個數字就是對應,data/myid中的數字。在3個server的myid文件中分別寫入了0,1,2,那麼每個server中的zoo.cfg都配 server.0 server.2,server.3就行了。因爲在同一臺機器上,後面連着的2個端口,3個server都不要一樣,否則端口衝突。

下面是我所配置的集羣僞分佈模式,分別通過zoo1.cfg、zoo2.cfg、zoo3.cfg來模擬由三臺機器的Zookeeper集羣。詳見下圖1.1-1.3

代碼清單 1.1 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/zk/data_1

# the port at which the clients will connect
clientPort=2181

#the location of the log file
dataLogDir=/usr/local/zk/logs_1

server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389

代碼清單 1.2 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/zk/data_2

# the port at which the clients will connect
clientPort=2182

#the location of the log file
dataLogDir=/usr/local/zk/logs_2

server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389

代碼清單 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/zk/data_3

# the port at which the clients will connect
clientPort=2183

#the location of the log file
dataLogDir=/usr/local/zk/logs_3

server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389

1.2.2 啓動

在集羣爲分佈式下,我們只有一臺機器,按時要運行三個Zookeeper實例。此時,如果在使用單機模式的啓動命令是行不通的。此時,只要通過下面三條命令就能運行前面所配置的Zookeeper服務。如下所示:

zkServer.sh start zoo1.sh
zkServer.sh start zoo2.sh
zkServer.sh start zoo3.sh

啓動過程,如下圖1.4-1.5所示:

這裏寫圖片描述

圖 1.4

這裏寫圖片描述

圖 1.5

在運行完第一條指令之後,會出現一些錯誤異常,產生異常信息的原因是由於Zookeeper服務的每個實例都擁有全局配置信息,他們在啓動的時候會隨時隨地的進行Leader選舉操作。此時,第一個啓動的Zookeeper需要和另外兩個Zookeeper實例進行通信。但是,另外兩個Zookeeper實例還沒有啓動起來,因此就產生了這樣的異樣信息。

我們直接將其忽略即可,待把圖中“2號”和“3號”Zookeeper實例啓動起來之後,相應的異常信息自然會消失。此時,可以通過下面三條命令,來查詢。

zkServer.sh status zoo1.cfg
zkServer.sh status zoo2.cfg
zkServer.sh status zoo3.cfg

Zookeeper服務的運行狀態,如圖1.6。

這裏寫圖片描述

圖 1.6

1.3 Zookeeper的集羣模式搭建

爲了獲得可靠地Zookeeper服務,用戶應該在一個機羣上部署Zookeeper。只要機羣上大多數的Zookeeper服務啓動了,那麼總的Zookeeper服務將是可用的。集羣的配置方式,和前兩種類似,同樣需要進行環境變量的配置。在每臺機器上conf/zoo.cf配置文件的參數設置相同

1.3.1 創建myid

在dataDir(/usr/local/zk/data)目錄創建myid文件

Server0機器的內容爲:0

Server1機器的內容爲:1

Server2機器的內容爲:2

1.3.2 編寫配置文件

在conf目錄下刪除zoo_sample.cfg文件,創建一個配置文件zoo.cfg,如圖2.4所示。

代碼清單 2.4 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/zk/data

# the port at which the clients will connect
clientPort=2183

#the location of the log file
dataLogDir=/usr/local/zk/log

server.0=hadoop:2288:3388
server.1=hadoop0:2288:3388
server.2=hadoop1:2288:3388

1.3.3 啓動

分別在3臺機器上啓動ZooKeeper的Server:zkServer.sh start;

二、Zookeeper的配置

Zookeeper的功能特性是通過Zookeeper配置文件來進行控制管理的(zoo.cfg).這樣的設計其實有其自身的原因,通過前面對Zookeeper的配置可以看出,在對Zookeeper集羣進行配置的時候,它的配置文檔是完全相同的。集羣僞分佈模式中,有少部分是不同的。這樣的配置方式使得在部署Zookeeper服務的時候非常方便。如果服務器使用不同的配置文件,必須確保不同配置文件中的服務器列表相匹配。

在設置Zookeeper配置文檔時候,某些參數是可選的,某些是必須的。這些必須參數就構成了Zookeeper配置文檔的最低配置要求。另外,若要對Zookeeper進行更詳細的配置,可以參考下面的內容。

2.1 基本配置

下面是在最低配置要求中必須配置的參數:

1.client:監聽客戶端連接的端口。

2.tickTime:基本事件單元,這個時間是作爲Zookeeper服務器之間或客戶端與服務器之間維持心跳的時間間隔,每隔tickTime時間就會發送一個心跳;最小的session過期時間爲2倍tickTime   

3.dataDir:存儲內存中數據庫快照的位置,如果不設置參數,更新食物的日誌將被存儲到默認位置。

應該謹慎的選擇日誌存放的位置,使用專用的日誌存儲設備能夠大大提高系統的性能,如果將日誌存儲在比較繁忙的存儲設備上,那麼將會很大程度上影像系統性能。

2.2 高級配置

下面是高級配置參數中可選配置參數,用戶可以使用下面的參數來更好的規定Zookeeper的行爲:

(1)dataLogdDir

這個操作讓管理機器把事務日誌寫入“dataLogDir”所指定的目錄中,而不是“dataDir”所指定的目錄。這將允許使用一個專用的日誌設備,幫助我們避免日誌和快照的競爭。配置如下:

# the directory where the snapshot is stored
dataDir=/usr/local/zk/data

  
(2)maxClientCnxns

這個操作將限制連接到Zookeeper的客戶端數量,並限制併發連接的數量,通過IP來區分不同的客戶端。此配置選項可以阻止某些類別的Dos攻擊。將他設置爲零或忽略不進行設置將會取消對併發連接的限制。

例如,此時我們將maxClientCnxns的值設爲1,如下所示:

# set maxClientCnxns
maxClientCnxns=1

啓動Zookeeper之後,首先用一個客戶端連接到Zookeeper服務器上。之後如果有第二個客戶端嘗試對Zookeeper進行連接,或者有某些隱式的對客戶端的連接操作,將會觸發Zookeeper的上述配置。

(3)minSessionTimeout和maxSessionTimeout

即最小的會話超時和最大的會話超時時間。在默認情況下,minSession=2*tickTime;maxSession=20*tickTime。

2.3 集羣配置

(1)initLimit

此配置表示,允許follower(相對於Leaderer言的“客戶端”)連接並同步到Leader的初始化連接時間,以tickTime爲單位。當初始化連接時間超過該值,則表示連接失敗。

(2)syncLimit

此配置項表示Leader與Follower之間發送消息時,請求和應答時間長度。如果follower在設置時間內不能與leader通信,那麼此follower將會被丟棄。

(3)server.A=B:C:D

A:其中 A 是一個數字,表示這個是服務器的編號;

B:是這個服務器的 ip 地址;

C:Leader選舉的端口;

D:Zookeeper服務器之間的通信端口。

(3)myid和zoo.cfg

除了修改 zoo.cfg 配置文件,集羣模式下還要配置一個文件 myid,這個文件在 dataDir 目錄下,這個文件裏面就有一個數據就是 A 的值,Zookeeper 啓動時會讀取這個文件,拿到裏面的數據與 zoo.cfg 裏面的配置信息比較從而判斷到底是那個 server。

三、搭建ZooKeeper服務器集羣

搭建要求:

1> zk服務器集羣規模不小於3個節點

2> 要求各服務器之間系統時間要保持一致。

3.1 安裝配置ZK

(1)使用WinScp將Zk傳輸到Hadoop主機上的/usr/local,我用的版本是zookeeper-3.4.5.tar.gz。

(2)在hadoop的/usr/local目錄下,解壓縮zk….tar.gz,設置環境變量

a解壓縮:在/usr/local目錄下,執行命令:tar -zxvf zookeeper-3.4.5.tar.gz,如圖2.1。

這裏寫圖片描述

圖 2.1

b重命名:解壓後將文件夾,重命名爲zk,執行命令: mv zookeeper-3.4.5 zk如圖2.2。

這裏寫圖片描述

圖 2.2

c)設置環境變量:執行命令: vi /etc/profile ,添加 :export ZOOKEEPER_HOME=/usr/local/zk,如圖2.3所示的內容。執行命令:source /etc/profile 如圖2.4所示。

這裏寫圖片描述

圖 2.3

這裏寫圖片描述

圖2.4

3.2 修改ZK配置文件

(1)重命名:將/usr/local/zk/conf目錄下zoo_sample.cfg,重命名爲zoo.cfg,執行命令:mv zoo_sample.cfg zoo.cfg。如圖2.5所示。

這裏寫圖片描述

圖 2.5

(2)查看:在/usr/local/zk/conf目錄下,修改文件 vi zoo.cfg,文件內容如下圖2.6所示。在該文件中dataDir表示文件存放目錄,它的默認設置爲/tmp/zookeeper這是一個臨時存放目錄,每次重啓後會丟失,在這我們自己設一個目錄,/usr/local/zk/data。

這裏寫圖片描述

圖 2.6

(2)創建文件夾:mkdir /usr/local/zk/data

(3)創建myid:在data目錄下,創建文件myid,值爲0;vi myid ;內容爲0。

(4)編輯:編輯該文件,執行vi zoo.cfg ,修改dataDir=/usr/local/zk/data。

新增:server.0=hadoop:2888:3888

server.1=hadoop0:2888:3888

server.2=hadoop1:2888:3888

tickTime :這個時間是作爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳;

dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日誌文件也保存在這個目錄裏;

clientPort:這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。

當這些配置項配置好後,就可以啓動 Zookeeper 了,啓動後使用命令echo ruok | nc localhost 2181檢查 Zookeeper 是否已經在服務。

3.3 配置其他節點

(1)把haooop主機的zk目錄和/etc/profile目錄,複製到hadoop0和hadoop1中。執行命令:

scp -r /usr/local/zk/ hadoop0:/usr/local/
scp -r /usr/local/zk/ hadoop1:/usr/local/
scp /etc/profile hadoop0:/etc/
scp /etc/profile hadoop1:/etc/

ssh hadoop0
suorce /etc/profile
vi /usr/local/zk/data/myid
exit

ssh hadoop1
suorce /etc/profile
vi /usr/local/zk/data/myid
exit

(2)把hadoop1中相應的myid的值改爲1,把hadoop2中相應的myid的值改爲2。   

四、啓動檢驗

(1)啓動,在三個節點上分別執行命令zkServer.sh start

hadoop節點:如圖3.1所示。

這裏寫圖片描述

圖 3.1

hadoop0節點:如圖3.2所示。

這裏寫圖片描述

圖 3.2

hadoop1節點:如圖3.3所示。

這裏寫圖片描述

圖 3.3

(2)檢驗,在三個節點上分別執行命令zkServer.sh status,從下面的圖中我們會發現hadoop和hadoop1爲Follower,hadoop0爲Leader。

hadoop節點:如圖3.4

這裏寫圖片描述

圖 3.4

hadoop0節點:如圖3.5

這裏寫圖片描述

圖 3.5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章