ZooKeeper環境搭建(單機/集群)(轉)


前提:

配置文件主要是在$ZOOKEEPER_HOME/conf/zoo.cfg,剛解壓時為zoo_sample.cfg,重命名zoo.cfg即可。

配置文件常用項參考:http://www.cnblogs.com/EasonJim/p/7483880.html

ZooKeeper基於Java開發,所以在運行前需要安裝JDK。

環境搭建:

一、ZooKeeper的搭建方式

ZooKeeper安裝方式有三種,單機模式集群模式以及偽集群模式

  • 單機模式:ZooKeeper只運行在一台服務器上,適合測試環境;
  • 偽集群模式:就是在一台物理機上運行多個ZooKeeper 實例;
  • 集群模式:ZooKeeper運行於一個集群上,適合生產環境,這個計算機集群被稱為一個“集合體”(ensemble)

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

1.1、ZooKeeper的單機模式搭建

下載ZooKeeper:http://www.cnblogs.com/EasonJim/p/7481710.html

解壓

tar -zxvf ZooKeeper-3.4.9.tar.gz 

移動到文件夾:

sudo mv ZooKeeper-3.4.9 /usr/local/zk 

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

只關注以下幾項

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

注意:以上路徑的文件夾需要手動創建,且要賦予權限,並且不能放在/tmp文件夾。

創建文件夾:

#創建
sudo mkdir -p /usr/local/zk/data sudo mkdir -p /usr/local/zk/logs
#設置權限
sudo chmod -R 777 /usr/local/data
sudo chmod -R 777 /usr/local/logs 

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

export ZOOKEEPER_HOME=/usr/local/zk
export PATH=.:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH

啟動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服務器實例。

  • clientPort端口:如果在1台機器上部署多個Server,那么每台機器都要不同的clientPort,比如Server1是2181,Server2是2182,Server3是2183
  • dataDir和dataLogDir:dataDir和dataLogDir也需要區分下,將數據文件和日志文件分開存放,同時每個Server的這兩變量所對應的路徑都是不同的
  • 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.2.1.1、此時需要在/usr/local/zk/conf文件夾下創建三個文件zoo1.cfg、zoo2.cfg、zoo3.cfg

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

代碼清單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.1.2、在/usr/local/zk創建三個data_{1/2/3}、logs_{1/2/3}

#創建
sudo mkdir -p
/usr/local/zk/data_1 sudo mkdir -p /usr/local/zk/data_2 sudo mkdir -p /usr/local/zk/data_3 sudo mkdir -p /usr/local/zk/logs_1 sudo mkdir -p /usr/local/zk/logs_2 sudo mkdir -p /usr/local/zk/logs_3
#設置權限
sudo chmod -R 777 /usr/local/data_1
sudo chmod -R 777 /usr/local/data_2
sudo chmod -R 777 /usr/local/data_3
sudo chmod -R 777 /usr/local/logs_1
sudo chmod -R 777 /usr/local/logs_2
sudo chmod -R 777 /usr/local/logs_3

1.2.1.3、分別在data_{1/2/3}文件夾下創建myid文件,並寫入0/1/2

echo "0">/usr/local/data_1/myid
echo "1">/usr/local/data_2/myid
echo "2">/usr/local/data_3/myid

1.2.2、啟動

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

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

啟動過程,如下圖所示:

啟動結果,如下圖所示:

在運行完第一條指令之后,會出現一些錯誤異常,產生異常信息的原因是由於ZooKeeper服務的每個實例都擁有全局配置信息,他們在啟動的時候會隨時隨地的進行Leader選舉操作。此時,第一個啟動的ZooKeeper需要和另外兩個ZooKeeper實例進行通信。但是,另外兩個ZooKeeper實例還沒有啟動起來,因此就產生了這的異樣信息。我們直接將其忽略即可,待把圖中“2號”和“3號”ZooKeeper實例啟動起來之后,相應的異常信息自然會消失。此時,可以通過下面三條命令,來查詢。

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

ZooKeeper服務的運行狀態,如下圖所示:

提示:如果以上配置復雜,那么可以直接拷貝三個ZooKeeper的運行目錄分別命令為ZooKeeper_1/ZooKeeper_2/ZooKeeper_3

1.3、ZooKeeper的集群模式搭建

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

1.3.1、創建myid

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

Server0機器的內容為:0

Server1機器的內容為:1

Server2機器的內容為:2

echo "0">/usr/local/data/myid
echo "1">/usr/local/data/myid
echo "2">/usr/local/data/myid

1.3.2、編寫配置文件

在conf目錄下刪除zoo_sample.cfg文件,創建一個配置文件zoo.cfg,如下所示,代碼清單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

說明:hadoop為host指向的名稱,當然也可以直接使用IP。

1.3.3、啟動

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

二、ZooKeeper的配置

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

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

2.1 基本配置

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

①、client:監聽客戶端連接的端口。

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

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

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

2.2、高級配置

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

①、dataLogdDir

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

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

②、maxClientCnxns

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

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

# set maxClientCnxns
maxClientCnxns=1

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

③、minSessionTimeoutmaxSessionTimeout

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

2.3 集群配置

①、initLimit

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

②、syncLimit

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

③、server.A=B:C:D

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

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

C:Leader選舉的端口;

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

④、myidzoo.cfg

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

三、搭建ZooKeeper服務器集群(搭建實例)

說明:以下命令要注意權限,非root用戶下要加sudo

搭建要求:

1、ZK服務器集群規模不小於3個節點,推薦2*N+1。

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

3.1、安裝配置ZK

①、使用WinScp將Zk傳輸到Hadoop主機上的/usr/local,我用的版本是ZooKeeper-3.4.5.tar.gz。

②、在hadoop的/usr/local目錄下,解壓縮zk....tar.gz,設置環境變量

解壓縮:在/usr/local目錄下,執行命令:tar -zxvf ZooKeeper-3.4.5.tar.gz,如下圖所示:

重命名:解壓后將文件夾,重命名為zk,執行命令: mv ZooKeeper-3.4.5 zk,如下圖所示:

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

2.2、修改ZK配置文件

①、重命名:將/usr/local/zk/conf目錄下zoo_sample.cfg,重命名為zoo.cfg,執行命令:mv zoo_sample.cfg zoo.cfg。如如下圖所示:

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

③、創建文件夾:mkdir /usr/local/zk/data

④、創建myid:在data目錄下,創建文件myid,值為0;vi myid ;內容為0。

⑤、編輯:編輯該文件,執行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是否已經在服務。

2.3、配置其他節點

①、把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

②、把hadoop1中相應的myid的值改為1,把hadoop2中相應的myid的值改為2。   

四、啟動檢驗

1、啟動,在三個節點上分別執行命令zkServer.sh start

hadoop節點

hadoop0節點

hadoop1節點

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

hadoop節點

hadoop0節點

hadoop1節點

 

參考:

http://www.cnblogs.com/sunddenly/p/4018459.html(以上內容大部分轉自此篇文章)

http://www.cnblogs.com/qizhelongdeyang/p/6901560.html

http://blog.csdn.net/lemon_tree12138/article/details/51445689

http://blog.sina.com.cn/s/blog_790c59140102w5h1.html

http://blog.csdn.net/shirdrn/article/details/7183503/

http://blog.csdn.net/yinkgh/article/details/52301063

http://www.cnblogs.com/linuxprobe/p/5851699.html

http://www.linuxidc.com/Linux/2015-02/114230.htm

http://www.cnblogs.com/huangxincheng/p/5654170.html

http://www.linuxidc.com/Linux/2013-04/83562.htm

http://www.cnblogs.com/z-sm/p/5691752.html

http://nileader.blog.51cto.com/1381108/795230

http://data.qq.com/article?id=2863

http://blog.csdn.net/tanyujing/article/details/8504481

http://blog.csdn.net/poechant/article/details/6633923


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM