1. 程式人生 > >讀《分布式一致性原理》系統模型

讀《分布式一致性原理》系統模型

很大的 CA 網絡 create 屬於 RM 還原 acid 只需要

在本節中,我們先從數據模型,節點特性,版本,watcher和ACL五個方面來了解zookeeper系統模型。

數據模型

技術分享圖片

事務ID

狹義的事務通常指的是數據庫事務,,一般包括一系列對數據庫有序的讀寫操作,這些數據庫事務所具有的ACID特性,

即原子性,一致性,隔離性,持久性。

在zookeeper中,事務是指能夠改變zookeeper服務器狀態的操作,我們稱之為事物操作或更新操作,一般包括數據節點的

創建與刪除,數據節點內容的更新,客戶端會話創建與失效等操作。對於每一個事務請求,zookeeper都會為其分配一個

全局的唯一的事務ID,用ZXID來表示,通常是一個64位的數字。每一個ZXID對應一次更新操作,從這些ZXID中可以間接的

識別zookeeper處理這些更新操作請求全局順序。

節點類型

1.持久節點(PERSISTENT)

所謂持久節點,是指在節點創建後,就一直存在,直到有刪除操作來主動清除這個節點——不會因為創建該節點的客戶端會話失效而消失。

2.持久順序節點(PERSISTENT_SEQUENTIAL)

這類節點的基本特性和上面的節點類型是一致的。額外的特性是,在ZK中,每個父節點會為他的第一級子節點維護一份時序,會記錄每個子節點創建的先後順序。基於這個特性,在創建子節點的時候,可以設置這個屬性,那麽在創建節點過程中,ZK會自動為給定節點名加上一個數字後綴,作為新的節點名。這個數字後綴的範圍是整型的最大值。

在創建節點的時候只需要傳入節點 “/test_”,這樣之後,zookeeper自動會給”test_”後面補充數字。

3.臨時節點(EPHEMERAL)

和持久節點不同的是,臨時節點的生命周期和客戶端會話綁定。也就是說,如果客戶端會話失效,那麽這個節點就會自動被清除掉。註意,這裏提到的是會話失效,而非連接斷開。另外,在臨時節點下面不能創建子節點。

這裏還要註意一件事,就是當你客戶端會話失效後,所產生的節點也不是一下子就消失了,也要過一段時間,大概是10秒以內,可以試一下,本機操作生成節點,在服務器端用命令來查看當前的節點數目,你會發現客戶端已經stop,但是產生的節點還在。

4.臨時順序節點(EPHEMERAL_SEQUENTIAL)

此節點是屬於臨時節點,不過帶有順序,客戶端會話結束節點就消失。下面是一個利用該特性的分布式鎖的案例流程。

狀態信息

我們可以針對zookeeper進行節點的創建和內容的更新,每個節點存儲內容外還存儲一些狀態信息。我們可以用get命令來獲取狀態信息。

Stat類包含了zookeeper上一個數據節點的所有狀態信息。

技術分享圖片

版本——保證分布式數據原子性操作

zookeeper中為數據節點引入了版本的概念,每個數據節點都具有三種類型的版本信息,對數據節點的任何操作更新操作

都會引起版本號的變化。

技術分享圖片

zookeeper中版本概念和傳統軟件的版本有很大的區別,它表示的是對數據的數據內容,子節點列表,或是節點ACL信息的修改次數。

在一個數據節點/zk-book被創建完畢之後,節點的version值是0,表示的含義是“當前節點自從創建之後,被更改的次數為0”;如果對該及節點的內容進行更新,那麽該節點的version就會變為1.version強調的是變更次數,即使內容沒有改變,version次數也會增加。

悲觀鎖,又稱作悲觀並發控制,是數據庫中一種非常典型且嚴格的並發控制策略。具有強烈的獨占和排他性。能夠有效的避免不同事務對同一數據並發更新而造成的數據一致性問題。

技術分享圖片

樂觀鎖

技術分享圖片

我們其實可以把一個樂觀鎖控制的事務分成三個階段:讀取數據,寫入效驗,數據寫入。

其中寫入效驗階段是整個悲觀所控制的關鍵所在。在寫入校驗階段,事務會檢查數據在讀取階段後是否

有其它事務對數據進行更新過,以確保數據更新的一致性。JDK中樂觀鎖的實現——CAS。

zookeeper服務器的PreRequestProcessor處理器類中,每一個數據更新請求都會進行如下檢查。

技術分享圖片

Watcher——數據變更通知

在zookeeper中,接口類Watcher用於表示一個標準的事件處理器,其定義了時間通知的相關邏輯,包含keeperState和EventType

兩個枚舉類,分別代表通知狀態和事件類型,同事定義了事件的回調方法:process(watchedEvent event)。

watcher事件

同一個事件類型在不同的通知狀態中所代表的含義有所不同

技術分享圖片

對於AuthFailed這個時間,需要註意的地方是,它的出發條件並不是簡簡單單因為當前客戶端會話沒有權限,而是授權失敗。

回調方法

process()方法是watcher接口中的一個回調方法,當zookeeper向哭護短發送wacher事件通知時,客戶端就會對應響應的Process方法進行回調

技術分享圖片

提到wachedEvent,不得不講WatcherEvent實體。籠統來講兩者表示的是同一個事物,都是對服務端事件的封裝。不同的是,wahchedEvent是一個邏輯是件

用於服務端和客戶端執行過程中所需的邏輯對象,而watcherEvent實現了序列化接口可以用於網絡傳出。

技術分享圖片

服務端在生成watchedEvent事件之後會調用getWrapped方法將自己包裝成一個可序列化的watcherEvent事件,以便通過網絡傳輸到客戶端。客戶端

接受到服務端的這個事件後,會首先將watcherEvent事件還原成一個watchedEvent事件,並傳遞個Process方法處理。

工作機制

zookeeper的watcher機制,總的來說可以概括為以下三個過程:客戶端註冊Watcher,服務端處理watcher,客戶端回調watcher

客戶端註冊wacher

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

服務端處理流程和客戶端回調流程可以具體查看此書先關章節。

Watcher特性

一次性:一旦一個watcher被觸發,zookeeper就會將其從相應的存儲中移除。

客戶端串行執行:客戶端watcher回調的過程是一個串行同步的過程。這為我們保證了順序。

輕量:WatchedEvent是最小通知單元,只包含是三部分:通知狀態,事件類型,節點路徑。

ACL——保障數據的安全

從三個方面來理解ACL機制,分別是:權限模式,授權對象和權限

通常使用“scheme:id:permission”來表示一個有效的ACL信息。

權限模式:Scheme

權限模式用來確定權限驗證過程中使用的檢驗策略。在zookeeper中,開發人員使用最多是一下四種權限模式。

IP

IP模式通過IP地址粒度來進行權限控制,例如配置了“ip:192.168.60.64”,即表示權限控制都是針對這個IP地址的。

同時,IP模式也支持按照網段的方式配置。例如“ip:192.168.0.1/24”表示針對192.168.0.*這個ip段進行權限控制。

Digest

Digest是最常用的權限控制模式,也更符合我們對於權限控制的認識,其以類是與“”username:password”形式

的權限標示來進行權限配置。便於區分不通應用來進行權限控制。

World

world是一種最開放的權限控制模式,從其名字中也可以看出,事實上這種權限控制的方式機會沒有任何作用。

數據節點的訪問權限對所有用戶開放,即所有用戶可以不進行任何權限效驗的情況下操作zookeeper上的數據。另外,world模式也可以看做是一種特殊的Digest模式,它只是一個權限表示,即“world:anyone”;

Super

Super模式,顧名思義就是超級用戶的意思,是一種特殊的Digest模式,在Super模式下,超級用戶可以對任意

zookeeper上的數據節點進行任何操作。

授權對象:ID

授權對象指的是權限賦予的用戶或一個指定實體,例如IP地址或是 機器等。在不同的權限模式下,授權對象時不同的。

技術分享圖片

權限:Permission

權限就是指通過權限檢查後可以被允許執行的操作。在zookeeper中,所有對數據的操作權限分為以下五大類:

CREATE:數據節點的創建權限,允許授權對象在該數據節點下創建子節點。

DELETE:子節點的刪除權限,允許授權對象刪除該數據節點的子節點。

READ:數據節點的讀取權限,允許授權對象訪問該數據節點並讀取其內容或子節點列表等。

WRITE:數據節點的權限更新,允許授權對象對該數據節點進行更新操作

ADMIN:數據節點的管理權限,允許授權對象對該數據節點進行ACL相關權限的設置操作。

ACL管理

設置ACL

通過zkCli腳本登陸zookeeper服務器後,可以通過兩種方式進行ACL設置。

一種是在數據節點創建的同時進行ACL權限的設置。命令格式如下:

create[-s][-e] path data acl

技術分享圖片

另一種方式則是使用setACL命令單獨對已經存在的數據節點進行ACL設置:

setAcl path acl

具體使用如下

技術分享圖片

Super模式的用法

如果一個持久數據節點包含了ACL權限控制,而其他創建者客戶端已經退出或已經不再使用,

那麽這些數據節點該如何清理呢?這個時候,就乣在ACL的super模式下,使用超級管理員權限來進行

權限處理了。要使用超級管理員權限,首先需要在zookeeper服務器上開啟super模式。該方法在zook

服務器啟動的時候,添加如下系統屬性:

技術分享圖片

其中“foo”代表了一個超級管理員的用戶名;密碼是可變的,由zookeeper

的系統管理員進行自主配置。此例中使用的是“foo:zk-book”的編碼。

完成對zookeeper服務器的SUper模式的開啟後,就可以在應用程序中使用了。

技術分享圖片

從上面的輸出結果中,我們可以看出,由於“foo:zk-book”是一個超級管理員賬戶,因此能夠針對一個受限控制的數據及誒單zk-book隨意進行操作

讀《分布式一致性原理》系統模型