1. 程式人生 > >Zookeeper你應該瞭解基礎知識

Zookeeper你應該瞭解基礎知識

簡介

Apache ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,由Client和Server構成,Server提供了一致性複製和儲存服務,Client包含一個簡單的原語集,分散式應用程式可以基於它實現同步服務,配置維護和命名服務等。ZooKeeper的設計非常易於程式設計,ZooKeeper維護著一個hierarchal(層次)的名字空間,它採用樹形的資料結構,類似於標準檔案系統。因為想要從零實現一個分散式協作服務是非常難的。最常見的問題就是競爭條件和死鎖。Apache ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者。

Zookeepr的資料都存放在記憶體中(更新資料也會持久化到磁碟),所以它的吞吐量會非常高,同時延遲會很低。ZooKeeper的實現更重視high performance(高效能), highly available(高可用性), strictly ordered access(嚴格有序訪問)。Zookeeper效能方面的表現讓它能夠用於大型分散式系統,高可用性可以避免出現單點故障,嚴格有序訪問可以讓Client實現複雜的同步原語。

Zookeeper系統模型

上圖的哪些Server組成了Zookeeper服務,每個Server都知道彼此的存在。這些server在記憶體中保持著狀態的映象,還通過transaction logs和快照持久到硬碟中。只要叢集中多數Server可訪問,那麼ZooKeeper服務就可用。

Clients會連線到某一個ZooKeeper Server上。Client和Server保持一個TCP長連線,通過該TCP長連線,Client可以傳送請求,得到response,得到watch event,還有傳送心跳(客戶端和服務端通過心跳來保持連線,即session)。如果和Server的TCP長連線斷了,那麼Client就會連線到另外一個Server上。

Zookeeper是有序的:Zookeeper用stamps(數字)作為所有事務的順序。

Zookeeper是非常快的:特別是以讀為主的情況下,Zookeeper應用程式可以執行在數千臺機器上,它效能表現最佳的是在讀寫比率為10:1的情況下。

Zookeeper資料模型

ZooKeeper資料模型的結構與Unix檔案系統很類似,整體上可以看作是一棵樹,每個節點稱做一個ZNode。每個ZNode上可儲存少量資料(預設是1M, 可以通過配置修改, 通常不建議在ZNode上儲存大量的資料),下面說說Zookeeper幾個比較重要的概念:

一,Znode

1,Zookeeper節點稱為Znode,每個節點都有唯一的路徑標示。Znode分類兩類:1,普通的Znode;2,ephemeral(臨時)Znode
2,Znode維護了stat結構,裡面包含資料,ACL變更的版本號,還有時間戳去允許快取驗證和協調更新。當znode的data改變了,版本號就會增加
3,Znode可以有子節點,並且Znode可以存放資料,但是ephemeral(臨時)Znode不能有子節點。
4,Znode資料可以有多個版本,客戶端可以根據版本獲取該節點的資料。
5,如果建立ephemeral(臨時)Znode的客戶端和服務端失去連線的話,那麼該零時節點也自動刪除。
6,Znode可以自動編號。
7,Znode中可以新增watch,該watch用於監控該節點儲存的資料是否有修改,子節點目錄的變化等,一旦變化可以通知設定監控的客戶端。
8,Znode的讀寫操作都具備原子性,每個Znode都有一個訪問控制列表(ACL)來控制誰能做什麼操作。

二,Session
Client與ZooKeeper之間的通訊,需要建立一個Session,這個Session會有一個超時時間。因為ZooKeeper叢集會把Client的Session資訊持久化,所以在Session沒超時之前,Client與ZooKeeper Server的連線可以在各個ZooKeeper Server之間透明地移動。
在實際的應用中,如果Client與Server之間的通訊足夠頻繁,Session的維護就不需要其它額外的訊息了。否則,ZooKeeper Client會每T/3 ms發一次心跳給Server,如果Client 2T/3 ms沒收到來自Server的心跳回應,就會換到一個新的ZooKeeper Server上。這裡T是使用者配置的Session的超時時間。

三,Watcher
ZooKeeper支援一種Watch操作,Client可以在某個ZNode上設定一個Watcher,來Watch該ZNode上的變化。如果該ZNode上有相應的變化,就會觸發這個Watcher,把相應的事件通知給設定Watcher的Client。需要注意的是,ZooKeeper中的Watcher是一次性的,即觸發一次就會被取消,如果想繼續Watch的話,需要客戶端重新設定Watcher。

四,事務日誌和快照

dataDir目錄指定了Zookeeper的資料目錄,用於儲存Zookeeper的快照檔案(snapshot)。

dataLogDir定義了Zookeeper的事務日誌目錄,目錄存放Zookeeper的事務日誌,正常情況下,所有的更新操作在返回客戶端更新成功前,Zookeeper肯定已經將本次更新操作寫入到事務日誌了(即磁碟中)。事務日誌的檔名是log.,zxid是寫入這個檔案的第一個事務id。在完成若干次事務後會一次資料快照,將當前Server上所有節點的狀態以快照檔案的形式dump到磁碟上去,即snapshot檔案。

Zookeeper角色

Zookeepr角色分可以分為四類:

角色
描述
Leader
領導者負責進行投票的發起和決議,更新系統狀態
Follower 1,Follower負責接收Client請求,並向客戶端返回結果 2,在選Leader的過程中參與投票
Observer ObServer可以接收客戶端的連線,將寫請求轉發到Leader節點,但是ObServer不參與投票和選舉,僅僅接收投票和選舉的結果。它的作用主要是用來擴充套件系統,提高讀取的速度。ObServer是zookeeper-3.3.0新加的角色。
Client 請求發起方

Server的狀態可以分為如下四種:

leading:當前Server為Leader。

following:當前Server為Follower。

observing:當前Server為Observer。

looking:當前Server不知道leader是誰,正在搜尋。

Zookeeper特性

順序一致性:按照客戶端傳送請求的順序更新資料。Zookeeper是不屬於強一致性,因為watcher沒辦法撲捉到每次的變化。
原子性:更新要麼成功,要麼失敗,不會出現部分更新。
單一系統映像 :無論客戶端連線哪個server,都會看到同一個檢視。
可靠性:具有簡單、健壯、良好的效能,如果訊息被到一臺伺服器接受,那麼它將被所有的伺服器接受。
時效性:Zookeeper保證客戶端將在一個時間間隔範圍內獲得伺服器的更新資料,或者伺服器失效的資訊。但由於網路延時等原因,Zookeeper不能保證兩個客戶端能同時得到剛更新的資料,如果需要最新資料,應該在讀資料之前呼叫sync()介面。

ZooKeeper原理

Zookeeper的核心是原子廣播,通過Zab協議保證各個Server之間資料的同步。Zab協議有兩種模式,分別是恢復模式(選舉Leader)和廣播模式(同步)。服務啟動或者Leader崩潰後,Zab就會進入了恢復模式,當Leader被選舉出來,且大多數Server完成了和leader的狀態同步以後,恢復模式就結束了。狀態同步保證了Leader和Server具有相同的系統狀態。

為了保證事務的順序一致性,Zookeeper採用了遞增的事務id號(zxid)來標識事務。所有的提議(proposal)都在被提出的時候加上了zxid。實現中zxid是一個64位的數字,它高32位是epoch用來標識leader關係是否改變,每次一個leader被選出來,它都會有一個新的epoch,標識當前屬於那個leader的統治時期。低32位用於遞增計數。

每個Server在工作過程中有四種狀態:
    LOOKING:當前Server不知道leader是誰,正在搜尋。
    LEADING:當前Server即為選舉出來的leader。
    FOLLOWING:leader已經選舉出來,當前Server與之同步。
    OBSERVING:不選舉,只從Leader同步狀態。

Zookeeper API

Zookeeper的一個設計目標是提供簡單的程式設計介面,僅僅支援如下操作:

create:建立一個Znode。path是其路徑,data是要儲存在該Znode上的資料,createMode包括:PERSISTEN,PERSISTENT_SEQUENTAIL,EPHEMERAL,EPHEMERAL_SEQUENTAIL。

delete:刪除一個Znode。可以刪除指定版本的Znode,如果version設定為-1的話,就刪除所有的版本。

exists:判斷Znode是否存在,設定是否Watch這個Znode。

get data:讀取指定Znode上的資料,並設定是否watch這個Znode。

set data:更新指定Znode的資料,並設定是否Watch這個Znode。

get children:更新指定ZNode的資料,並設定是否Watch這個Znode。

sync:把sync之前的更新操作都同步過來。

set acl:設定指定ZNode的Acl資訊

get acl:獲取指定ZNode的Acl資訊

其他

讀、寫(更新)模式:
Zookeeper叢集中,客戶端可以從任意一個ZooKeeper伺服器讀取,這一特點保證了ZooKeeper有比較好的讀效能;

寫的請求會先Forwarder到Leader,然後由Leader來通過ZooKeeper中的原子廣播協議,將請求廣播給所有的Follower,Leader收到一半以上的寫成功的Ack後,就認為該寫成功了,就會將該寫進行持久化,並告訴客戶端寫成功了。

WAL(Write-Ahead-Log)和Snapshot:
ZooKeeper也有WAL,每一個更新操作,ZooKeeper都會先寫WAL,然後再對記憶體中的資料做更新,最後向Client通知更新結果。

ZooKeeper還會定期將記憶體中的目錄樹進行Snapshot,落地到磁碟上。其實跟HDFS中的fsimage和edits log是類似的。這麼做的主要目的,一當然是資料的持久化,二是加快重啟之後的恢復速度,如果全部通過Replay WAL的形式恢復的話,會比較慢。

FIFO:
對於每一個ZooKeeper客戶端而言,所有的操作都是遵循FIFO順序的,這一特性是由下面兩個基本特性來保證的:

一是ZooKeeper Client與Server之間的網路通訊是基於TCP,TCP保證了Client/Server之間傳輸包的順序;

二是ZooKeeper Server執行客戶端請求也是嚴格按照FIFO順序的。

線性化:
ZooKeeper包括全域性有序和偏序兩種:

全域性有序是針對伺服器端。例如:在一臺伺服器上訊息A在訊息B前釋出,那麼所有伺服器上的訊息A都將在訊息B前被髮布;

偏序是針對客戶端。例如:在同一個客戶端傳送訊息B在訊息A後釋出,那麼執行的順序必將是先執行訊息A然後在是訊息B;

所有的更新操作都有嚴格的偏序關係,更新操作都是序列執行的,這一點是保證ZooKeeper功能正確性的關鍵。

使用場景

1,資料釋出與訂閱

2,名空間服務

3,分散式通知/協調

4,分散式鎖

5,叢集管理

等等。。。

參考:

相關推薦

Zookeeper應該瞭解基礎知識

簡介 Apache ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,由Client和Server構成,Server提供了一致性複製和儲存服務,Client包含一個簡單的原語集,分散式應用程式可以基於它實現同步服務,配置維護和命名服務等。ZooKeepe

【Camera專題】應該瞭解的Camera HW-硬體知識

一.吐槽 作為一個雞凍工程師,呸,打錯了,是驅動工程師,最基本的硬體基礎知識你必須得懂吧。 舉個栗子【敲黑板,重點來了啊】 1.你要點亮Camera,你得知道你用的是什麼介面的,是MIPI的還是Parallel的? 2.資料傳輸有哪些方式? 3.Camera 的成像原理是什麼? 等等 說點題外話

《在主備線路場景下—Track結合SLA的使用實踐》—那些應該知道的知識(八)

寫在前面: 在之前的一篇文章中,我們已經講過Eigrp是如何計算重分佈路由的metric值的過程。在實際生產環境中,我們常常會針對重要的外聯單位,部署兩條運營商線路以保障業務的連續性。由於對端外聯單位的特殊情況,常常不允許我們配置動態路由協議,以實現線路的自動切換,我們可能只能通過配置靜態路由實

《EIGRP路由開銷—Metric的計算》—那些應該知道的知識(七)

寫在前面: EIGRP協議為思科私有協議,僅支援在思科裝置間部署。EIGRP具有收斂快,支援非等價負載均衡等特點。 知識準備: EIGRP路由開銷—Metric的計算,也就是metric值的計算,共涉及5個相關引數變數。分別是: MTU、BW、DLY、Reliability、tx

《OWASP—網路安全攻防初體驗》—那些應該知道的知識(六)

宣告:本次實踐是基於專用獨立環境開放給安全人員實踐使用,都是一些常見的漏洞,這些漏洞一般都廣為人知,所以你很難在現實中使用,博主寫這篇文章的用意也絕不在於次,在此宣告! 寫在前面: 近期,有幸參加了一次網路安全攻防技能實踐培訓。第一次接觸該領域,很多理論知識還很缺失,本篇文章將針對課程中介紹

《Linux centos NTP的配置方法》—那些應該知道的知識(五)

寫在前面: 在NTP改造的過程中,會涉及到NTP客戶端裝置的NTP配置的修改。不同的作業系統有不同的配置方法,在實際NTP取時的行為過程中也有些許差異,本文將重點闡述Linux centos 作業系統NTP服務的配置方法、不同配置間的差異以及其他值得我們注意的相關技術細節。

運維人,應該瞭解的三張武功心法圖

一、運維技能圖 做為一個運維工程師,你知道你應該學習什麼?怎麼學習嗎?朝哪個方向發展嗎?下面一張運維工程師技能圖,讓你瞭解! 二、自動化運維路線圖 運維自動化在國內已經聲名遠躁了,隨著網際網路快速的發展,運維不單單是幾個指令碼,幾個文件可以勝任的!DevOps在國內很受熱捧,但是真正的自動化之路

作為php程式設計師應該瞭解php知識點

1. 簡述php中的autoload在PHP中使用類時,我們必須在使用前載入進來,不管是通過 require 的方式還是 include 的方式,但是會有兩個問題影響我們做出載入的決定。首先是不知道這個類檔案存放在什麼地方,另外一個就是不知道什麼時候需要用到這個檔案。特別是專

區塊鏈?人工智慧?2018 年應該瞭解的十大技術趨勢

來自:開源中國 https://my.oschina.net/editorial-story/blog/1552089 摘要: 領先的研究和諮詢公司Gartner最近分享了2018年值得關注的十大技術趨勢,作為網際網路人的我們不妨關注一下。 技術正在逐漸改變我們生活和工作的方式,在過去的十年

應該瞭解的大資料10個新趨勢

當今科技領域發生了巨大的變化,也為大資料改善各行各業的業務、促進經濟增長打開了大門。資料能幫助組

java8,應該瞭解的新特性(空指標終結者:Optional 類)

1、java.lang.NullPointerException是最常見也是最令人討厭的一種異常,如果一個物件可能為null,在呼叫其方法之前必須進行非空檢查,否則就會引發java.lang.NullPointerException。但是,很多物件永遠都不會為n

Android 作業系統必須瞭解知識

Android 是運行於Linux kernel之上,但並不是GNU/Linux。因為在一般GNU/Linux 裡支援的功能,Android 大都沒有支援,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以Bionic 取代Glibc、以Skia 

關於Android strings.xml-應該瞭解的幾個原則

但是說不定什麼時候你使用不同的string了,這時你就需要重新建立兩個新的string,而且還要修改java程式碼。如果一開始你就使用兩個string的話,你需要修改的就只有strings.xml檔案。 res/values/strings.xml 2. 你永遠不

這份Python標準異常表 應該瞭解

異常即是一個事件,該事件會在程式執行過程中發生,影響了程式的正常執行。一般情況下,在Python無法正常處理程式時就會發生一個異常。異常是Python物件,表示一個錯誤。 小編給大家推薦一個學習氛圍超好的地方,python交流企鵝裙:【611+530+101】適合在校大

學習彙編前應該知道的知識

C:\>debug -d 40:0 0040:0000  F8 03 F8 02 E8 03 E8 02-BC 03 78 03 78 02 80 9F  ..........x.x... 0040:0010  22 C8 00 80 02 28 00 00-00 00 2A 00 2A 00 2

關於 JDK 9 中的 JShell,應該瞭解的 10 件事

開發十年,就只剩下這套架構體系了! >>>   

或許是應該瞭解的一些 ASP.NET Core Web API 使用小技巧

 一、前言   在目前的軟體開發的潮流中,不管是前後端分離還是服務化改造,後端更多的是通過構建 API 介面服務從而為 web、app、desktop 等各種客戶端提供業務支援,如何構建一個符合規範、容易理解的 API 介面是我們後端開發人員需要考慮的。在本篇文章中,我將列舉一些我在使用 ASP.

關於C#非同步程式設計應該瞭解的幾點建議

前段時間寫了一篇關於C#非同步程式設計入門的文章,你可以點選《C#非同步程式設計入門看這篇就夠了》檢視。這篇文章我們來討論下關於C#非同步程式設計幾個不成文的建議,希望對你寫出高效能的非同步程式設計程式碼有所幫助。注:本文的很多內容都是學習《Effective C#》的總結。 作者:依樂祝 原文地址:htt

應該瞭解的 Java SPI 機制

前言 不知大家現在有沒有去公司復工,我已經在家辦公將近 3 周了,同時也在家呆了一個多月;還好工作並沒有受到任何影響,我個人一直覺得遠端工作和 IT 行業是非常契合的,這段時間的工作效率甚至比在辦公室還高,同時由於我們公司的業務在海外,所以疫情幾乎沒有造成太多影響。 扯遠了,這次主要是想和大家分享一下 J

CSS 中應該瞭解的 BFC

我們常說的文件流其實分為定位流、浮動流和普通流三種。而普通流其實就是指BFC中的FC。FC是formatting context的首字母縮寫,直譯過來是格式化上下文,它是頁面中的一塊渲染區域,有一套渲染規則,決定了其子元素如何佈局,以及和其他元素之間的關係和作用。常見的FC有BFC、IFC,還有GFC和FFC