簡介
Zookeeper集群主要解決單節點故障問題以及提高整體并發訪問能力,

Zookeeper集群具有以下特點:
-
Zookeeper集群有一個leader服務器和多個follower服務器,leader是運行時動態選舉出來的,
-
Zookeeper集群中只要由半數以上的節點可用,Zookeeper集群就能正常提供服務,
-
Zookeeper集群中每個服務器保存一份相同的資料副本,客戶端無論連接哪臺服務器,資料都是一致的,
-
更新請求順序進行,來自同一個客戶端的更新請求按其發送的順序依次執行,
-
資料更新原子性,一次資料要么更新成功,要么更新失敗,
-
實時性,在一定時間范圍內,客戶端能讀到最新資料,
集群搭建
搭建Zookeeper集群至少需要三臺服務器,并且服務器應該是奇數臺,
假如集群只有兩臺服務器,那么其中任意一臺服務器發生故障,集群就不可用了(集群中可用節點數量需要大于一半才可用),由于存在兩個單點故障,因此兩個服務器還不如單個服務器穩定,
下面將介紹如何在單臺機器上搭建三個Zookeeper服務組成的集群,
1.創建三個dataDir:
mkdir /opt/zkdata1 /opt/zkdata2 /opt/zkdata3
2.分別在三個dataDir中創建myid檔案,并在myid檔案中指定服務器標識:
[root@localhost opt]# touch ./zkdata1/myid ./zkdata2/myid ./zkdata3/myid
[root@localhost opt]# echo 1 > ./zkdata1/myid
[root@localhost opt]# echo 2 > ./zkdata2/myid
[root@localhost opt]# echo 3 > ./zkdata3/myid
3.創建三個Zookeeper組態檔,并添加集群配置:
zoo1.cfg:
tickTime=2000
initLimit=10
syncLimit=5
# 指定資料存盤位置
dataDir=/opt/zkdata1
# 指定客戶端連接的埠
clientPort=2181
# 指定集群中服務器
# 埠1:用于資料同步
# 埠2:用于leader選舉
server.1=localhost:2880:3881
server.2=localhost:2882:3883
server.3=localhost:2884:3885
zoo2.cfg:
tickTime=2000
initLimit=10
syncLimit=5
# 指定資料存盤位置
dataDir=/opt/zkdata2
# 指定客戶端連接的埠
clientPort=2182
# 指定集群中服務器
# 埠1:用于資料同步
# 埠2:用于leader選舉
server.1=localhost:2880:3881
server.2=localhost:2882:3883
server.3=localhost:2884:3885
zoo3.cfg:
tickTime=2000
initLimit=10
syncLimit=5
# 指定資料存盤位置
dataDir=/opt/zkdata3
# 指定客戶端連接的埠
clientPort=2183
# 指定集群中服務器
# 埠1:用于資料同步
# 埠2:用于leader選舉
server.1=localhost:2880:3881
server.2=localhost:2882:3883
server.3=localhost:2884:3885
4.分別啟動各個服務器:
依次啟動服務器1、2、3,
[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh start ./apache-zookeeper-3.6.3-bin/conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: ./apache-zookeeper-3.6.3-bin/conf/zoo1.cfg
Starting zookeeper ... STARTED
[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh start ./apache-zookeeper-3.6.3-bin/conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: ./apache-zookeeper-3.6.3-bin/conf/zoo2.cfg
Starting zookeeper ... STARTED
[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh start ./apache-zookeeper-3.6.3-bin/conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: ./apache-zookeeper-3.6.3-bin/conf/zoo3.cfg
Starting zookeeper ... STARTED
5.集群搭建完畢,可以使用客戶端連接任意一臺服務器進行操作:
連接服務器3,創建新的節點,連接服務器1,查看新創建的節點,
[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkCli.sh -server localhost:2183
[zk: localhost:2183(CONNECTED) 1] ls /
[zookeeper]
[zk: localhost:2183(CONNECTED) 2] create /mynode1 mydata1
Created /mynode1
[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkCli.sh -server localhost:2181
[zk: localhost:2181(CONNECTED) 1] ls /
[mynode1, zookeeper]
選舉機制
集群中節點狀態分為以下幾種:
-
LOOKING:表示當前集群中沒有leader節點,需要進行選舉,
-
LEADING:表示當前節點為leader,
-
FOLLOWING:表示leader已經被選出,當前節點為follower,
-
OBSERVER:表示當前節點為observer,
查看集群中各個服務器角色資訊:
[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh status ./apache-zookeeper-3.6.3-bin/conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: ./apache-zookeeper-3.6.3-bin/conf/zoo1.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh status ./apache-zookeeper-3.6.3-bin/conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: ./apache-zookeeper-3.6.3-bin/conf/zoo2.cfg
Client port found: 2182. Client address: localhost. Client SSL: false.
Mode: leader
[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh status ./apache-zookeeper-3.6.3-bin/conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: ./apache-zookeeper-3.6.3-bin/conf/zoo3.cfg
Client port found: 2183. Client address: localhost. Client SSL: false.
Mode: follower
可以看出服務器2被選舉為leader,服務器1和服務器3為follower,選舉流程如下:
-
服務器1和服務器2啟動后進入LOOKING狀態,開始進行Leader選舉,
-
每個服務器都會發出一個投票,在初始階段,服務器1和服務器2將投票自己作為Leader服務器,每次投票都會包含推薦服務器的myid和zxid,然后將每個投票發送給集群中的其他服務器,
-
集群中的每個服務器接收到投票后,首先判斷投票的有效性,例如是否為當前輪投票,是否來自處于LOOKING狀態的服務器,
-
每個服務器都會將其他服務器的投票和自己的投票進行對比,首先對比zxid,較大zxid的服務器優先作為leader,如果zxid一樣,則比較myid,myid較大的優先作為leader,
-
由于是集群初始化階段,每個服務器的zxid都為0,所以開始比較myid,服務器2的myid較大,所以服務器2獲勝,服務器1將其投票更新為投給服務器2,并將投票重新發送給服務器2,此時服務器的票數已經超過集群節點半數,服務器2被選為leader,
-
一旦確定了leader,每個服務器將更新自己的狀態,服務器1將狀態改為FOLLOWING,服務器2將狀態改為LEADING,當服務器3啟動時,發現已經有一個Leader,不再進行選舉,直接將狀態從LOOKING改為FOLLOWING,
當作為leader的服務器2被停止后,又會重新進行leader選舉,停止服務器2:
[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh stop ./apache-zookeeper-3.6.3-bin/conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: ./apache-zookeeper-3.6.3-bin/conf/zoo2.cfg
Stopping zookeeper ... STOPPED
再次查看各個服務器角色資訊:
[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh status ./apache-zookeeper-3.6.3-bin/conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: ./apache-zookeeper-3.6.3-bin/conf/zoo1.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@localhost opt]# ./apache-zookeeper-3.6.3-bin/bin/zkServer.sh status ./apache-zookeeper-3.6.3-bin/conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: ./apache-zookeeper-3.6.3-bin/conf/zoo3.cfg
Client port found: 2183. Client address: localhost. Client SSL: false.
Mode: leader
此時服務器3被選舉為leader,原因是服務器3最近創建了節點,擁有了比服務器1更大的zxid,所以服務器3被選舉為leader,(節點的變化會導致zxid遞增)
資料寫入流程
在Zookeeper集群中,客戶端可用連接集群中任意一臺服務器進行操作,
如果是讀請求,則直接從當前服務器讀取資料,
如果是寫請求則分為以下步驟:
-
如果請求的服務器不是leader,則當前請求的服務器會把請求轉發給leader,
-
leader將寫請求廣播給各個服務器,各個服務器寫成功后會通知leader,
-
當leader收到大多數服務器寫成功的通知,則表示寫入成功,leader將通知之前的接收請求的服務器,由它進一步的通知客戶端寫入成功,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/281386.html
標籤:其他
下一篇:Django表單外鍵選項初始化
