zookeeper 分布式服務框架是 apache hadoop 的乙個子專案,它主要是用來解決分布式應用中經常遇到的一些資料管理問題,如:統一命名服務、狀態同步服務、集群管理、分布式應用配置項的管理等。
具體簡介可以參照這篇文章。
原理篇zookeeper的工作集群可以簡單分成兩類,乙個是leader,唯一乙個,其餘的都是follower,如何確定leader是通過內部選舉確定的。
leader和各個follower是互相通訊的,對於zk系統的資料都是儲存在記憶體裡面的,同樣也會備份乙份在磁碟上。對於每個zk節點而言,可以看做每個zk節點的命名空間是一樣的,也就是有同樣的資料(下面的樹結構)
zk的命名空間就是zk應用的檔案系統,它和linux的檔案系統很像,也是樹狀,這樣就可以確定每個路徑都是唯一的,對於命名空間的操作必須都是絕對路徑操作。與linux檔案系統不同的是,linux檔案系統有目錄和檔案的區別,而zk統一叫做znode,乙個znode節點可以包含子znode,同時也可以包含資料。
比如/nginx/conf,/是乙個znode,/nginx是/的子znode,/nginx還可以包含資料,資料內容就是所有安裝nginx的機器ip,/nginx/conf是/nginx子znode,它也可以包含內容,資料就是nginx的配置檔案內容。在應用中,我們可以通過這樣乙個路徑就可以獲得所有安裝nginx的機器ip列表,還可以獲得這些機器上nginx的配置檔案。zk中znode的節點建立時候是可以指定型別的,主要有下面幾種型別。
應用篇分布式系統的執行是很複雜的,因為涉及到了網路通訊還有節點失效等不可控的情況。下面介紹在最傳統的master-workers模型,主要可以會遇到什麼問題,傳統方法是怎麼解決以及怎麼用zookeeper解決。
集群當中最重要的是master,所以一般都會設定一台master的backup。
backup會定期向master獲取meta資訊並且檢測master的存活性,一旦master掛了,backup立馬啟動,接替master的工作自己成為master,分布式的情況多種多樣,因為涉及到了網路通訊的抖動,針對下面的情況:
backup檢測master存活性傳統的就是定期發包,一旦一定時間段內沒有收到響應就判定master down了,於是backup就啟動,如果master其實是沒有down,backup收不到響應或者收到響應延遲的原因是因為網路阻塞的問題呢?backup也啟動了,這時候集群裡就有了兩個master,很有可能部分workers匯報給master,另一部分workers匯報給後來啟動的backup,這下子服務就全亂了。
backup是定期同步master中的meta資訊,所以總是滯後的,一旦master掛了,backup的資訊必然是老的,很有可能會影響集群執行狀態。
解決問題:
zookeeper master選舉
zookeeper會分配給註冊到它上面的客戶端乙個編號,並且zk自己會保證這個編號的唯一性和遞增性,n多機器中只需選出編號最小的client作為master就行,並且保證這些機器的都維護乙個一樣的meta資訊檢視,一旦master掛了,那麼這n機器中編號最小的勝任master,meta資訊是一致的。
解決問題:
zookeeper監控集群
在一台機器上要多個程序或者多個執行緒操作同一資源比較簡單,因為可以有大量的狀態資訊或者日誌資訊提供保證,比如兩個a和b程序同時寫乙個檔案,加鎖就可以實現。但是分布式系統怎麼辦?需要乙個三方的分配鎖的機制,幾百台worker都對同乙個網路中的檔案寫操作,怎麼協同?還有怎麼保證高效的執行?
解決問題:
zookeeper分布式鎖
分布式鎖主要得益於zookeeper為我們保證了資料的強一致性,zookeeper的znode節點建立的唯一性和遞增效能保證所有來搶鎖的worker的原子性。
集群中配置檔案的更新和同步是很頻繁的,傳統的配置檔案分發都是需要把配置檔案資料分發到每台worker上,然後進行worker的reload,這種方式是最笨的方式,結構很難維護,因為如果集群當中有可能很多種應用的配置檔案要同步,而且效率很低,集群規模一大負載很高。還有一種就是每次更新把配置檔案單獨儲存到乙個資料庫裡面,然後worker端定期pull資料,這種方式就是資料及時性得不到同步。
解決問題:
zookeeper原理及應用
zk 在客戶端連線的時候會有乙個sessiontimeout,session timeout 之前只要連線上一台機器就不算斷開連線了 zab需要保證的是當3號變更被執行的時候1,2兩個變更都已經確定被執行了 zk是使用乙個類似於二階段提交的過程,客戶端提交到了proposer上,然後到master,...
ZooKeeper原理及使用
1 開源客戶端的使用 zkclient com.github.adyliu zkclient 2.1.1 2 zookeeper命令 刪除zookeeper的日誌檔案 位置 home work local zookeeper 3.4.6 data version 2 下log 事務日誌 和snaps...
佇列原理及應用
一.佇列的基本原理 佇列 queue 與棧一樣,是一種線性儲存結構,它具有如下特點 佇列中的資料元素遵循 先進先出 first in first out 的原則,簡稱fifo結構。在隊尾新增元素,在隊頭刪除元素。二.佇列的相關概念 隊頭與隊尾 允許元素插入的一端稱為隊尾,允許元素刪除的一端稱為隊頭。...