Zookeeper 簡介
1. 前言
大家好,今天我們來介紹一個在分布式環境中經常使用的技術—— Apache Zookeeper 。Apache ZooKeeper 是 Apache Software Foundation 下的開源志愿者項目。接下來我們主要來介紹一下 Zookeeper 是什么?它有什么作用?以及我們為什么要學習 Zookeeper。
2. 什么是 Zookeeper
什么是 Zookeeper 呢?我們先來看一下 Zookeeper 的官網介紹:
原文直接翻譯過來的概念很抽象,那我們簡單的解釋一下。在分布式環境中,存在著大量的服務,服務與服務之間難以做到彼此協調,也不便于開發人員對服務進行維護管理,而 Zookeeper 使用它簡單的結構和 API ,協調服務與服務之間的關系,讓開發人員專注于應用程序的核心業務邏輯,更方便的對應用程序的服務進行管理維護。
所以我們可以把 Zookeeper 叫做分布式協調服務。
簡單介紹了 Zookeeper 是什么,接下來我們就來了解一下 Zookeeper 具體的應用場景。
3. Zookeeper 的應用
- 服務注冊與發現
當我們的分布式系統增加了一個服務,我們只需要利用 Znode 和 Watcher,讓它注冊到 Zookeeper 中,我們就可以很方便的對這個服務進行管理; - 分布式鎖
為了防止在分布式環境下,服務中多個進程之間互相干擾,我們可以用 Zookeeper 的臨時順序節點實現分布式鎖,對這些進程進行調度,讓它們順序執行; - 配置管理
我們可以把核心的配置文件交給 Zookeeper 管理。當我們修改配置文件時,Zookeeper 就會把配置文件的信息同步到集群中的所有節點中去。
那么 Zookeeper 是依靠什么來實現這些功能的呢?接下來我們來關注 Zookeeper 有什么特點。
4. Zookeeper 的特點
- 在分布式環境下,Zookeeper 的部署方式為一主( Leader )多從( Follower )的集群方式,只要半數以上的節點(包括 Leader 節點)存活,Zookeeper 集群就能正常服務。就算是 Leader 節點掛掉了,Zookeeper 也會進行崩潰恢復,所說 Zookeeper 集群本身是高可用的;
- Zookeeper 集群的數據具有全局一致性。也就是說,無論客戶端連接到 Zookeeper 集群的哪一個從節點,獲取的數據都是一致的;
- 在 Zookeeper 集群節點進行數據同步更新時,要么全部成功,要么全部失敗。所以 Zookeeper 的數據更新具有原子性;
- 在同一個客戶端對 Zookeeper 節點進行更新請求操作時,會根據發送的順序依次去執行;
- 由于 Zookeeper 能存儲的數據量非常小,所以數據的同步更新也會非??臁R簿涂梢哉f在一定時間段內,客戶端獲取的數據是實時的。
根據上面的特點,我們可以了解到 Zookeeper 在分布式環境中的作用還是非常強大的。所以我們還是有必要去學習一下 Zookeeper 的。
說了這么多 Zookeeper 的功能,那它與其他類似功能的技術相比較有什么區別呢?接下來我們用 Zookeeper 和其他技術進行一下比較。
5. Zookeeper 與其他技術的比較
-
Zookeeper 與 Redis 分布式鎖比較
除了 Zookeeper 可以實現分布式鎖之外,我們還可以使用高性能緩存技術 Redis 來實現,我們來比較一下它們的優缺點。分布式鎖 優點 缺點 Zookeeper 1. 功能已經封裝,實現簡單 2. 有等待鎖的隊列,提升了搶鎖的效率 添加和刪除節點性能較低 Redis Set 和 Del 指令的性能高 1. 實現較復雜,需要考慮超時、原子性、誤刪的情況 2. 沒有等鎖隊列,只能通過客戶端自旋來等鎖,效率低下 -
Zookeeper 與 Eureka 的比較
Eureka 是 Spring Cloud 微服務架構的分布式注冊中心。
在進行比較之前,我們來了解一下 CAP 定理。什么是 CAP 定理呢?- C : Consistent ,一致性,需要保證數據的一致性。
- A : Availability ,可用性,需要保證服務的可用性。
- P : Partition tolerance ,分區容錯性,服務對網絡分區故障的容錯性。
在 CAP 這個定理中,任何分布式系統都只能保證其中兩條。那么 Zookeeper 和 Eureka 又是保證的哪兩條呢?
分布式注冊中心 優點 缺點 Zookeeper (保證 CP) 新的服務注冊時會同步到其他節點,保證了節點數據的一致性 為了保證一致性,在 Leader 選舉階段服務不能注冊,失去了可用性 Eureka (保證 AP) Eureka 的各個節點是平等的,只要有一個節點存在,就可以提供服務 新服務注冊時,不會把數據同步到其他節點上,失去了數據一致性
6. 學習 Zookeeper 的必要條件
想要學習 Zookeeper ,我們必須有以下技能:
- Java :Zookeeper 是基于 Java 語言開發的,這是學習 Zookeeper 最基本的要求;
- Linux :Zookeeper 一般都是部署在 Linux 上的,所以我們需要知道如何操作 Lunix ,以及如何部署 Zookeeper ;
- 分布式開發:Zookeeper 作為分布式環境中重要的組件,我們必須了解什么是分布式項目,如何去開發分布式項目,以及分布式的項目會遇到什么問題。
7. 課程設計思路
在 Zookeeper 的課程中,我們的學習路線從 Zookeeper 的基礎知識入門,到簡單使用 Zookeeper ,再到 Zookeeper 的實現原理,最后使用 Zookeeper 進行應用實戰,一步一步從入門到 Zookeeper 應用高手。以下是 Zookeeper 課程的學習路線:
- Zookeeper 基礎入門:
包括 Zookeeper 的數據模型,Zookeeper 安裝及部署,以及兩種 Zookeeper 的 Java 客戶端的初步使用,有了扎實的基礎我們才能深入學習它的實現原理; - Zookeeper 實現原理:
包括 Zookeeper 通信原理,Zookeeper 監聽機制,Zookeeper ACL,Zookeeper 序列化方式,Zookeeper ZAB 協議。其中重點是 Zookeeper ZAB 協議,包括兩種運行模式:崩潰恢復模式和消息廣播模式。了解了 Zookeeper 的實現原理,我們才能更好的來使用 Zookeeper; - Zookeeper 應用實戰:
在 Zookeeper 實戰內容中,我們使用 Zookeeper 實現了分布式鎖、分布式 ID、負載均衡、配置中心、集群管理等,學習了如何使用了高效的部署方式 —— Docker 來構建我們的 Zookeeper 集群,以及如何對 Zookeeper 的 Java 進程和運行狀態進行監控,最后我們還學習了在 Kafka 和 Dubbo 兩大框架中是如何使用 Zookeeper 的。
相信通過這些內容的學習,同學們一定會熟練的掌握 Zookeeper,并使用 Zookeeper 解決在實際的開發中遇到的分布式環境所帶來的問題。
8. 小結
本節課程我們主要了解了 Zookeeper 是什么,Zookeeper 的特點。我們來對本節內容進行總結:
- Zookeeper 是一種分布式協調服務。
- Zookeeper 的應用有服務注冊與發現,分布式鎖,配置管理。
- Zookeeper 的特點:集群的高可用性,數據的一致性、原子性,執行的順序性,實時性。
- Zookeeper 優缺點:Zookeeper 是 CP 系統,在保證數據一致性的同時,不能保證服務注冊的高可用。