zookeeper入門系列

zookeeper可謂是目前使用最廣泛的分布式組件了。其功能和職責單一,但卻非常重要。

在現今這個年代,介紹zookeeper的書和文章可謂多如牛毛,本人不才,試圖通過自己的理解來介紹zookeeper,希望通過一個初學者的視角來學習zookeeper,以期讓人更加深入和平穩的理解zookeeper。其中參考了不少教程和書,相關書目列在文末,也感謝這些作者。

學習新的框架,先讓我們搞清楚他是什么,這是它的內涵,然后再介紹它能做什么,這是它的外延,內涵和外延共同來定義框架本身,會對框架有較為深刻的理解,在應用層面上知道如何用。其次再搞清楚zookeeper相關的理論基礎,其目的是知道zookeeper是如何被發明的,是否能夠借鑒以便今后自己能夠用到其他地方。最后搞清楚zookeeper中一些設計的原理和細節,目的也是搞清來龍去脈,學會“術”從而應用到別的地方。當然了,加深的理解同樣能夠幫助認識zookeeper本身,在使用時才知道為什么這樣用。

首先,

zookeeper到底是什么?

zookeeper實際上是yahoo開發的,用于分布式中一致性處理的框架。最初其作為研發hadoop時的副產品。由于分布式系統中一致性處理較為困難,其他的分布式系統沒有必要 費勁重復造輪子,故隨后的分布式系統中大量應用了zookeeper,以至于zookeeper成為了各種分布式系統的基礎組件,其地位之重要,可想而知。著名的hadoop,kafka,dubbo 都是基于zookeeper而構建。

要想理解zookeeper到底是做啥的,那首先得理解清楚,什么是一致性。

所謂的一致性,實際上就是圍繞著“看見”來的。誰能看見?能否看見?什么時候看見?舉個例子:淘寶后臺賣家,在后臺上架一件大促的商品,通過服務器A提交到主數據庫,假設剛提交后立馬就有用戶去通過應用服務器B去從數據庫查詢該商品,就會出現一個現象,賣家已經更新成功了,然而買家卻看不到;而經過一段時間后,主數據庫的數據同步到了從數據庫,買家就能查到了。

假設賣家更新成功之后買家立馬就能看到賣家的更新,則稱為強一致性;

如果賣家更新成功后買家不能看到賣家更新的內容,則稱為弱一致性;

而賣家更新成功后,買家經過一段時間最終能看到賣家的更新,則稱為最終一致性。

更多的一致性例子可以參考文獻2,里面列舉了10種一致性的例子,如果要給一致性下個定義,可以是分布式系統中狀態或數據保持同步和一致。特別需要注意一致性跟事務的區別,可以記得學習數據庫時特別強調ACID,故而滿足ACID的數據庫能夠做事務,其中C即是一致性,因此,事務是一致性的一種特例,比起一致性更難達成。
在這里插入圖片描述
如何保證在分布式環境下數據的最終一致,這個就是zookeeper需要解決的問題。對于這些問題,有哪些挑戰,zookeeper又是如何解決這些挑戰的,下一篇文章將會主要涉及這個主題。

一些常見的解決一致性問題的方式:

  1. 查詢重試補償。對于分布式應用中不確定的情況,先使用查詢接口查詢到當前狀態,如果當前狀態不一致則采用補償接口對狀態進行重試推進,或者回滾接口對業務做回滾。典型的場景如銀行跟支付寶之間的交互。支付寶發送一個轉賬請求到銀行,如一直未收到響應,則可以通過銀行的查詢接口查詢該筆交易的狀態,如該筆交易對方未收到,則采取補償的模式進行推送。

  2. 定時任務推送。對于上面的情況,有可能一次推送搞不定,于是需要2次,3次推送。不要懷疑,支付寶內最初掉單率很高,全靠后續不斷的定時任務推送增加成功率。

  3. TCC。try-confirm-cancel。實際上是兩階段協議,第二階段的可以實現提交操作或是逆操作。

zookeeper到底能做什么?

在業界的實際應用是什么?了解這些應用,會對zookeeper能夠做的事有更直觀的認識。

hadoop:

鼻祖級應用,ResourceManager在整個hadoop中算是單點,為了實現其高可用,分為主備ResourceManager,zookeeper在其中管理整個ResourceManager。

可以想象,主備ResourceManager最初是主RM提供服務,如果一切安好,則zookeeper無用武之地。然而,總歸會出現主RM提供不了服務的情況。于是會出現主備切換的情況,而zookeeper正是為主備切換保駕護航。

先來推理一下,主備切換會出現什么問題。傳統的主備切換,可以讓主備之間維持心跳連接,一旦備機發現主機心跳檢測不到了,則自己切換為主機,原來的主機等待救援。這種方式有兩個問題,一是由于網絡抖動,負載過大等問題,備機檢測不到心跳并不能說明主機一定掛了,有可能一定時間后主機或網絡恢復,這時候主機并不知道備機已經切換為主機,2臺主機互相爭用,可能造成腦裂;二是如果一些數據集中在主機上面,則備機切換時由于同步延時勢必會損失掉一部分的數據。

如何解決這些問題?早期的方式提供了不少解決方案,比如備機一旦切換為主機,則通過電源控制直接切斷主機電源,簡單粗暴,但是此刻備機已經是單點,如果主機是因為量撐不住而掛,那備機有可能會重蹈覆轍,最終導致整個服務不可用。

zookeeper又是如何解決這個問題的呢?

  1. zookeeper作為第三方集群參與到主備節點中去,當主備啟動時會在zookeeper上競爭創建一個臨時鎖節點,爭用成功者則充當主機,其余備機

  2. 所有備機會監聽該臨時鎖節點,一旦主機與zookeeper間session失效,則臨時節點被刪除

  3. 一旦臨時節點被刪除,備機開始重新申請創建臨時鎖節點,重新爭用為主機;

  4. 用zookeeper如何解決腦裂?實際上主機爭用到節點后通過對根節點做一個ACL權限控制,則其他搶占的機器由于無法更新臨時鎖節點,只有放棄成為備機。

zookeeper使用了非常簡單又現成的方式來解決的這個問題,比起其他方案方便不少,這也是為啥zookeeper流行的原因。說白了,就是把復雜操作封裝化精簡化

dubbo:

作為業界知名的分布式soa框架,dubbo的主要的服務注冊發現功能便是由zookeeper來提供的。

對于一個服務框架,注冊中心是其核心中的核心,雖然暫時掛掉并不會導致整個服務出問題,但是一旦掛掉,整體風險就很高。考慮一般情況,注冊中心就是單臺機器的時候,其實現很容易,所有機器起來都去注冊服務給它,并且所有調用方都跟它保持長連接,一旦服務有變,即通過長連接來通知到調用方。但是當服務集群規模擴大時,這事情就不簡單了,單機保持連接數有限,而且容易故障。

作為一個穩定的服務化框架,dubbo可以選擇并推薦zookeeper作為注冊中心。其底層將zookeeper常用的客戶端zkclient和curator封裝成為ZookeeperClient。

  1. 當服務提供者服務啟動時,向zookeeper注冊一個節點

  2. 服務消費者則訂閱其父節點的變化,諸如啟動停止都能夠通過節點創建刪除得知,異常情況比如被調用方掉線也可以通過臨時節點session 斷開自動刪除得知

  3. 服務消費方同時也會將自己訂閱的服務以節點創建的方式放到zookeeper

  4. 于是可以得到映射關系,諸如誰提供了服務,誰訂閱了誰提供的服務,基于這層關系再做監控,就能輕易得知整個系統情況。

zookeeper的基本數據模型

一句話,類似linux文件系統的節點模型

在這里插入圖片描述
其節點有如下有趣而又重要的特性:

  1. 同一時刻多臺機器創建同一個節點,只有一個會爭搶成功。利用這個特性可以做分布式鎖。

  2. 臨時節點的生命周期與會話一致,會話關閉則臨時節點刪除。這個特性經常用來做心跳,動態監控,負載等動作

  3. 順序節點保證節點名全局唯一。這個特性可以用來生成分布式環境下的全局自增長id

通過zookeeper提供的原語服務,可以對zookeeper能做的事情有個精確和直觀的認識

zookeeper提供的原語服務

  1. 創建節點。

  2. 刪除節點

  3. 更新節點

  4. 獲取節點信息

  5. 權限控制

  6. 事件監聽

實際上,就是對節點的增刪查改加上權限控制與事件監聽,但是通過對這些原語的組合以及不同場景的使用,可以實現很多用法。參考文獻5

  1. 數據發布訂閱。即注冊中心,見上面dubbo用法。主要通過對節點管理做到發布以及事件監聽做到訂閱

  2. 負載均衡。見上面kafka用法

  3. 命名服務。zookeeper的節點結構天然支持命名服務,即把信息集中存儲,并以樹狀管理,方便統一查閱

  4. 分布式協調通知。協調通知實際上與發布訂閱類似,由于引入的第三方的zookeeper,實際上對很多種協調通知做了解耦,比如參考文獻4中提到的消息推送,心跳檢測等

  5. 集群管理與master選舉。通過上面的第二點特性,可以輕易得知集群機器存活狀況,從而輕松管理集群;通過上面第一點特性,可以做出master爭搶。

  6. 分布式鎖。實際上就是第一點特性的應用。

  7. 分布式隊列。實際上就是第三點特性的應用。

  8. 分布式的并發等待。類似于多線程的join問題,主任務的執行依賴于其他子任務全部執行完畢,在單機多線程里可以用join,但是分布式環境下如何實現呢。利用zookeeper,可以創建一個主任務節點,旗下子任務一旦執行完畢,則在主任務節點下掛一個子任務節點,等節點數量足夠,則認為主任務可以開始執行。

可以發現,所有的原語就是zookeeper的基礎,而其他的用法總結無非是將原語放到不同場景下的歸類罷了。

相信到這里你對zookeeper應該有個初步的了解和大致的印象了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249710.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249710.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249710.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java.lang.NumberFormatException: multiple points錯誤問題

最近項目一直會出現時間轉換報錯,一直不知道是什么問題??? java.lang.NumberFormatException: multiple pointsat sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1110)at java.lang.Double.parseDouble(Double.java:540)at java.text.Dig…

plsql查詢數據中文亂碼

在plsql中進行表數據查詢的時候,發現查詢出來的中文居然顯示為亂碼,通過查找資料解決該問題。 1、查看數據的編碼(語句:select * from v$nls_parameters) 發現顯示的語言不是我們常用的GBK模式 2、配置本機語言環境變量…

Zookeeper的功能以及工作原理

1.ZooKeeper是什么? ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現,它是集群的管理者,監視著集群中各個節點的狀態根據節點提交的反饋進行下一步合理操作。最終&#xf…

前端學習總結——CSS布局方式之傳統布局

傳統布局 傳統布局即是早期在平板電腦、智能手機等移動設備并不流行的時候使用的布局方式。 一、表格布局 例如&#xff1a;采用表格方式實現如下簡單模型的布局 &#xff08;1&#xff09;固定布局 即用具體的像素值來確定模型的寬和高等值。 HTML代碼如下所示 <tabl…

aspose word for java去除目錄文字藍色樣式以及文字下方藍色下劃線

//去除目錄文字藍色樣式以及文字下方藍色下劃線for(FieldStart field: (Iterable<FieldStart>)doc.getChildNodes(NodeType.FIELD_START, true)){if (field.getFieldType() FieldType.FIELD_HYPERLINK){FieldHyperlink hyperlink (FieldHyperlink)field.getField();//判…

[POI2007]MEG-Megalopolis

傳送門&#xff1a;嘟嘟嘟 第一反應是樹鏈剖分&#xff0c;但是太長懶得寫&#xff0c;然后就想出了一個很不錯的做法。 想一下&#xff0c;如果我們改一條邊&#xff0c;那么影響的只有他的子樹&#xff0c;只要先搞一個dfs序&#xff0c;為什么搞出這個呢&#xff1f;因為有一…

memcache在ThinkPHP中的使用1---PHP下安裝memcache

1.什么是Memcached緩存 Memcached是一套小巧、高效且成熟的內存數據庫。與普通的數據庫不同&#xff0c;Memcached存儲的數據只能是簡單的鍵值對&#xff0c;在查詢時需要根據存放的key獲取數據。 Memcached最大的特點是數據存放于內存&#xff0c;性能會比傳統文件系統高出…

【集合工具類:Collections】

集合工具類&#xff1a;Collections(1) 是針對集合進行操作的工具類(2) 面試題&#xff1a;Collection 和 Collections 的區別A:Collection 是單列集合的頂層接口&#xff0c;有兩個子接口 List 和 SetB:Collections 是針對集合進行操作的工具類&#xff0c;可以對集合進行排序…

骨骼收集器01背包

來源hdu2602 問題描述 許多年前&#xff0c;在泰迪的家鄉&#xff0c;有一個人被稱為“骨頭收藏家”。這個男人喜歡收集各種各樣的骨頭&#xff0c;比如狗狗&#xff0c;牛&#xff0c;還有他去了墳墓...... 骨頭收藏家有一個大容量的V袋&#xff0c;沿著他的收集之旅有很多骨頭…

ZooKeeper的安裝與部署

本文講述如何安裝和部署ZooKeeper。 一、系統要求 ZooKeeper可以運行在多種系統平臺上面&#xff0c;表1展示了zk支持的系統平臺&#xff0c;以及在該平臺上是否支持開發環境或者生產環境。 表1&#xff1a;ZooKeeper支持的運行平臺 | 系統 | 開發環境 | 生產環境| | Linux…

java基礎1之java語言基礎1

一、常量的概述和使用 A:什么是常量 * 在程序執行的過程中其值不可以發生改變 B:Java中常量的分類 * 字面值常量 * 自定義常量(面向對象部分講) C:字面值常量的分類 * 字符串常量 用雙引號括起來的內容 * 整數常量 所有整數 * 小數常量 所有小數 * 字符常量 …

w3c 跨域請求規范

w3c 官方跨域請求規范地址&#xff1a;https://www.w3.org/TR/cors/ 前段時間開發的一個api在IE8/9瀏覽器不能正常響應跨域請求&#xff0c;以下是解決問題中對跨域請求新的認識 1.復雜跨域 post請求在發送請求之前&#xff0c;會先發送options 請求&#xff0c;有的服務器拒絕…

python爬取豆瓣前25個影片內容的正則表達式練習

通過python正則表達式獲取豆瓣top250的第一頁的25個影片排名,影片名字,影片連接,導演,主演,上映日期,國家,劇情,評分,評價人數的內容 網頁html內容: 1 <ol class"grid_view">2 <li>3 <div class"item">4 …

JavaScript 面向對象的程序設計1

一、理解對象 1.創建一個對象&#xff0c;然后給這個對象新建屬性和方法。 ①常見的創建方式 var person new Object(); //創建一個Object 對象person.name XIE; //創建一個name 屬性并賦值person.age 20; //創建一個age 屬性并賦值person.sayName function () { //創建…

Zookeeper 使用

安裝和配置詳解 本文介紹的 Zookeeper 是以 3.2.2 這個穩定版本為基礎&#xff0c;最新的版本可以通過官網 http://hadoop.apache.org/zookeeper/來獲取&#xff0c;Zookeeper 的安裝非常簡單&#xff0c;下面將從單機模式和集群模式兩個方面介紹 Zookeeper 的安裝和配置。 單…

Asp.Net Core 工作單元 UnitOfWork UOW

Asp.Net Core 工作單元示例 來自 ABP UOW 去除所有無用特性 代碼下載 &#xff1a; 去除所有無用特性版本&#xff0c;原生AspNetCore實現 差不多 2278 行代碼&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1NoEIDSAPNr46xNHYEx9KCA 提取碼&#xff1a;570i 包含C…

網站性能優化--CRP

網站性能優化–CRP 為了把HTML、CSS和JavaScript轉化成活靈活現、絢麗多彩的網頁&#xff0c;瀏覽器需要處理一系列的中間過程&#xff0c;優化性能其實就是了解這個過程中發生了什么-即CRP(Critical Rendering Path&#xff0c;關鍵渲染路徑)。首先&#xff0c;我們從頭開始快…

Dubbo+zookeeper基礎講解

一、dubbo是什么&#xff1f; 1&#xff09;本質&#xff1a;一個Jar包,一個分布式框架,&#xff0c;一個遠程服務調用的分布式框架。 既然是新手教學&#xff0c;肯定很多同學不明白什么是分布式和遠程服務調用&#xff0c;為什么要分布式&#xff0c;為什么要遠程調用。我簡…

What Are You Talking About HDU1075

一開始我也想用map 但是處理不好其他字符。。 看了題解 多多學習&#xff01; 很巧妙 就是粗暴的一個字符一個字符的來 分為小寫字母和非小寫字母兩個部分 一但單詞結束的時候就開始判斷。 #include<bits/stdc.h> using namespace std;int main() {string a,b;map&l…

開通博客第一天

今天是開通博客第一天&#xff0c; 第一次寫博客&#xff0c;也不知道寫什么&#xff0c; 以后寫點技術文&#xff0c;把我的經驗分享給大家&#xff0c; 不對的地方請大家指正&#xff0c;一起進步。我要把我每遇到的難題以及學到的知識和技術為大家踩坑&#xff0c; 做研究。…