正式介紹 ZooKeeper 之前,我們先來看看 ZooKeeper 的由來,還挺有意思的。
下面這段內容摘自《從 Paxos 到 ZooKeeper 》第四章第一節,推薦大家閱讀一下:
ZooKeeper 最早起源於雅虎研究院的一個研究小組。在當時,研究人員發現,在雅虎內部很多大型系統基本都需要依賴一個類似的系統來進行分布式協調,但是這些系統往往都存在分布式單點問題。所以,雅虎的開發人員就試圖開發一個通用的無單點問題的分布式協調框架,以便讓開發人員將精力集中在處理業務邏輯上。
關於“ZooKeeper”這個項目的名字,其實也有一段趣聞。在立項初期,考慮到之前內部很多項目都是使用動物的名字來命名的(例如著名的 Pig 項目),雅虎的工程師希望給這個項目也取一個動物的名字。時任研究院的首席科學家 RaghuRamakrishnan 開玩笑地說:“在這樣下去,我們這兒就變成動物園了!”此話一出,大家紛紛錶示就叫動物園管理員吧一一一因為各個以動物命名的分布式組件放在一起,雅虎的整個分布式系統看上去就像一個大型的動物園了,而 ZooKeeper 正好要用來進行分布式環境的協調一一於是,ZooKeeper 的名字也就由此誕生了。
ZooKeeper 是一個開源的分布式協調服務,它的設計目標是將那些複雜且容易出錯的分布式一致性服務封裝起來,構成一個高效可靠的原語集,並以一系列簡單易用的接口提供給用戶使用。
原語: 操作系統或計算機網絡用語範疇。是由若幹條指令組成的,用於完成一定功能的一個過程。具有不可分割性·即原語的執行必須是連續的,在執行過程中不允許被中斷。
ZooKeeper 為我們提供了高可用、高性能、穩定的分布式數據一致性解决方案,通常被用於實現諸如數據發布/訂閱、負載均衡、命名服務、分布式協調/通知、集群管理、Master 選舉、分布式鎖和分布式隊列等功能。
另外,ZooKeeper 將數據保存在內存中,性能是非常棒的。 在“讀”多於“寫”的應用程序中尤其地高性能,因為“寫”會導致所有的服務器間同步狀態。(“讀”多於“寫”是協調服務的典型場景)。
ZooKeeper 概覽中,我們介紹到使用其通常被用於實現諸如數據發布/訂閱、負載均衡、命名服務、分布式協調/通知、集群管理、Master 選舉、分布式鎖和分布式隊列等功能。
下面選 3 個典型的應用場景來專門說說:
實際上,這些功能的實現基本都得益於 ZooKeeper 可以保存數據的功能,但是 ZooKeeper 不適合保存大量數據,這一點需要注意。
破音:拿出小本本,下面的內容非常重要哦!
ZooKeeper 數據模型采用層次化的多叉樹形結構,每個節點上都可以存儲數據,這些數據可以是數字、字符串或者是二級制序列。並且。每個節點還可以擁有 N 個子節點,最上層是根節點以“/”來代錶。每個數據節點在 ZooKeeper 中被稱為 znode,它是 ZooKeeper 中數據的最小單元。並且,每個 znode 都一個唯一的路徑標識。
强調一句:ZooKeeper 主要是用來協調服務的,而不是用來存儲業務數據的,所以不要放比較大的數據在 znode 上,ZooKeeper 給出的上限是每個結點的數據大小最大是 1M。
從下圖可以更直觀地看出:ZooKeeper 節點路徑標識方式和 Unix 文件系統路徑非常相似,都是由一系列使用斜杠"/"進行分割的路徑錶示,開發人員可以向這個節點中寫人數據,也可以在節點下面創建子節點。這些操作我們後面都會介紹到。
介紹了 ZooKeeper 樹形數據模型之後,我們知道每個數據節點在 ZooKeeper 中被稱為 znode,它是 ZooKeeper 中數據的最小單元。你要存放的數據就放在上面,是你使用 ZooKeeper 過程中經常需要接觸到的一個概念。
我們通常是將 znode 分為 4 大類:
/node1/app0000000001
、/node1/app0000000002
。每個 znode 由 2 部分組成:
這份《“java高分面試指南”-25分類227頁1000+題50w+字解析》同樣可分享給有需要的朋友,感興趣的夥伴們可挑戰一下自我,在不看答案解析的情况,測試測試自己的解題水平,這樣也能達到事半功倍的效果!(好東西要大家一起看才香)
CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】