zookeeper(1)
gossip
隨筆 - 634 文章 - 3 評論 - 434</div><!--end: blogStats --> </div><!--end: navigator 部落格導航欄 -->
【轉】淺談分散式服務協調技術 Zookeeper
非常好介紹Zookeeper的文章,
Google的三篇論文影響了很多很多人,也影響了很多很多系統。這三篇論文一直是分散式領域傳閱的經典。根據MapReduce,於是我們有了Hadoop;根據GFS,於是我們有了HDFS;根據BigTable,於是我們有了HBase。而在這三篇論文裡都提及Google的一個Lock Service —— Chubby,哦,於是我們有了Zookeeper。 隨著大資料的火熱,Hxx們已經變得耳熟能詳,現在作為一個開發人員如果都不知道這幾個名詞出門都好像不好意思跟人打招呼。但實際上對我們這些非大資料開發人員而言,Zookeeper是比Hxx們可能接觸到更多的一個基礎服務。但是,無奈的是它一直默默的位於二線,從來沒有Hxx們那麼耀眼。那麼到底什麼是Zookeeper呢?Zookeeper可以用來幹什麼?我們將如何使用Zookeeper?Zookeeper又是怎麼實現的?
什麼是Zookeeper 在Zookeeper的官網上有這麼一句話:ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services。 這大概描述了Zookeeper主要是一個分散式服務協調框架,實現同步服務,配置維護和命名服務等分散式應用。是一個高效能的分散式資料一致性解決方案。 通俗地講,ZooKeeper是動物園管理員,它是拿來管大象 Hadoop、鯨魚 HBase、Kafka等的管理員。
Zookeeper和CAP的關係 作為一個分散式系統,分割槽容錯性是一個必須要考慮的關鍵點。一個分散式系統一旦喪失了分割槽容錯性,也就表示放棄了擴充套件性。因為在分散式系統中,網路故障是經常出現的,一旦出現在這種問題就會導致整個系統不可用是絕對不能容忍的。所以,大部分分散式系統都會在保證分割槽容錯性的前提下在一致性和可用性之間做權衡。 ZooKeeper是個CP(一致性+分割槽容錯性)的,即任何時刻對ZooKeeper的訪問請求能得到一致的資料結果,同時系統對網路分割具備容錯性;但是它不能保證每次服務請求的可用性。也就是在極端環境下,ZooKeeper可能會丟棄一些請求,消費者程式需要重新請求才能獲得結果。 ZooKeeper是分散式協調服務,它的職責是保證資料在其管轄下的所有服務之間保持同步、一致;所以就不難理解為什麼ZooKeeper被設計成CP而不是AP特性的了。而且, 作為ZooKeeper的核心實現演算法Zab,就是解決了分散式系統下資料如何在多個服務之間保持同步問題的。
Zookeeper節點特性及節點屬性分析 Zookeeper提供基於類似於檔案系統的目錄節點樹方式的資料儲存,但是Zookeeper並不是用來專門儲存資料的,它的作用主要是用來維護和監控你儲存的資料的狀態變化。通過監控這些資料狀態的變化,從而可以達到基於資料的叢集管理。 資料模型 與Linux檔案系統不同的是,Linux檔案系統有目錄和檔案的區別,而Zookeeper的資料節點稱為ZNode,ZNode是Zookeeper中資料的最小單元,每個ZNode都可以儲存資料,同時還可以掛載子節點,因此構成了一個層次化的名稱空間,稱為樹。 Zookeeper中ZNode的節點建立時候是可以指定型別的,主要有下面幾種型別。
Watcher資料變更通知 Zookeeper使用Watcher機制實現分散式資料的釋出/訂閱功能。 Zookeeper的Watcher機制主要包括客戶端執行緒、客戶端WatcherManager、Zookeeper伺服器三部分。客戶端在向Zookeeper伺服器註冊的同時,會將Watcher物件儲存在客戶端的WatcherManager當中。當Zookeeper伺服器觸發Watcher事件後,會向客戶端傳送通知,客戶端執行緒從WatcherManager中取出對應的Watcher物件來執行回撥邏輯。 ACL保障資料的安全 Zookeeper內部儲存了分散式系統執行時狀態的元資料,這些元資料會直接影響基於Zookeeper進行構造的分散式系統的執行狀態,如何保障系統中資料的安全,從而避免因誤操作而帶來的資料隨意變更而導致的資料庫異常十分重要,Zookeeper提供了一套完善的ACL許可權控制機制來保障資料的安全。 我們可以從三個方面來理解ACL機制:許可權模式 Scheme、授權物件 ID、許可權 Permission,通常使用”scheme:id:permission”來標識一個有效的ACL資訊。 記憶體資料 Zookeeper的資料模型是樹結構,在記憶體資料庫中,儲存了整棵樹的內容,包括所有的節點路徑、節點資料、ACL資訊,Zookeeper會定時將這個資料儲存到磁碟上。
Zookeeper的實現原理分析 1. Zookeeper Service網路結構 Zookeeper的工作叢集可以簡單分成兩類,一個是Leader,唯一一個,其餘的都是follower,如何確定Leader是通過內部選舉確定的。
2. Zookeeper讀寫資料
3. Zookeeper工作原理 Zab協議 Zookeeper的核心是廣播,這個機制保證了各個Server之間的同步。實現這個機制的協議叫做Zab協議。 Zab(ZooKeeper Atomic Broadcast)原子訊息廣播協議作為資料一致性的核心演算法,Zab協議是專為Zookeeper設計的支援崩潰恢復原子訊息廣播演算法。 Zab協議核心如下: 所有的事務請求必須一個全域性唯一的伺服器(Leader)來協調處理,叢集其餘的伺服器稱為follower伺服器。Leader伺服器負責將一個客戶端請求轉化為事務提議(Proposal),並將該proposal分發給叢集所有的follower伺服器。之後Leader伺服器需要等待所有的follower伺服器的反饋,一旦超過了半數的follower伺服器進行了正確反饋後,那麼Leader伺服器就會再次向所有的follower伺服器分發commit訊息,要求其將前一個proposal進行提交。 Zab模式 Zab協議包括兩種基本的模式:崩潰恢復和訊息廣播。
Zookeeper只允許唯一的一個Leader伺服器來進行事務請求的處理,Leader伺服器在接收到客戶端的事務請求後,會生成對應的事務提議併發起一輪廣播協議,而如果叢集中的其他機器收到客戶端的事務請求後,那麼這些非Leader伺服器會首先將這個事務請求轉發給Leader伺服器。 訊息廣播 Zab協議的訊息廣播過程使用是一個原子廣播協議,類似一個2PC提交過程。具體的:
Zab協議簡化了2PC事務提交:
崩潰恢復 上面我們講了Zab協議在正常情況下的訊息廣播過程,那麼一旦Leader伺服器出現崩潰或者與過半的follower伺服器失去聯絡,就進入崩潰恢復模式。 恢復模式需要重新選舉出一個新的Leader,讓所有的Server都恢復到一個正確的狀態。
Zookeeper實踐,共享鎖,Leader選舉 分散式鎖用於控制分散式系統之間同步訪問共享資源的一種方式,可以保證不同系統訪問一個或一組資源時的一致性,主要分為排它鎖和共享鎖。
推薦文章:基於Zk實現分散式鎖 Leader選舉 Leader選舉是保證分散式資料一致性的關鍵所在。當Zookeeper叢集中的一臺伺服器出現以下兩種情況之一時,需要進入Leader選舉。
Zookeeper在3.4.0版本後只保留了TCP版本的 FastLeaderElection 選舉演算法。當一臺機器進入Leader選舉時,當前叢集可能會處於以下兩種狀態:
對於叢集中已經存在Leader而言,此種情況一般都是某臺機器啟動得較晚,在其啟動之前,叢集已經在正常工作,對這種情況,該機器試圖去選舉Leader時,會被告知當前伺服器的Leader資訊,對於該機器而言,僅僅需要和Leader機器建立起連線,並進行狀態同步即可。 而在叢集中不存在Leader情況下則會相對複雜,其步驟如下: (1) 第一次投票。無論哪種導致進行Leader選舉,叢集的所有機器都處於試圖選舉出一個Leader的狀態,即LOOKING狀態,LOOKING機器會向所有其他機器傳送訊息,該訊息稱為投票。投票中包含了SID(伺服器的唯一標識)和ZXID(事務ID),(SID, ZXID)形式來標識一次投票資訊。假定Zookeeper由5臺機器組成,SID分別為1、2、3、4、5,ZXID分別為9、9、9、8、8,並且此時SID為2的機器是Leader機器,某一時刻,1、2所在機器出現故障,因此叢集開始進行Leader選舉。在第一次投票時,每臺機器都會將自己作為投票物件,於是SID為3、4、5的機器投票情況分別為(3, 9),(4, 8), (5, 8)。 (2) 變更投票。每臺機器發出投票後,也會收到其他機器的投票,每臺機器會根據一定規則來處理收到的其他機器的投票,並以此來決定是否需要變更自己的投票,這個規則也是整個Leader選舉演算法的核心所在,其中術語描述如下
每次對收到的投票的處理,都是對(vote_sid, vote_zxid)和(self_sid, self_zxid)對比的過程。
(3) 確定Leader。經過第二輪投票後,叢集中的每臺機器都會再次接收到其他機器的投票,然後開始統計投票,如果一臺機器收到了超過半數的相同投票,那麼這個投票對應的SID機器即為Leader。此時Server3將成為Leader。 由上面規則可知,通常那臺伺服器上的資料越新(ZXID會越大),其成為Leader的可能性越大,也就越能夠保證資料的恢復。如果ZXID相同,則SID越大機會越大。
「 淺談大規模分散式系統中那些技術點」系列文章:
Reference http://www.cnblogs.com/yuyijq/p/3391945.html http://www.cnblogs.com/kms1989/p/5504505.html http://www.hollischuang.com/archives/1275 http://www.jianshu.com/p/bf32e44d3113 http://www.jianshu.com/p/4654bdbb8792 http://www.jianshu.com/p/8fba732af0cd http://www.jianshu.com/p/6af7362701c5 http://www.jianshu.com/p/6929446d3b10 http://www.jianshu.com/p/5dce97c9ba85 http://www.cnblogs.com/sunddenly/articles/4073157.html http://www.dczou.com/viemall/454.html 轉載請並標註: “本文轉載自 linkedkeeper.com (文/張鬆然)” |
關注 - 22
粉絲 - 366 +加關注 0 0 currentDiggType = 0; « 上一篇: JVM Debugger Memory View for IntelliJ IDEA
» 下一篇: 【轉】Intellij IDEA除錯功能
posted @ 2017-07-26 09:54 扯 閱讀( 1276) 評論( 0) 編輯 收藏 重新整理評論 重新整理頁面 返回頂部 註冊使用者登入後才能發表評論,請 登入 或 註冊, 訪問網站首頁。 【推薦】超50萬VC++原始碼: 大型組態工控、電力模擬CAD與GIS原始碼庫!
【前端】SpreadJS表格控制元件,可嵌入應用開發的線上Excel
【免費】程式設計師21天搞定英文文件閱讀
【推薦】如何快速搭建人工智慧應用?
最新IT新聞:
· 錘子吳德周:初期低估了TNT的開發難度 但系統會持續做
· 網易:2018年11月30日零點起正式停止網易部落格運營
· 基於opencv和python的手指識別及追蹤
· 一文看懂京東智慧城市佈局:城市計算的“方法論”
· 軟銀願景基金投資眾安線上 幫助其佈局國際市場
» 更多新聞… 最新知識庫文章:
· 一個故事看懂“區塊鏈”
· 被踢出去的使用者
· 成為一個有目標的學習者
· 歷史轉折中的“杭派工程師”
· 如何提高程式碼質量?
» 更多知識庫文章… 歷史上的今天:
2016-07-26 索引的特點及使用
fixPostBody(); setTimeout(function () { incrementViewCount(cb_entryId); }, 50); deliverAdT2(); deliverAdC1(); deliverAdC2(); loadNewsAndKb(); loadBlogSignature(); LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid); GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate, cb_postType); loadOptUnderPost(); GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);
</div><!--end: forFlow -->
</div><!--end: mainContent 主體內容容器-->
<div id="sideBar">
<div id="sideBarMain">
公告
暱稱: 扯園齡: 10年2個月
粉絲: 366
關注: 22 +加關注
<div id="blog-calendar" style=""><table id="blogCalendar" class="Cal" cellspacing="0" cellpadding="0" title="Calendar">
<tbody><tr><td colspan="7"><table class="CalTitle" cellspacing="0">
<tbody><tr><td class="CalNextPrev"><a href="javascript:void(0);" onclick="loadBlogCalendar('2018/07/01');return false;"><</a></td><td align="center">2018年8月</td><td class="CalNextPrev" align="right"><a href="javascript:void(0);" onclick="loadBlogCalendar('2018/09/01');return false;">></a></td></tr>
</tbody></table></td></tr><tr><th class="CalDayHeader" align="center" abbr="日" scope="col">日</th><th class="CalDayHeader" align="center" abbr="一" scope="col">一</th><th class="CalDayHeader" align="center" abbr="二" scope="col">二</th><th class="CalDayHeader" align="center" abbr="三" scope="col">三</th><th class="CalDayHeader" align="center" abbr="四" scope="col">四</th><th class="CalDayHeader" align="center" abbr="五" scope="col">五</th><th class="CalDayHeader" align="center" abbr="六" scope="col">六</th></tr><tr><td class="CalOtherMonthDay" align="center">29</td><td class="CalOtherMonthDay" align="center">30</td><td class="CalOtherMonthDay" align="center">31</td><td align="center">1</td><td align="center">2</td><td align="center">3</td><td class="CalWeekendDay" align="center">4</td></tr><tr><td class="CalWeekendDay" align="center">5</td><td align="center">6</td><td align="center">7</td><td align="center"><a href="https://www.cnblogs.com/gossip/archive/2018/08/08.html"><u>8</u></a></td><td align="center">9</td><td align="center">10</td><td class="CalWeekendDay" align="center">11</td></tr><tr><td class="CalWeekendDay" align="center">12</td><td align="center">13</td><td align="center">14</td><td align="center">15</td><td align="center">16</td><td align="center">17</td><td class="CalWeekendDay" align="center">18</td></tr><tr><td class="CalWeekendDay" align="center">19</td><td align="center">20</td><td class="CalTodayDay" align="center">21</td><td align="center">22</td><td align="center">23</td><td align="center">24</td><td class="CalWeekendDay" align="center">25</td></tr><tr><td class="CalWeekendDay" align="center">26</td><td align="center">27</td><td align="center">28</td><td align="center">29</td><td align="center">30</td><td align="center">31</td><td class="CalOtherMonthDay" align="center">1</td></tr><tr><td class="CalOtherMonthDay" align="center">2</td><td class="CalOtherMonthDay" align="center">3</td><td class="CalOtherMonthDay" align="center">4</td><td class="CalOtherMonthDay" align="center">5</td><td class="CalOtherMonthDay" align="center">6</td><td class="CalOtherMonthDay" align="center">7</td><td class="CalOtherMonthDay" align="center">8</td></tr>
<div id="leftcontentcontainer">
<div id="blog-sidecolumn"><div id="sidebar_search" class="sidebar-block">
搜尋
常用連結
我的標籤
隨筆分類(370)
- .Net Framework(10)
- 【程式碼坑】(1)
- Ajax(4)
- AspMvc(8)
- AspNet(28)
- IIS(11)
- Java(25)
- JavaScript(37)
- Jquery(12)
- Linq(4)
- Mongo(2)
- Net面試題寶典(3)
- Office程式設計(9)
- Oracle(20)
- ORM(5)
- SQL Server(37)
- UML(2)
- Visual Studio(8)
- Web前端開發(5)
- WinForm&WPF(3)
- XML(2)
- 測試(9)
- 持續整合(2)
- 讀書(5)
- 反射(6)
- 服務(20)
- 網際網路技術(1)
- 其它(30)
- 其它資料庫(12)
- 設計模式(6)
- 生活(6)
- 專案管理(10)
- 訊息佇列(13)
- 效能優化(7)
- 原始碼控制工具(7)
隨筆檔案(634)
- 2018年8月 (1)
- 2018年6月 (2)
- 2018年5月 (2)
- 2018年4月 (1)
- 2018年3月 (2)
- 2018年1月 (2)
- 2017年12月 (1)
- 2017年7月 (6)
- 2017年6月 (4)
- 2017年5月 (3)
- 2017年3月 (1)
- 2017年2月 (2)
- 2017年1月 (4)
- 2016年12月 (7)
- 2016年11月 (26)
- 2016年10月 (50)
- 2016年9月 (9)
- 2016年8月 (4)
- 2016年7月 (9)
- 2016年6月 (14)
- 2016年5月 (3)
- 2016年4月 (16)
- 2016年3月 (4)
- 2016年2月 (9)
- 2016年1月 (1)
- 2015年12月 (8)
- 2015年11月 (7)
- 2015年10月 (13)
- 2015年9月 (1)
- 2015年8月 (1)
- 2015年7月 (1)
- 2015年6月 (9)
- 2015年5月 (14)
- 2015年4月 (6)
- 2015年3月 (9)
- 2015年2月 (7)
- 2015年1月 (15)
- 2014年12月 (6)
- 2014年11月 (12)
- 2014年10月 (1)
- 2014年9月 (1)
- 2014年8月 (11)
- 2014年7月 (21)
- 2014年6月 (15)
- 2014年5月 (14)
- 2014年4月 (10)
- 2014年3月 (1)
- 2014年2月 (4)
- 2014年1月 (2)
- 2013年12月 (1)
- 2013年10月 (1)
- 2013年9月 (1)
- 2013年8月 (2)
- 2013年7月 (1)
- 2013年6月 (3)
- 2013年5月 (1)
- 2013年4月 (1)
- 2013年3月 (2)
- 2013年2月 (1)
- 2012年10月 (1)
- 2012年9月 (3)
- 2012年7月 (3)
- 2012年6月 (3)
- 2012年5月 (9)
- 2012年4月 (9)
- 2012年3月 (24)
- 2012年2月 (10)
- 2012年1月 (2)
- 2011年12月 (13)
- 2011年11月 (31)
- 2011年10月 (12)
- 2011年9月 (11)
- 2011年8月 (2)
- 2011年7月 (8)
- 2011年6月 (3)
- 2011年5月 (4)
- 2011年4月 (11)
- 2011年3月 (12)
- 2011年2月 (8)
- 2011年1月 (6)
- 2010年12月 (2)
- 2010年10月 (1)
- 2010年5月 (2)
- 2010年4月 (2)
- 2010年3月 (6)
- 2010年2月 (5)
- 2009年12月 (3)
- 2009年10月 (1)
- 2009年8月 (4)
- 2009年6月 (5)
- 2009年2月 (5)
- 2009年1月 (4)
- 2008年12月 (8)
- 2008年11月 (4)
- 2008年10月 (10)
- 2008年9月 (1)
積分與排名
- 積分 - 585436
- 排名 - 209
最新評論
- 1. Re:MySql_SQLyog+SQL Assistant實現智慧提示
- 擼主,可否分享下部落格中的軟體?
- 2. Re:C# Json格式字串
- 請教樓主,可以返回物件嗎
- 3. Re:Struct2_使用Ajax呼叫Action方法並返回值
- error : function(d) { alert(d.responseText);這個responseText是哪裡的啊?還有這個d引數是具體是ac……
- 4. Re:MVC3+AutoFac實現程式集級別的依賴注入
- 實用,贊!
- 5. Re:Dubbo系列(3)_官方Demo說明
- 真的像你的暱稱一樣 文章無意義 扯
閱讀排行榜
- 1. $.ajax相關用法(102094)
- 2. 非常好的Oracle教程【轉】(81376)
- 3. ORA-12505, TNS:listener does not currently know of SID given in connect desc .(70968)
- 4. PL/Sql 中建立、除錯、呼叫儲存過程(50304)
- 5. 訊息佇列系列(二):.Rabbitmq的使用及Web監控工具使用(49448)