讀<分布式一致性原理>初識zookeeper
zookeeper是什麽
zookeeper是一個典型的分布式數據一致性的解決方案,分布式應用程序可以基於它實現諸如:數據發布/訂閱,負載均衡,命名服務,分布式協調/通知
,集群管理,Master選舉,分布式鎖和分布式隊列等功能。zookeeper可以保證如下分布式一致性特性。
順序一致性
從同一個客戶端發起的事務請求,最終將會嚴格的按照發起順序被應用到zookeeper中去。
原子性
所有的事務請求的處理結果在整個集群中所有機器上的應用情況是一致的,也就是說,要麽整個集群所有機器都成功應用了某一個事務,要麽
都沒有應用。一定不會出現集群中部分機器應用了該事務,而另外一部分沒有應用的情況。
單一視圖
無論客戶端連接的是哪個zookeeper服務器,其只看到的服務端數據模型都是一致的。
可靠性
一旦服務端成功的應用了一個事務,並完成對客戶端的響應,那麽該事物所引起的服務端狀態變更將會被一致保留下來,
除非有另一個事務對其進行了更改。
實時性
一旦一個事務被成功應用,那麽客戶端能夠立即從服務端上讀取到這個事務變更後的最新數據狀態。但是這裏需要註意的是
zookeeper僅僅保證在一定的時間段內,客戶端最終一定能夠從服務端上讀取到最新的數據狀態。
zookeeper的設計目標
1.簡單的數據結構模型
zookeeper通過一個共享的樹形結構名字空間使得分布式能夠進行相互協調。樹形結構的名字空間是由一些列znode的的數據節點組成的。
zookeeper將全部數據存儲在內存中,用來提高服務器吞吐量,降低延遲。
2.可以構建集群
zookeeper的集群一般由3-5臺機器就可以構成一個集群。組成zookeeper集群的每臺機器都會在內存中維護當前的服務器
狀態,並且每臺機器之間都互相保持著通信。只要集群中存在超過一半的機器能夠正常工作,那麽整個集群就能正常對外服務。
zookeeper的客戶端程序會選擇和集群中任一機器來創建一個TCP連接,而一旦客戶端和某太zookeeper服務器之間連接中斷後,
客戶端戶自動連接集群中的其他機器。
3.順序訪問
對於來自客戶端的每個更新請求,zookeeper都會分配一個全局唯一的遞增編號,這個編號反映了所有事物操作的先後順序,應用程序
可以使用zookeeper的這個特性來實現更高層次的同步原語。
4.高性能
由於zookeeper將全量數據存儲在內存中,並直接服務於客戶端的所有非事務請求,因此它尤其使用於以讀操作為主的應用場景。
zookeeper的基本概念
1.集群角色
通常在分布式系統中,構成集群的每臺機器都有自己的角色,最典型的集群模式就是Master/Slave(主備模式)。在這種模式中
我們把所有能夠處理寫操作的機器稱為Master機器,把所有通過異步復制方式獲取最新數據,並且提供讀服務的機器稱為Slave機器
而在zookeeper中,這些概念被顛覆了。它沒有沿用傳統的Master/slave概念,而是引入了Leader,Follwer,和Observer三種角色。
zookeeper集群中的所有機器通過一個Leader選舉過程來選定一個被稱為Leader的機器,Leader服務器為客戶端提供讀和寫服務。
Follower和Observer都能夠提供讀服務,唯一的區別是,Observer機器不參與Leader選取過程,也不參與寫操作的“過半寫成功”策略。
因此Observer可以在不影響寫性能的情況下提升集群的讀性能。
2.會話(session)
Session是指客戶端會話,在講解會話之前,我們首先了解一下客戶端連接。
在zookeeper中,一個客戶端連接是指客戶端和服務器之間的一個TCP長連接。zookeeper對外服務的端口默認是2181,客戶端啟動的
時候會先與一個服務器建立連接。從一次建立連接開始,客戶端的生命周期也就開始了,通過這個連接,客戶端能夠通過心跳檢測與服務器保持有效
會話,也能夠向zookeeper發送請求和接收響應。同事還能夠通過該連接來接受來自服務器的Watch事件通知。session的sessionout值來設置一個與服務器會話的
超時時間。由於網路原因或服務器壓力太大或是客戶端主動斷開連接等原因導致服務端和客戶端連接斷開,只要在sessionTimeOut規定時間內,客戶端能與服務器任意
一臺機器建立連接,那麽之前建立的會話仍然有效。
3.數據節點(znode)
在談到分布式的時候,我們通常說的“節點”是指組成集群的每一臺機器。在zookeeper中,“節點”分為兩類,第一類是指構成集群的機器,
我們稱之為機器節點。第二類是數據模型中的數據單元,我們稱之為數據節點---znode。zookeeper將所有的數據存儲在內存中。
數據模型是一顆樹,由"/"進行分割路徑。每個znode都會保存自己的數據內容,同時還會保存一些屬性信息。
在zookeeper中,zone可以分為持久節點和臨時節點。持久節點是指一個znode被創建了除非主動進行移除操作,否則這個znode
將一直處在zookeeper上。而臨時節點就不一樣了,它 的生命周期和會話綁定,一旦客戶端會話失效,那麽由這個客戶端創建的所有
臨時節點都將被移除。zookeeper還允許為每個節點添加一個特殊屬性:SEQUENTIAl。一旦節點被標上這個屬性,那麽zookeeper在創建這個節點時會自動在節點後面
加一個整形數字。這個數字是由父節點維護的遞增數字。
4.版本
zookeeper的每個znode都會存儲數據,對於每個znode ,zookeeper都會維護一個stat的數據結構。Stat中記錄著這個znode的三個數據版本
分別是Version(當前的數據版本)Cversion(當前znode子節點版本)和aversion(當前znode的ACL版本)
5.Watcher
zookeeper允許在指定節點註冊一些watcher,並且在一些特定事件發生的時候,zookeeper會將事件通知發送到感興趣的客戶端上去。
6.ACL
zookeeper采用ACL策略進行權限控制。zookeeper定義了5種權限
讀<分布式一致性原理>初識zookeeper