下圖是一個Chubby的架構
Client
與Chubby Cells
replica servers
組成一個高可用的Chubby Cells
提供Lock Service
給Client用。chubby library
和Chubby Service利用RPC
除了使用Chubby的為分散式系統以外,Chubby本身也是分散式系統,且為了提供上面的Client一致性的服務,Chubby Cell裡面的replica servers本身就必須是一致性的。
為了讓Chubby高可用,且支撐上千個Google內部的分散式服務,因此Chubby本身的設計也是分散式系統,理所當然就會需要共識演算法來達成一致性,且因為設計了Watch機制與事件通知機制,Chubby內部的replica servers必須是Strong Consistency。
雖然論文並沒有明說Chubby是採用哪種共識演算法,但是既然Mike Burrows本人對Paxos非常情有獨鍾,很大機率就是使用他們自己實現的Paxos且是Multi-Paxos,我們這邊做個簡介,比較與之前介紹的Paxos
有什麼不同。
因此Chubby內部的一致性如下:
Paxos共識演算法
同步replica server才返回寫成功。Paxos如果發生Partition,比方說3:2,因為2個replica servers不過半數。所以如果client對那2個servers發出請求,會顯示不可用,Availability被交換掉。只有那3個servers還可以運作Paxos協定所以可以使用。
我們先看Chubby的Interface,了解Client如何使用這個Lock Service,再來看他怎麼實作Lock。
Node: Chubby的底層實際上是一個分散式文件系統(Distributed File System),提供一個類似UNIX的文件系統,因此包含了Files和Directory來存儲Data。而不管是File還是Directory都統稱為 Node
,名字在系統唯一。
/ls/foo/wombat/pouch:
Ephemeral Node: 該Node的生命週期等於Client的連接時間,Client離線或是一個Node沒有被任意Client打開,此Node會被刪除,可以用來判斷Client是否仍然活著。另有Permanent Node
Handle: Clients Open/Create Node,會得到類似UNIX的File Discriptor的Handle以訪問該Node,包含:
Node除了本質上是一個File或是Directory
Node含有以下資訊:
讀
、寫
、更改ACL
共3種,創建實際成自parent node,可以覆蓋。每一個Node都可以被拿來作為 advisory reader/writer lock 使用。
先說Advisory與Mandatory Lock差別
原因:
使用
(1). 每一個Node都是Lock,有兩種模式 (都是Advisory Lock)
回過頭來利用Multithreading的經驗想一下什麼時候會用Lock,就是有好幾個processes都會操作共用資源時嘛。
除了這些是平行發生的,在網路的世界中,還有訊息延遲或是亂序的情況發生。
所以其實前面介紹ACID、DB的Transacrion、共識演算法,其實有一部份在講的是 sequentialized。
而Chubby Lock Service最主要就是解決了這個問題,他使得使用同一個Lock的請求被 sequentialized。
我們來看看怎麼用。
(2). Sequencer
舉一個簡單的例子,如果一個Key-Value Store是需要被Lock住的共享資源,我希望對這個儲存服務的操作被 sequentialized,要求對Key-Value Store的更新都必須拿到Chubby Locks才能做事。
搭配Node
與Acquire Lock
得到的Sequencer
我們就可以實現與Multithreading一樣的Lock概念。
q 為Key-Value儲存服務,p為一個process。p 先向Chubby acquire 一個 Lock。
p要更新儲存的資料時,將取得Sequencer傳給 q,q去向Chubby驗整正確性與是否最新,同意請求。
每次操作都先拿取Lock
以上就是很基本Chubby Lock Service使用。
Leader Election
如果你只是像Kafka或是Hadoop這種要選Leader,不是需要一致性資料的儲存服務,那選Leader就不用像Raft
還要比較log新舊或是一對term限制。
直接搭配Chubby就非常簡單,
這就是一個搭配File System加上Lock Service應用的情境。
其他人只要去Watch的 "myservice/primary" Node 就可以知道現在Leader是否還活著,因為如果Leader斷線Chubby Node也會有反應跟事件通知。
夠簡單吧!
New/Old Leader
那如果Old Leader失效重啟他以為自己還是Leader,仍然要求別的replica server運作呢?搭配剛剛學到的Sequencer我們就可以運作起來如下。
Leader取得Lock也會拿到Sequencer。
也很簡單吧!
Chubby 其實是一個蠻強大且方便的系統,在分散式的環境中提供了很多功能,包含File System、Event-Watch、Lock Service等。
但是就像Borg或是很多Google的論文一樣,非常工程經驗導向,
有很多的名詞與定意與設計,卻又同時不開源,導致入門門檻很高。
論文有時看起來似懂非懂,希望上面的解釋搭配兩個小例子可以讓大家有點具體的印象。
如果還是不太能理解,沒關係我們之後拿Zookeeper來當例子,或是你本身有在用Zookeeper那一定非常有感,因為使用上是差不多的。
明天將要針對上面例子提到的問題,怎麼解決效能問題來介紹。
Chubby整理成筆記好難 =_=