問題導讀:
1.master掛機,傳統做法備份必然是以前數據,該如何保證掛機數據與備份數據一致?
2.分布式系統如何實現對同一資源的訪問,保證數據的強一致性?
3.集群中的worker掛了,傳統做法是什么?zookeeper又是如何做的?
分布式系統的運行是很復雜的,因為涉及到了網絡通信還有節點失效等不可控的情況。下面介紹在最傳統的master-workers模型,主要可以會遇到什么問題,傳統方法是怎么解決以及怎么用zookeeper解決。
Master節點管理
集群當中最重要的是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的信息必然是老的,很有可能會影響集群運行狀態。
解決問題:
- Master節點高可用,並且保證唯一。
- Meta信息的及時同步
zookeeper Master選舉
zookeeper會分配給注冊到它上面的客戶端一個編號,並且zk自己會保證這個編號的唯一性和遞增性,N多機器中只需選出編號最小的Client作為Master就行,並且保證這些機器的都維護一個一樣的meta信息視圖,一旦Master掛了,那么這N機器中編號最小的勝任Master,Meta信息是一致的。
配置文件管理
集群中配置文件的更新和同步是很頻繁的,傳統的配置文件分發都是需要把配置文件數據分發到每台worker上,然后進行worker的reload,這種方式是最笨的方式,結構很難維護,因為如果集群當中有可能很多種應用的配置文件要同步,而且效率很低,集群規模一大負載很高。還有一種就是每次更新把配置文件單獨保存到一個數據庫里面,然后worker端定期pull數據,這種方式就是數據及時性得不到同步。
解決問題:
- 統一配置文件分發並且及時讓worker生效
zookeeper發布與訂閱模型
發布與訂閱模型,即所謂的配置中心,顧名思義就是發布者將數據發布到ZK節點上,供訂閱者動態獲取數據,實現配置信息的集中式管理和動態更新。例如全局的配置信息,服務式服務框架的服務地址列表等就非常適合使用。
分布式鎖
在一台機器上要多個進程或者多個線程操作同一資源比較簡單,因為可以有大量的狀態信息或者日志信息提供保證,比如兩個A和B進程同時寫一個文件,加鎖就可以實現。但是分布式系統怎么辦?需要一個三方的分配鎖的機制,幾百台worker都對同一個網絡中的文件寫操作,怎么協同?還有怎么保證高效的運行?
解決問題:
- 高效分布式的分布式鎖
zookeeper分布式鎖
分布式鎖主要得益於ZooKeeper為我們保證了數據的強一致性,zookeeper的znode節點創建的唯一性和遞增性能保證所有來搶鎖的worker的原子性。
集群worker管理
集群中的worker掛了是很可能的,一旦workerA掛了,如果存在其余的workers互相之間需要通信,那么workers必須盡快更新自己的hosts列表,把掛了的worker剔除,從而不在和它通信,而Master要做的是把掛了worker上的作業調度到其他的worker上。同樣的,這台worker重新恢復正常了,要通知其他的workers更新hosts列表。傳統的作法都是有專門的監控系統,通過不斷去發心跳包(比如ping)來發現worker是否alive,缺陷就是及時性問題,不能應用於在線率要求較高的場景
解決問題:
- 集群worker監控
zookeeper監控集群
利用zookeeper建立znode的強一致性,可以用於那種對集群中機器狀態,機器在線率有較高要求的場景,能夠快速對集群中機器變化作出響應。
相關文章:
zookeeper原理
zookeeper中Watcher和Notifications
zookeeper適用場景:如何競選Master及代碼實現
zookeeper適用場景:配置文件同步
zookeeper適用場景:分布式鎖實現
zookeeper適用場景:zookeeper解決了哪些問題
文章轉自:http://www.aboutyun.com/thread-9266-1-1.html