Zookeeper安裝方式有三種,單機模式和集羣模式以及僞集羣模式。node
■ 單機模式:Zookeeper只運行在一臺服務器上,適合測試環境;
■ 僞集羣模式:就是在一臺物理機上運行多個Zookeeper 實例;
■ 集羣模式:Zookeeper運行於一個集羣上,適合生產環境,這個計算機集羣被稱爲一個「集合體」(ensemble)mysql
Zookeeper經過複製來實現高可用性,只要集合體中半數以上的機器處於可用狀態,它就可以保證服務繼續。爲何必定要超過半數呢?這跟Zookeeper的複製策略有關:zookeeper確保對znode 樹的每個修改都會被複制到集合體中超過半數的機器上。sql
建立zookeeper用戶和用戶組,並建立zookeeper的數據和日誌存儲目錄。數據庫
# 建立zookeeper用戶組 [root@localhost~]# groupadd zookeeper # 建立一個用戶名爲zookeeper的用戶,並加入zookeeper用戶組 [root@localhost~]# useradd -g mysql zookeeper # 設置密碼 [root@localhost~]# passwd zookeeper
[root@localhost~]# mkdir -P /data_disk/zookeeper/data [root@localhost~]# mkdir -P /data_disk/zookeeper/logs
[root@localhost~]# chown -R zookeeper:zookeeper /data_disk/zookeeper
下載ZooKeeper:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gzapache
解壓:tar -zxvf zookeeper-3.4.14.tar.gz 重命名:mv zookeeper-3.4.14 zookeeper3.4vim
# 更改所屬的組和用戶 [root@localhost local]# chown -R zookeeper zookeeper3.4/ [root@localhost local]# chgrp -R zookeeper zookeeper3.4/
配置文件:在conf目錄下備份zoo_sample.cfg文件,建立一個配置文件zoo.cfg。bash
tickTime=2000 dataDir=//data_disk/zookeeper/data dataLogDir=/data_disk/zookeeper/logs clientPort=2181
配置環境變量:爲了從此操做方便,咱們須要對Zookeeper的環境變量進行配置,方法以下在/etc/profile文件中加入以下內容:服務器
export ZOOKEEPER_HOME=/usr/local/zookeeper3.4 export PATH=$ZOOKEEPER_HOME/bin:$PATH
啓動ZooKeeper的Server:zkServer.sh start;關閉ZooKeeper的Server:zkServer.sh stopsession
建立服務啓動文件併發
[Unit] Description=zookeeper After=syslog.target network.target [Service] Type=forking Environment=ZOO_LOG_DIR=/data_disk/zookeeper/logs ExecStart=/usr/local/zookeeper3.4/bin/zkServer.sh start ExecStop=/usr/local/zookeeper3.4/bin/zkServer.sh stop Restart=always User=zookeeper Group=zookeeper [Install] WantedBy=multi-user.target
Zookeeper不但能夠在單機上運行單機模式Zookeeper,並且能夠在單機模擬集羣模式 Zookeeper的運行,也就是將不一樣節點運行在同一臺機器。咱們知道僞分佈模式下Hadoop的操做和分佈式模式下有着很大的不一樣,可是在集羣爲分佈 式模式下對Zookeeper的操做卻和集羣模式下沒有本質的區別。顯然,集羣僞分佈式模式爲咱們體驗Zookeeper和作一些嘗試性的實驗提供了很大 的便利。好比,咱們在實驗的時候,能夠先使用少許數據在集羣僞分佈模式下進行測試。當測試可行的時候,再將數據移植到集羣模式進行真實的數據實驗。這樣不 但保證了它的可行性,同時大大提升了實驗的效率。這種搭建方式,比較簡便,成本比較低,適合測試和學習,若是你的手頭機器不足,就能夠在一臺機器上部署了 3個server。
在一臺機器上部署了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集羣.
zoo1.cfg、 zoo2.cfg、 zoo3.cfg都是同樣的配置便可,只不過dataDir和dataLogDir稍微改動一下,以下:
# 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=/data_disk/zookeeper/data_1 # the port at which the clients will connect clientPort=2181 #the location of the log file dataLogDir=/data_disk/zookeeper/logs_1 server.0=localhost:2287:3387 server.1=localhost:2288:3388 server.2=localhost:2289:3389
在集羣爲分佈式下,咱們只有一臺機器,按時要運行三個Zookeeper實例。此時,若是在使用單機模式的啓動命令是行不通的。此時,只要經過下面三條命令就能運行前面所配置的Zookeeper服務。以下所示:
zkServer.sh start zoo1.cfg zkServer.sh start zoo2.cfg zkServer.sh start zoo3.cfg
爲了得到可靠地Zookeeper服務,用戶應該在一個機羣上部署Zookeeper。只要機羣上大多數的Zookeeper服務啓動了,那麼總的 Zookeeper服務將是可用的。集羣的配置方式,和前兩種相似,一樣須要進行環境變量的配置。在每臺機器上conf/zoo.cf配置文件的參數設置 相同
在dataDir(/data_disk/zookeeper/data)目錄建立myid文件,vim myid ;內容爲0。
Server0機器的內容爲:0
Server1機器的內容爲:1
Server2機器的內容爲: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=/data_disk/zookeeper/data # the port at which the clients will connect clientPort=2183 #the location of the log file dataLogDir=/data_disk/zookeeper/logs server.0=hadoop:2288:3388 server.1=hadoop0:2288:3388 server.2=hadoop1:2288:3388
分別在3臺機器上啓動ZooKeeper的Server:zkServer.sh start;
Zookeeper的功能特性是經過Zookeeper配置文件來進行控制管理的(zoo.cfg).這樣的設計其實有其自身的緣由,經過前面對Zookeeper的配置能夠看出,在對Zookeeper集羣進行配置的時候,它的配置文檔是徹底相同的。集羣僞分佈模式中,有少部分是不一樣的。這樣的配置方式使得在部署Zookeeper服務的時候很是方便。若是服務器使用不一樣的配置文件,必須確保不一樣配置文件中的服務器列表相匹配。
在設置Zookeeper配置文檔時候,某些參數是可選的,某些是必須的。這些必須參數就構成了Zookeeper配置文檔的最低配置要求。另外,若要對Zookeeper進行更詳細的配置,能夠參考下面的內容。
下面是在最低配置要求中必須配置的參數:
(1) client:監聽客戶端鏈接的端口。
(2) tickTime:基本事件單元,這個時間是做爲Zookeeper服務器之間或客戶端與服務器之間維持心跳的時間間隔,每隔tickTime時間就會發送一個心跳;最小 的session過時時間爲2倍tickTime
dataDir:存儲內存中數據庫快照的位置,若是不設置參數,更新食物的日誌將被存儲到默認位置。
應該謹慎的選擇日誌存放的位置,使用專用的日誌存儲設備可以大大提升系統的性能,若是將日誌存儲在比較繁忙的存儲設備上,那麼將會很大程度上影像系統性能。
下面是高級配置參數中可選配置參數,用戶可使用下面的參數來更好的規定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。
(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服務器之間的通訊端口。
(4) myid和zoo.cfg
除了修改 zoo.cfg 配置文件,集羣模式下還要配置一個文件 myid,這個文件在 dataDir 目錄下,這個文件裏面就有一個數據就是 A 的值,Zookeeper 啓動時會讀取這個文件,拿到裏面的數據與 zoo.cfg 裏面的配置信息比較從而判斷究竟是那個 server。