不羨鴛鴦不羨仙,一行代碼調半天。原創:小姐姐味道(微信公衆號ID:xjjdog),歡迎分享,轉載請保留出處。

我個人是非常不喜歡這個組件的,因爲它的代碼虐過我。引入一個Netty就可以輕易實現的網絡功能,非要自己在代碼裏摳 NIO ,代碼讓人看的雲裏霧裏。

另外,Zookeeper的擴容和縮容,也曾經讓我的團隊喫過虧,丟了不少數據。用不好的東西,對它印象就不好,所幸它老了,我也很少用它了。

關於它的客戶端使用問題,看xjjdog這篇文章就可以了。

《ZK客戶端Curator使用詳解》

1. 什麼是 ZooKeeper

ZooKeeper是一個分佈式的協調系統,應用非常廣泛。它原是 Hadoop 的一個子項目,目前是 Apache 基金會的頂級項目。像我們常用的微服務框架 SpringCloud、Dubbo 等,就可以採用 Zookeeper 作爲它的註冊中心。

除了作爲註冊中心,它還有非常多的使用場景,包括:命名服務、分佈式協調/通知、選舉、分佈式鎖、分佈式隊列、負載均衡、配置服務等。

既然 ZooKeeper 談到自己是一個分佈式系統,那它就離不開 CAP 理論,

2. 什麼是CAP理論

CAP理論,指的是在一個分佈式系統中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區容錯性),三者不可兼得。下面介紹一下這三個概念:

  • 一致性(C):在分佈式系統的不同節點或者備份中,同一時刻是否是一樣的值。比如 MySQL 的主從節點,由於 binlog 複製存在時差,可能在從機上讀到的數據和在主機上的不一致。

  • 可用性(A):在集羣中一部分節點故障後,集羣整體是否還能響應客戶端的讀寫請求。

  • 分區容忍性(P):集羣的分區數量多了,必然會在一致性和可用性上有一些問題。以實際效果而言,分區相當於對通信的時限要求。系統如果不能在一定時間內達成數據一致性,就意味着發生了分區的情況。

分佈式系統,因爲P是必須的,大多會在C和A之間做出選擇。而 ZooKeeper ,就是一個傾向於 CP 的,強一致性的分佈式系統。

所以我們要記住這一點,ZooKeeper 的一致性特別強,對於數據一致性要求較高的場景,ZooKeeper都可以有它的用武之地。

同時,我們也應該認識到。ZooKeeper 不能保證每次服務請求的可用性 ,在極端環境下,ZooKeeper可能會丟棄一些請求,消費者程序需要重新請求才能獲得結果。

從官方的架構圖就可以看到,不同的客戶端,連接到 ZooKeeper 集羣中的不同機器,所看到的數據,都是一致的,這也是它強一致性的由來。

3. ZooKeeper的使用場景

3.1 註冊、配置中心

像 Spring Cloud、Dubbo 等服務節點的信息,比如機器列表等,一般數據集都比較小,但是一致性卻要求非常的高,而且數據經常會發生變動,這是非常適合 ZooKeeper 的一種場景。

通過將這樣的信息發佈到 ZooKeeper上,那麼這些數據一旦有變動,應用節點可以獲得獲取數據的 一致視圖

3.2 分佈式協調/通知

ZooKeeper有 Watcher註冊異步通知 機制,可以在不同的服務節點,甚至是不同的系統間進行協調。這非常像傳統消息隊列中的 Pub/Sub 機制,但由於 ZooKeeper的實時性,加上數據強一致性,使得數據的分發變的非常可靠。

3.3 選舉

所謂的選舉,就是在衆多的服務節點中,選舉出一個具有最終決定權的領導,這在服務集羣中,一般稱爲Master。比如,一項服務需要對外暴露接口,但是要保證這個服務的高可用。當正在服務的節點當機之後,需要採用選舉功能,從備份的機制中,選擇出一臺來,繼續進行服務。剩餘的機器,則稱爲這臺被選舉機器的備份。

3.4 分佈式鎖

分佈式鎖,是爲了協調分佈式環境下的共享資源而設定的鎖。比如,你有一個定時服務有兩個節點,但要求在執行時只有一個節點進行業務邏輯的計算。這時候,任務就變成了共享資源,在獲取任務的時候,就可以採用互斥的手段來保證彼此之間的干擾,保證一致性。

3.5 分佈式隊列

ZooKeeper 也可以實現分佈式隊列,比如對 一批 任務的執行,先處理完前面的任務,再處理後面的任務。這個時候,就可以將任務信息存放到 ZooKeeper中。

它與消息隊列的隊列概念相似,但比較適合小批量的、有嚴格順序的任務。

4. 相似組件

ZooKeeper 是基於 ZAB 協議構建的,這個協議和 Paxos 協議有些相似。由於這些協議太複雜了,後續又有了基於 Raft 協議的 Etcd 和 Consul。ZooKeeper 是基於Java語言開發的,而後兩者是使用 Golang 開發的。

Etcd 和 Consul 作爲後起之秀,在功能和性能方面要優於 ZooKeeper,它們都是 CP 的系統,使用上區別不大。

在 Java 生態裏,使用 ZooKeeper 更多一些。考慮到周邊建設和產品生態問題,在Java 企業級應用中, ZooKeeper 的作用還非常大。

End

哪一天我再用它,那絕對只是工作需要,而不是興趣使然。這也證明了我對它根本就不精通,雖然也買書看了一點點,但千萬不要留言問我相關技術問題。

作者簡介: 小姐姐味道 (xjjdog),一個不允許程序員走彎路的公衆號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高併發世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進一步交流。

後臺回覆“ 加羣 ”,帶你進入高手如雲交流羣

推薦閱讀:

相關文章