一 基本介紹
Zookeeper 是一個分布式協(xié)調(diào)服務(wù)的開源框架。主要用來解決分布式集群中應(yīng)用系統(tǒng)的一致性問題,例如怎樣避免同時操作同一數(shù)據(jù)造成臟讀的問題。
ZooKeeper 本質(zhì)上是一個分布式的小文件存儲系統(tǒng)。提供基于類似于文件系統(tǒng)的目錄樹方式的數(shù)據(jù)存儲,并且可以對樹中的節(jié)點進(jìn)行有效管理。從而用來維護(hù)和監(jiān)控你存儲的數(shù)據(jù)的狀態(tài)變化。通過監(jiān)控這些數(shù)據(jù)狀態(tài)的變化,從而可以達(dá)到基于數(shù)據(jù)的集群管理。諸如:統(tǒng)一命名服務(wù)、分布式配置管理、分布式消息隊列、分布式鎖、分布式協(xié)調(diào)等功能。

1.1 特性
-
全局?jǐn)?shù)據(jù)一致(有點吹):集群中每個服務(wù)器保存一份相同的數(shù)據(jù)副本,client 無論連接到哪個服務(wù)器,展示的數(shù)據(jù)都是一致的,這是最重要的特征; - 可靠性:如果消息被其中一臺服務(wù)器接受,那么將
被所有的服務(wù)器接受。 - 順序性:包括全局有序和偏序兩種:全局有序是指如果在一臺服務(wù)器上
消息 a 在消息 b 前發(fā)布,則在所有 Server 上消息 a 都將在消息 b 前被
發(fā)布;偏序是指如果一個消息 b 在消息 a 后被同一個發(fā)送者發(fā)布,a 必
將排在 b 前面。 -
數(shù)據(jù)更新原子性:一次數(shù)據(jù)更新要么成功(半數(shù)以上節(jié)點成功),要么失敗,不存在中間狀態(tài); - 實時性:Zookeeper 保證客戶端將在一個時間間隔范圍內(nèi)獲得服務(wù)器的更新信息,或者服務(wù)器失效的信息。
補充
zookeeper是順序一致性(即兩個寫操作在同一個節(jié)點必然是有序的,個人感覺就比最終一致性強一點),zookeeper不能保證每個client訪問到的集群中的數(shù)據(jù)是一致的
線性一致性:一致性更強。只有一個客戶端看到了一個新值,則所有的客戶端都不可能看到舊值。
參考:https://www.iteye.com/blog/flyfoxs-2121560
二 集群中的角色

2.1 leader
Zookeeper 集群工作的核心
事務(wù)請求(寫操作)的唯一調(diào)度和處理者,保證集群事務(wù)處理的順序性;集群內(nèi)部各個服務(wù)器的調(diào)度者。
對于 create,setData,delete 等有寫操作的請求,則需要統(tǒng)一轉(zhuǎn)發(fā)給leader 處理,leader 需要決定編號、執(zhí)行操作,這個過程稱為一個事務(wù)。
2.2 follower
- 處理客戶端
非事務(wù)(讀操作)請求,轉(zhuǎn)發(fā)事務(wù)請求給 Leader; - 參與集群 Leader
選舉投票。
此外,針對訪問量比較大的 zookeeper 集群,還可新增觀察者角色
2.3 observer
- 觀察者角色,觀察 Zookeeper 集群的最新狀態(tài)變化并將這些狀態(tài)
同步過來,其對于非事務(wù)請求可以進(jìn)行獨立處理,對于事務(wù)請求,則會轉(zhuǎn)發(fā)給 Leader服務(wù)器進(jìn)行處理。 -
不會參與任何形式的投票只提供非事務(wù)服務(wù),通常用于在不影響集群事務(wù)處理能力的前提下提升集群的非事務(wù)處理能力
三 集群搭建

3.1 卸載openjdk

3.2 安裝sun-jdk
- 將下載的壓縮包傳到服務(wù)器上
- 解壓
tar -zxvf jdk-8u211-linux-x64.tar.gz - 開始配置
vim /etc/profile
在最后一行后面加上
export JAVA_HOME=/usr/local/soft/jdk1.8.0_211
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=./:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
- 使更新生效,執(zhí)行
source /etc/profile
3.3 集群安裝
- 先安裝轎車在一臺機器上部署好zookeeper,參考:https://blog.csdn.net/cndmss/article/details/80220273
-
然后利用虛擬機clone,實現(xiàn)集群效果
效果如下
image.png
四 數(shù)據(jù)模型
ZooKeeper 的數(shù)據(jù)模型,在結(jié)構(gòu)上和標(biāo)準(zhǔn)文件系統(tǒng)的非常相似,擁有一個層次的命名空間,都是采用樹形層次結(jié)構(gòu),ZooKeeper 樹中的每個節(jié)點被稱為—Znode。和文件系統(tǒng)的目錄樹一樣,ZooKeeper 樹中的每個節(jié)點可以擁有子節(jié)點。
但也有不同之處:
- Znode
兼具文件和目錄兩種特點。既像文件一樣維護(hù)著數(shù)據(jù)、元信息、ACL、時間戳等數(shù)據(jù)結(jié)構(gòu),又像目錄一樣可以作為路徑標(biāo)識的一部分,并可以具有子 Znode。用戶對 Znode 具有增、刪、改、查等操作(權(quán)限允許的情況下) - Znode 具有
原子性操作,讀操作將獲取與節(jié)點相關(guān)的所有數(shù)據(jù),寫操作也將替換掉節(jié)點的所有數(shù)據(jù)。另外,每一個節(jié)點都擁有自己的ACL(訪問控制列表),這個列表規(guī)定了用戶的權(quán)限,即限定了特定用戶對目標(biāo)節(jié)點可以執(zhí)行的操作。 - Znode 存儲數(shù)據(jù)大小有限制(通常以 KB 為大小單位)
- Znode 通過路徑引用,如同 Unix 中的文件路徑。路徑必須是
絕對的,因此他們必須由斜杠字符來開頭。不能重復(fù),并且一些特殊路徑已經(jīng)被系統(tǒng)占用掉了
4.1 數(shù)據(jù)結(jié)構(gòu)體

4.2 節(jié)點類型

這樣,一共就有4種類型的節(jié)點
- PERSISTENT:永久節(jié)點
- EPHEMERAL:臨時節(jié)點
- PERSISTENT_SEQUENTIAL:永久節(jié)點、序列化
- EPHEMERAL_SEQUENTIAL:臨時節(jié)點、序列化
4.3 節(jié)點屬性



五 shell客戶端
5.1 連接操作
./zkCli.sh -r -server ip:port
-timeout:當(dāng)前會話的超時時間,zookeper依靠與客戶端的心跳來判斷會話是否有效,單位是毫秒
-r: 只讀模式,zookeeper的只讀模式指一個服務(wù)器與集群中過半機器失去連接以后,這個服務(wù)器就不在不處理客戶端的請求,但我們?nèi)匀幌M摲?wù)器可以提供讀服務(wù)。
-server: zookeeper服務(wù)器ip地址和端口號
5.2 創(chuàng)建節(jié)點

- 臨時節(jié)點的刪除
有一定延時(因為集群需要判斷會話是真的斷了,還是網(wǎng)絡(luò)斷了一下)
5.3 節(jié)點查看

5.4 更新節(jié)點

5.5 刪除節(jié)點
delete和Rmr

5.6 quota(定額)

5.7 其他命令

六 watch

6.1 機制特點

6.2 通知狀態(tài)和事件類型

6.3 shell操作watch


