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