ZK(1)——分布式系统概念与ZK简介
1. ZK 簡介
ZK 是一種【分布式協調服務】,功能簡介:
- 配置維護
- 域名服務
- 分布式同步
- 集群管理
1.1一致性要求
- 順序一致性
- 原子性
- 單一視圖
- 可靠性
- 實時性
1.2 Session
Session 是指客戶端會話。ZK對外的服務端口默認是 2181,客戶端啟動時,首先會與ZK服務器建立一個TCP長連接,從第一次鏈接建立開始,客戶端會話的生命周期也開始了,通過這個長連接,客戶端能夠通過心跳檢測保持與服務器的有效會話,也能夠向ZK服務器發送請求并接受響應,同時還能通過該連接收到來自服務器的Watcher時間通知。
Session 的 SessionTimeout 值用來檢測一個客戶端回話的超時時間。當由于服務器壓力太大、網絡故障或是客戶端主動斷開連接等各種原因導致客戶端連接斷開時,只要在Session Timeout 規定的時間內客戶端能夠重新開始連接上集群中任意一臺服務器,那么之前創建的會話仍然有效。
1.3 zk的數據模型
ZK的文件系統采用樹形結構層次化的目錄結構,與Unix文件系統非常相似。每個目錄在ZK中叫做一個ZNode,每個ZNode擁有一個唯一的路徑標識,即名稱。ZNode可以包含數據和子ZNode(臨時節點不能有子ZNode)。ZNode中的數據可以有多個版本,所以查詢某路徑下的數據需要帶上版本號。客戶端應用可以在ZNode上設置監視器(Watcher)。
它很像是數據結構當中的樹,也很想文件系統的目錄。
樹是由節點組成,zk的數據存儲也同樣是基于節點,這種節點叫做Znode。但是不同于樹的結點,Znode的引用方式是路徑引用,類似于文件路徑:/動物/倉鼠 ; / 植物/荷花。
Znode包含了數據、子節點醫用、訪問權限等等。
- data:存儲數據信息
- ACL:記錄Znode的訪問權限,即哪些人或者哪個IP可以訪問本結點
- stat:包含Znode的各種元數據,比如:事務ID、版本號、時間戳、大小等
- child:當前節點的子節點引用,類似于二叉樹的左孩子和右孩子
ZK是為了讀多寫少的場景所設計。Znode并不是用來存儲大規模業務數據,而是用于存儲少量的狀態和配置信息,每個節點的數據最大不超過1MB。
- 中間件,提供協調服務
- 作用于分布式系統,發揮其優勢,可以為大數據服務
1.4 Watcher
ZK通過Watcher機制實現了發布訂閱模式,ZK提供了分布式數據的發布訂閱功能,一個發布者能夠讓多個訂閱者同時監聽某一主題對象,當這個主體對象狀態發生變化時,會通知所有訂閱者,使它們能夠做出相應的處理,ZK引入了Watcher機制來實現這種分布式的通知功能。ZK允許客戶端向服務端注冊一個Watcher監聽,當服務端的一些指定事件觸發這個Watcher,那么就會向指定客戶端發送一個事件通知。而這個事件通知是通過TCP長連接的Session完成的。
2. 什么是分布式系統
- 概念
- 很多臺計算機組成一個整體,一個整體一致對外,并且處理同一請求
- 內部的每臺計算機都可以相互通信(rest/rpc)
- 客戶端到服務端的一次請求到相應結束會經歷多臺計算機
分布式系統就是將原有的一個系統拆分成不同的小系統,分布式系統對客戶是不透明的。
加入我們現在有三臺機器,每臺機器跑同樣的一個應用程序。然后我們將這三臺機器通過網絡將其連接起來,構成一個系統來為用戶提供服務,用戶是不知道這個系統的具體架構的。那么,我們就可以把這個系統稱作一個分布式系統。
那么,問題來了:
【問題一】程序的運行往往依賴很多配置文件,比如數據庫地址、黑名單控制、服務地址列表等,而且有些配置信息需要頻繁地進行動態變更,這時候怎么保證所有機器共享的配置信息保持一致?
【問題二】如果有一臺機器掛掉了,其他機器如何感知這一變化并接管服務?如果用戶激增,需要增加機器來緩解壓力,如何做到不重啟集群而完成機器的添加?
【問題三】用戶數量增加或者減少,會出現有的機器資源使用率繁忙,有的卻空閑,如何讓每臺機器感知到其他機器的負載狀態從而實現負載均衡?
【問題四】在一臺機器上奧多個進行或者多個線程操作同一個資源比較簡單,因為可以有大量的狀態信息或者日志提供保證,比如進行A和B同時寫一個文件,我們可以通過加鎖的方式來實現同步。但是分布式系統怎么辦?需要一個第三方的分配鎖機制,幾百臺worker都對同一個網絡中的文件寫操作,怎么協同?還有怎么保證高效的運行?
3. 分布式系統的瓶頸
ZK的特性
-
一致性
- 數據一致性,數據按照順序分批入庫
-
原子性
- 事務要么成功要么失敗,不會局部化
-
單一視圖
- 客戶端連接集群中的任意zk結點,數據都是一致的
-
可靠性
- 每次對zk的操作狀態都會保存在服務端
-
實時性
- 客戶端可以讀取到zk服務端的最新數據
ZK身為分布式系統的協調服務,如果自身掛掉了,怎么辦呢?
為了防止單機掛掉的情況,ZK維護了一個集群。ZK的集群:
ZK Service集群是一主多從結構。
在更新數據時,首先更新到主節點(這里的結點是指服務器,不是Znode),再同步到從節點。
在讀取數據時,直接讀取任意從節點。
ZK 是一個由多個 server 組成的集群,一個leader, 多個 follower。leader 為客踐席提供讀寫服務,除了leader外其他的機器只能提供讀服務。
每一個 server 保存一份數據副本全數據一致,分布式讀 follower,寫由 leader 實時更新請求轉發,由leader實時更新請求順序進行,來自同一個client 的更新請求按其發送順序依次執行數據更新原子性,依次數據更新要么成功,要么失敗。全局唯一數據視圖,client無論連接到哪個 server, 數據視圖都是一致的實時性,在一定事件范圍內, client 能讀到最新數據。
4. ZK的應用場景
這是雅虎研究院設計ZK的初衷。利用ZK的臨時順序節點,可以輕松實現分布式鎖
利用Znode 和 Watcher,可以實現分布式服務的注冊和發現。最著名的應用就是阿里的分布式RPC框架Dubbo
Redis的分布式解決方案Codis,就利用了ZK來存放數據路由表和codis-proxy節點的元信息。同時 codis-config 發起的命令都會通過ZK同步到各個存貨的 codis-poroxy。
此外,Kafka、HBaee、Hadoop也都依靠ZK同步節點信息,實現高可用。
5. zk文件夾主要目錄介紹
- bin目錄 : 主要的一些運行命令
- conf:存放配置文件,其中我們需要修改zk.cfg
- contrib:附加的一些功能
- dist-maven: mvn 編譯后的目錄
- docs:文檔
- lib:需要依賴的jar包
- recipes:案例demo代碼
- src:源碼
6.zk.cfg 配置
- tickTime : 用于計算的時間單元。比如 session 超時: N * tickTime
- initLimit:用于集群,允許從節點連接并同步到 master 結點的初始化連接時間,以 tickTime 的倍數來表示
- syncLimit:用于集群,master主節點 與 從節點 之間發送消息,請求與應答時間長度(心跳機制)
- dataDir:必須配置,系統的快照
- dataLog:日志目錄,如果不配只會和dataDir公用
- clientPort:連接服務器的端口,默認2181。
參考并感謝
[1] https://juejin.im/post/5b037d5c518825426e024473
[2] https://blog.csdn.net/u012152619/article/details/52901319
[3] https://www.imooc.com/article/251135
總結
以上是生活随笔為你收集整理的ZK(1)——分布式系统概念与ZK简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总结:几个分布式系统架构设计原理
- 下一篇: 分布式系统设计模式(荣耀典藏版)