配置參數說明
Zookeeper中的配置文件zoo.cfg中參數含義解讀如下:
1.tickTime =2000:通信心跳數,Zookeeper服務器與客戶端心跳時間,單位毫秒Zookeeper使用的基本時間,服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個tickTime時間就會發送一個心跳,時間單位爲毫秒。它用於心跳機制,並且設置最小的session超時時間爲兩倍心跳時間。(session的最小超時時間是2*tickTime)
2.initLimit =10:LF初始通信時限集羣中的Follower跟隨者服務器與Leader領導者服務器之間初始連接時能容忍的最多心跳數(tickTime的數量),用它來限定集羣中的Zookeeper服務器連接到Leader的時限。
3.syncLimit =5:LF同步通信時限集羣中Leader與Follower之間的最大響應時間單位,假如響應超過syncLimit * tickTime,Leader認爲Follwer死掉,從服務器列表中刪除Follwer。
4.dataDir:數據文件目錄+數據持久化路徑主要用於保存Zookeeper中的數據。
5.clientPort =2181:客戶端連接端口監聽客戶端連接的端口。
選舉機制
- 半數機制:集羣中半數以上機器存活,集羣可用。所以Zookeeper適合安裝奇數臺服務器。
- Zookeeper雖然在配置文件中並沒有指定Master和Slave。但是,Zookeeper工作時,是有一個節點爲Leader,其他則爲Follower,Leader是通過內部的選舉機制臨時產生的。
- 以一個簡單的例子來說明整個選舉的過程。
假設有五臺服務器組成的Zookeeper集羣,它們的id從1-5,同時它們都是最新啓動的,也就是沒有歷史數據,在存放數據量這一點上,都是一樣的。假設這些服務器依序啓動,來看看會發生什麼,如圖
(1)服務器1啓動,此時只有它一臺服務器啓動了,它發出去的報文沒有任何響應,所以它的選舉狀態一直是LOOKING狀態。
(2)服務器2啓動,它與最開始啓動的服務器1進行通信,互相交換自己的選舉結果,由於兩者都沒有歷史數據,所以id值較大的服務器2勝出,但是由於沒有達到超過半數以上的服務器都同意選舉它(這個例子中的半數以上是3),所以服務器1、2還是繼續保持LOOKING狀態。
(3)服務器3啓動,根據前面的理論分析,服務器3成爲服務器1、2、3中的老大,而與上面不同的是,此時有三臺服務器選舉了它,所以它成爲了這次選舉的Leader。
(4)服務器4啓動,根據前面的分析,理論上服務器4應該是服務器1、2、3、4中最大的,但是由於前面已經有半數以上的服務器選舉了服務器3,所以它只能接收當小弟的命了。
(5)服務器5啓動,同4一樣當小弟。
集羣搭建
集羣的規劃
新建一個集羣的文件夾
準備三個zookeeper
zk1
創建data目錄和日誌目錄log
給數據目錄裏面新建一個myid文件
給myid裏面加入一個值爲 1 (同理zk2爲2 zk3爲3)
修改zk1/conf/zoo.cfg
#隔間時間的單位,以後它是配置時間的一個單位
tickTime=2000
# 10 * 2000 = 時間 初始化超時時間,和集羣裏面的機器交流,最大的間隔時間,若超過該時間,則認爲超時
initLimit=10
# 同步數據的超時時間,小弟從大佬裏面複製數據,超時的時間爲 5 * 2000
syncLimit=5
# zookeeper 的數據目錄,三個zk 的數據目錄需要不同才行
dataDir=/usr/local/zk-cluster/zk1/data
# zookeeper的日誌目錄
dataLogDir=/usr/local/zk-cluster/zk1/log
# zookeeper 的client的端口號
clientPort=2181
# 集羣的配置文件
#第幾個服務器(1,2,3來自數據目錄的一個myid文件,該文件裏面保存着當前集羣的標識(1,2,3))
# 後面的ip代表將綁定那個ip地址 第一個端口:代表在集羣內部,數據複製的接口 第二個端口代表:選舉端口
server.1=192.168.110.121:2888:3888
server.2=192.168.110.121:2889:3889 (服務器的話就改爲內網IP)
server.3=192.168.110.121:2887:3887
注意上面配置文件的最後,如果是雲服務器就寫成內網IP !!!
zk2 zk3
創建data目錄和日誌目錄log
給數據目錄裏面新建一個myid文件並給值爲2
給數據目錄裏面新建一個myid文件並給值爲3
修改zk2 、zk3 的配置文件,和zk1一樣,注意data和log目錄有輕微變動;端口zk2:2182,
zk3:2183; 然後就可以進行測試了!(服務器的話要注意把配置最後的IP改爲內網IP)