ZooKeeper集羣由一組Server節點組成,這一組Server節點中存在一個角色爲Leader的節點,其餘節點都爲Follower。當客戶端Client鏈接到ZooKeeper集羣,而且執行寫請求時,這些請求會被髮送到Leader節點上,而後Leader節點上數據變動會同步到集羣中其餘的Follower節點。html
ZooKeeper採用一種稱爲Leader election的選舉算法(也有稱作:分佈式選舉算法-Paxos)的。在整個集羣運行過程當中,只有一個Leader,其餘的都是Follower,若是ZooKeeper集羣在運行過程當中Leader出了問題,系統會採用該算法從新選出一個Leader,java
ZooKeeper用於三臺以上的服務器集羣之中,只要還有超過半數的服務器在線,ZooKeeper就可以正常提供服務,過半,意味着實際可以有效參與選舉的節點數量是奇書個數,否者不能有效的過半linux
Zookeeper邏輯圖以下,算法
我這裏使用的是在VMWare中安裝centos7每一個虛擬機都選擇橋接模式。便可在網絡中獨立分配一個IP,每臺機器單獨設定一個IP。apache
192.168.137.122 master 192.168.137.123 slave1 192.168.137.124 slave2
systemctl status firewalld.service #檢查防火牆狀態 systemctl stop firewalld.service #關閉防火牆 systemctl disable firewalld.service #禁止開機啓動防火牆
#SELINUX=enforcing #註釋掉 #SELINUXTYPE=targeted #註釋掉 SELINUX=disabled #增長
setenforce 0 #使配置當即生效
略centos
在此處爲了方便,我將全部網內的節點機器都互相能SSH無密鑰登陸,能夠理解爲雙向無密鑰登陸。服務器
ssh-keygen -t rsa #生成密鑰,一路回車便可,只適用於測試環境,正式環境請設定密碼
scp ~/.ssh/id_rsa.pub master:~/.ssh/slave1.id_rsa.pub #在slave1中,將公鑰文件傳輸至master機器上,並修改文件名爲slave1.id_rsa.pub scp ~/.ssh/id_rsa.pub master:~/.ssh/slave2.id_rsa.pub #在slave2中,將公鑰文件傳輸至master機器上,並修改文件名爲slave2.id_rsa.pub
cd ~/.ssh cat id_rsa.pub >> authorized_keys #這個是master生成的公鑰,就在本機 cat slave1.id_rsa.pub >> authorized_keys cat slave2.id_rsa.pub >> authorized_keys
完成後可使用rm -f slave1.id_rsa.pub刪除拷貝過來的祕鑰文件網絡
scp authorized_keys root@master1:~/.ssh scp authorized_keys root@master2:~/.ssh
authorized_keys是公鑰的字典文件,這樣下來全部的,全部節點的authorized_keys文件中記錄的祕鑰都相同了,由於能夠實現每一個機器的ssh互通了。架構
zookeeper安裝很是簡單,只要獲取到 Zookeeper 的壓縮包並解壓到某個目錄,修改一下配置便可。app
tar -zxvf zookeeper-3.4.8.tar.gz
mv zookeeper-3.4.8 /home/zookeeper #這裏能夠指定你喜歡的任意目錄
# set zookeeperpath export ZOOKEEPER_HOME=/home/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin
cp /home/zookeeper/conf/zoo_sample.cfg /home/zookeeper/conf/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. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/home/zookeeper/zkdata dataLogDir=/home/zookeeper/zklog # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 server.1=master:2888:3888 server.2=slaver1:2888:3888 server.3=slaver2:2888:3888
tickTime: zookeeper中使用的基本時間單位, 毫秒值.
dataDir: 數據目錄. 能夠是任意目錄.
dataLogDir: log目錄, 一樣能夠是任意目錄. 若是沒有設置該參數, 將使用和dataDir相同的設置.
clientPort: 監聽client鏈接的端口號.
nitLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這裏所說的客戶端不是用戶鏈接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集羣中鏈接到 Leader 的 Follower 服務器)初始化鏈接時最長能忍受多少個心跳時間間隔數。當已經超過 5個心跳的時間(也就是 tickTime)長度後 Zookeeper 服務器尚未收到客戶端的返回信息,那麼代表這個客戶端鏈接失敗。總的時間長度就是 5*2000=10 秒
syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 2*2000=4 秒
server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;D 表示的是萬一集羣中的 Leader 服務器掛了,須要一個端口來從新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通訊的端口。若是是僞集羣的配置方式,因爲 B 都是同樣,因此不一樣的 Zookeeper 實例通訊端口號不能同樣,因此要給它們分配不一樣的端口號。
scp /home/zookeeper root@master1: /home/ scp /home/zookeeper root@master2: /home/
完成後,只需在其餘節點上修改vi /etc/profile,以及對應的myid,便可
4,啓動Zookeeper集羣
cd /home/zookeeper bin/zkServer.sh start
正常會顯示以下狀態
bin/zkServer.sh -status
如顯示一下狀態表示啓動失敗