Zookeeper 分布式協調服務開源項目
ZooKeeper是一種分布式協調服務,用於管理大型主機。在分布式環境中協調和管理服務是一個復雜的過程。ZooKeeper通過其簡單的架構和API解決了這個問題。 ZooKeeper允許開發人員專註於核心應用程序邏輯,而不必擔心應用程序的分布式特性。ZooKeeper框架最初是在“Yahoo!”上構建的,用於以簡單而穩健的方式訪問他們的應用程序。後來,Apache ZooKeeper成為Hadoop,HBase和其他分布式框架使用的有組織服務的標準。
官方文檔上這麽解釋zookeeper,它是一個分布式服務框架,是Apache Hadoop 的一個子項目,它主要是用來解決分布式應用中經常遇到的一些數據管理問題,如:統一命名服務、狀態同步服務、集群管理、分布式應用配置項的管理等。
2,樹形結構(類似unix文件系統)
每個子目錄項如 NameService 都被稱作為 znode(目錄節點),和文件系統一樣,我們能夠自由的增加、刪除znode,在一個znode下增加、刪除子znode,唯一的不同在於znode是可以存儲數據的。
有四種類型的znode:
a,PERSISTENT-持久化目錄節點
客戶端與zookeeper斷開連接後,該節點依舊存在
b,PERSISTENT_SEQUENTIAL-持久化順序編號目錄節點
客戶端與zookeeper斷開連接後,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號
c,EPHEMERAL-臨時目錄節點
客戶端與zookeeper斷開連接後,該節點被刪除
d,EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節點
客戶端與zookeeper斷開連接後,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號
3, 監聽通知機制
客戶端註冊監聽它關心的目錄節點,當目錄節點發生變化(數據改變、被刪除、子目錄節點增加刪除)時,zookeeper會通知客戶端。
4,Zookeeper與客戶端
Leader 服務器是整個 ZooKeeper 集群工作機制中的核心,其主要工作有以下兩個:
事務請求的唯一調度和處理者,保證集群事務處理的順序性。
集群內部各服務器的調度者。
從角色名字上可以看出,Follewer 服務器是 ZooKeeper 集群狀態的跟隨者,其主要工作有以下三個:
處理客戶端非事務請求,轉發事務請求給 Leader 服務器。
參與事務請求 Proposal 的投票。
參與 Leader 選舉投票。
Observer 充當了一個觀察者的角色,在工作原理上基本和 Follower 一致,唯一的區別在於,它不參與任何形式的投票。
5,ZooKeeper 特點
順序一致性:從同一客戶端發起的事務請求,最終將會嚴格地按照順序被應用到 ZooKeeper 中去。
原子性:所有事務請求的處理結果在整個集群中所有機器上的應用情況是一致的,也就是說,要麽整個集群中所有的機器都成功應用了某一個事務,要麽都沒有應用。
單一系統映像:無論客戶端連到哪一個 ZooKeeper 服務器上,其看到的服務端數據模型都是一致的。
可靠性:一旦一次更改請求被應用,更改的結果就會被持久化,直到被下一次更改覆蓋。
6,分布式鎖的實現
有了zookeeper的一致性文件系統,鎖的問題變得容易。鎖服務可以分為兩類,一個是保持獨占,另一個是控制時序。
對於第一類,我們將zookeeper上的一個znode看作是一把鎖,通過createznode的方式來實現。所有客戶端都去創建 /distribute_lock 節點,最終成功創建的那個客戶端也即擁有了這把鎖。廁所有言:來也沖沖,去也沖沖,用完刪除掉自己創建的distribute_lock 節點就釋放出鎖。
對於第二類, /distribute_lock 已經預先存在,所有客戶端在它下面創建臨時順序編號目錄節點,和選master一樣,編號最小的獲得鎖,用完刪除,依次方便。
7,隊列管理
兩種類型的隊列:
1, 同步隊列,當一個隊列的成員都聚齊時,這個隊列才可用,否則一直等待所有成員到達。
2,隊列按照 FIFO 方式進行入隊和出隊操作。
第一類,在約定目錄下創建臨時目錄節點,監聽節點數目是否是我們要求的數目。
第二類,和分布式鎖服務中的控制時序場景基本原理一致,入列有編號,出列按編號。
終於了解完我們能用zookeeper做什麽了,可是作為一個程序員,我們總是想狂熱了解zookeeper是如何做到這一點的,單點維護一個文件系統沒有什麽難度,可是如果是一個集群維護一個文件系統保持數據的一致性就非常困難了
8,Zookeeper客戶端常用命令
create /parh data 創建一個名為/path的zNode節點,並包含數據data
delete /path 刪除名為/path的zNode節點
exists /path 檢查是否存在名為/path的zNode節點
setData /path data 設置名為/path的zNode的數據為data
getData /path 返回名為/path的zNode節點的數據信息
getChildren /path 返回所有/path節點的所有子節點列表
zNode節點還有不同的類型,持久(persistent)節點和臨時(ephemeral)節點。持久的zNode,如/path,只能通過調用delete來進行刪除,而臨時的zNode則與之相反,當創建該節點的客戶端崩潰或者關閉了與ZooKeeper服務器的連接時候,這個臨時zNode節點就會被刪除了。其中臨時節點可用於實現分布式鎖。
9,集群搭建
Zookeeper 官網下載地址:
https://archive.apache.org/dist/zookeeper/
三臺linux系統的ip(安裝有java環境):
ip1:192.168.1.201
ip2:192.168.1.202
ip3:192.168.1.203
Zookeeper目錄結構如下:
重命名zoo-sample.cfg文件名統一修改為zoo.cfg
vim zoo.cfg
initLimit=10: 對於從節點最初連接到主節點時的超時時間,單位為tick值的倍數。
syncLimit=5:對於主節點與從節點進行同步操作時的超時時間,單位為tick值的倍數。
dataDir=/tmp/zookeeper: 用於配置內存數據庫保存的模糊快照的目錄。即剛剛創建的data文件夾就是在此目錄中。文件信息都存放在data目錄下。
clientPort=2181: 表示客戶端所連接的服務器所監聽的端口號,默認是2181。即zookeeper對外提供訪問的端口號。
server.1=192.168.1.201:2888:3888 (主機名, 心跳端口、數據端口)
server.2=192.168.1.202:2888:3888
server.3=192.168.1.203:2888:3888
在zookeeper安裝目錄下新建data目錄並新建myid文件,然後寫入對應的編號
在192.168.1.201機器上輸入1,保存退出;在192.168.1.202機器上輸入2,保存退出;在192.168.1.203機器上輸入3,保存退出。這裏的1,2,3是與server1,2,3相對應的。
查看防火墻狀態,並關閉禁用防火墻
centos7下查看防火墻狀態的命令:
firewall-cmd --state
關閉防火墻的命令:
systemctl stop firewalld.service
systemctl disable firewalld.service (禁止開機啟動,永久關閉防火墻)
然後重啟三個zookeeper服務:zkServer.sh restart,在zkServer.sh status後發現成功了。
10 ,連接到zookeeper並測試
在命令行中輸入:zkCli.sh -server 192.168.1.201:2181 即可連接到其中一臺ZooKeeper服務器。其他自動實現同步,客戶端只需要和一臺保持連接即可。連接成功後,系統會輸出ZooKeeper的相關配置信息和相關環境,並在屏幕上輸出Welcome to ZooKeeper!等信息
在任意一臺上創建節點並關聯測試數據,然後在另外一臺上查看是否可以看到相關節點保存的數據
Zookeeper 分布式協調服務開源項目