zookeeper是乙個分布式協調服務的開源框架。主要用來解決分布式集群中應用系統的一致性問題。
zookeeper
本質上是乙個分布式的小檔案儲存系統
。提供基於類似於檔案系統的目錄樹方式的資料儲存,並且可以對樹中的節點進行有效管理。從而用來維護和監控你儲存的資料的狀態變化。通過監控這些資料狀態的變化,從而可以達到基於資料的集群管理。諸如:統一命名服務、分布式配置管理、分布式訊息佇列、分布式鎖、分布式協調等功能。
全域性資料一致:每個 server 儲存乙份相同的資料副本,client 無論連線到哪個server,展示的資料都是一致的,這是最重要的特徵;
可靠性:如果訊息被其中一台伺服器接受,那麼將被所有的伺服器接受。
順序性:包括全域性有序和偏序兩種:全域性有序是指如果在一台伺服器上訊息a在訊息b前發布,則在所有server上訊息a都將在訊息b前被發布;偏序是指如果乙個訊息b在訊息a後被同乙個傳送者發布,a必將排在b前面。
資料更新原子性:一次資料更新要麼成功(半數以上節點成功),要麼失敗,不存在中間狀態;
實時性:zookeeper 保證客戶端將在乙個時間間隔範圍內獲得伺服器的更新資訊,或者伺服器失效的資訊。
zookeeper 的資料模型,在結構上和標準檔案系統的非常相似,擁有乙個層次的命名空間,都是採用樹形層次結構,zookeeper 樹中的每個節點被稱為— znode。和檔案系統的目錄樹一樣,zookeeper樹中的每個節點可以擁有子節點。
但也有不同之處:
znode 兼具檔案和目錄兩種特點。既像檔案一樣維護著資料、元資訊、acl、 時間戳等資料結構,又像目錄一樣可以作為路徑標識的一部分,並可以具有子znode。使用者對znode具有增、刪、改、查等操作(許可權允許的情況下)。
znode 具有原子性操作,讀操作將獲取與節點相關的所有資料,寫操作也將替換掉節點的所有資料。另外,每乙個節點都擁有自己的 acl(訪問控制列表),這個列表規定了使用者的許可權,即限定了特定使用者對目標節點可以執行的操作。
znode 儲存資料大小有限制。zookeeper 雖然可以關聯一些資料,但並沒有被設計為常規的資料庫或者大資料儲存,相反的是,它用來管理排程資料,比如分布式應用中的配置檔案資訊、狀態資訊、匯集位置等等。這些資料的共同特性就是它們都是很小的資料,通常以kb為大小單位。zookeeper的伺服器和客戶端都被設計為嚴格檢查並限制每個znode的資料大小至多1m,當時常規使用中應該遠小於此值。
znode通過路徑引用,如同unix中的檔案路徑。路徑必須是絕對的,因此他們必須由斜槓字元來開頭。除此以外,他們必須是唯一的,也就是說每乙個路徑只有乙個表示,因此這些路徑不能改變。在 zookeeper 中,路徑由 unicode 字串組成,並且有一些限制。字串"/zookeeper"用以儲存管理資訊,比如關鍵配額資訊。
1. znode有兩種,分別為臨時節點和永久節點。
2. 節點的型別在建立時即被確定,並且不能改變。
1. zookeeper
預設的演算法是fastleaderelection,採用投票數大於半數則勝出的邏輯。
好了,zookeeper就簡單描述到這裡,現在我們需要知道的是,zookeeper是多伺服器集群,客戶端任意訪問一台就可操作該集群所共享的資料,那麼我們該怎樣避免同時操作同一資料造成髒讀的問題呢?
這就需要用到分布式鎖了!
1.保持獨佔:就是所有試圖來獲取這個鎖的客戶端,最終只有乙個可以成功獲得這把鎖。通常的做法是把zk上的乙個znode看作是一把鎖,通過create znode的方式來實現。所有客戶端都去建立 /distribute_lock 節點,最終成功建立的那個客戶端也即擁有了這把鎖。(同一路徑下不能存在兩個相同的節點)
2.控制時序,就是所有試圖來獲取這個鎖的客戶端,最終都是會被安排執行,只是有個全域性時序了。(大意就是建立/distribute_lock節點為乙個臨時序列化節點,這樣,每個客戶端建立的節點都會有一串數字標識大小,根據大小排序依次執行)
zookeeper分布式鎖
方案1 演算法思路 利用名稱唯一性,加鎖操作時,只需要所有客戶端一起建立 test lock節點,只有乙個建立成功,成功者獲得鎖。解鎖時,只需刪除 test lock節點,其餘客戶端再次進入競爭建立節點,直到所有客戶端都獲得鎖。特點 這種方案的正確性和可靠性是zookeeper機制保證的,實現簡單。...
zookeeper分布式鎖
zookeeper節點有4個型別 1.持久型 2.瞬時型 3.持久自動排序型 4.瞬時自動排序型 分布式鎖利用的就是zookeeper中瞬時自動排序型節點特性。一 瞬時自動排序節點 瞬時特點為,當客戶端斷開連線的時候,該節點自動消除。自動排序則為,如果節點名字重複,則自動在該節點名字後新增數字,該數...
zookeeper 分布式鎖
分布式鎖肯定是用在分布式環境下。在分布式環境下,使用分布式鎖的目的也是保證同一時刻只有乙個執行緒來修改共享變數,修改共享快取 前景 jdk提供的鎖只能保證執行緒間的安全性,但分布式環境下,各節點之間的執行緒同步執行卻得不到保障,分布式鎖由此誕生。實現方式有以下幾種 基於資料庫實現分布式鎖 基於快取 ...