1,Zookeeper是什麼?java
ZooKeeper是一種分佈式協調服務,用於管理大型主機。在分佈式環境中協調和管理服務是一個複雜的過程。ZooKeeper經過其簡單的架構和API解決了這個問題。 ZooKeeper容許開發人員專一於核心應用程序邏輯,而沒必要擔憂應用程序的分佈式特性。ZooKeeper框架最初是在「Yahoo!」上構建的,用於以簡單而穩健的方式訪問他們的應用程序。後來,Apache ZooKeeper成爲Hadoop,HBase和其餘分佈式框架使用的有組織服務的標準。node
官方文檔上這麼解釋zookeeper,它是一個分佈式服務框架,是Apache Hadoop 的一個子項目,它主要是用來解決分佈式應用中常常遇到的一些數據管理問題,如:統一命名服務、狀態同步服務、集羣管理、分佈式應用配置項的管理等。linux
2,樹形結構(相似unix文件系統)
每一個子目錄項如 NameService 都被稱做爲 znode(目錄節點),和文件系統同樣,咱們可以自由的增長、刪除znode,在一個znode下增長、刪除子znode,惟一的不一樣在於znode是能夠存儲數據的。程序員
有四種類型的znode:數據庫
a,PERSISTENT-持久化目錄節點apache
客戶端與zookeeper斷開鏈接後,該節點依舊存在vim
b,PERSISTENT_SEQUENTIAL-持久化順序編號目錄節點centos
客戶端與zookeeper斷開鏈接後,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號服務器
c,EPHEMERAL-臨時目錄節點架構
客戶端與zookeeper斷開鏈接後,該節點被刪除
d,EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節點
客戶端與zookeeper斷開鏈接後,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號
3, 監聽通知機制
客戶端註冊監聽它關心的目錄節點,當目錄節點發生變化(數據改變、被刪除、子目錄節點增長刪除)時,zookeeper會通知客戶端。
4,Zookeeper與客戶端
Leader 服務器是整個 ZooKeeper 集羣工做機制中的核心,其主要工做有如下兩個:
事務請求的惟一調度和處理者,保證集羣事務處理的順序性。
集羣內部各服務器的調度者。
從角色名字上能夠看出,Follewer 服務器是 ZooKeeper 集羣狀態的跟隨者,其主要工做有如下三個:
處理客戶端非事務請求,轉發事務請求給 Leader 服務器。
參與事務請求 Proposal 的投票。
參與 Leader 選舉投票。
Observer 充當了一個觀察者的角色,在工做原理上基本和 Follower 一致,惟一的區別在於,它不參與任何形投票。
5,節點操做流程
5.1,在 Client 向 Follower 發出一個寫請求。
5.2, Follower 把請求轉發給 Leader。
5.3,Leader 接收到之後開始發起投票並通知 Follower 進行投票。
5.4,Follower 把投票結果發送給 Leader。
5.5, Leader 將結果彙總後,若是須要寫入,則開始寫入,同時把寫入操做通知給 Follower,而後 commit。
5.6,Follower 把請求結果返回給 Client。
6,ZooKeeper 特色
順序一致性:從同一客戶端發起的事務請求,最終將會嚴格地按照順序被應用到 ZooKeeper 中去。
原子性:全部事務請求的處理結果在整個集羣中全部機器上的應用狀況是一致的,也就是說,要麼整個集羣中全部的機器都成功應用了某一個事務,要麼都沒有應用。
單一系統映像:不管客戶端連到哪個 ZooKeeper 服務器上,其看到的服務端數據模型都是一致的。
可靠性:一旦一次更改請求被應用,更改的結果就會被持久化,直到被下一次更改覆蓋。
7,分佈式鎖的實現
有了zookeeper的一致性文件系統,鎖的問題變得容易。鎖服務能夠分爲兩類,一個是保持獨佔,另外一個是控制時序。
對於第一類,咱們將zookeeper上的一個znode看做是一把鎖,經過createznode的方式來實現。全部客戶端都去建立 /distribute_lock 節點,最終成功建立的那個客戶端也即擁有了這把鎖。廁全部言:來也沖沖,去也沖沖,用完刪除掉本身建立的distribute_lock 節點就釋放出鎖。 對於第二類, /distribute_lock 已經預先存在,全部客戶端在它下面建立臨時順序編號目錄節點,和選master同樣,編號最小的得到鎖,用完刪除,依次方便。
8,隊列管理
兩種類型的隊列:
8.1, 同步隊列,當一個隊列的成員都聚齊時,這個隊列纔可用,不然一直等待全部成員到達。
8.2,隊列按照 FIFO 方式進行入隊和出隊操做。
第一類,在約定目錄下建立臨時目錄節點,監聽節點數目是不是咱們要求的數目。
第二類,和分佈式鎖服務中的控制時序場景基本原理一致,入列有編號,出列按編號。
終於瞭解完咱們能用zookeeper作什麼了,但是做爲一個程序員,咱們老是想狂熱瞭解zookeeper是如何作到這一點的,單點維護一個文件系統沒有什麼難度,但是若是是一個集羣維護一個文件系統保持數據的一致性就很是困難了
9,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節點就會被刪除了。其中臨時節點可用於實現分佈式鎖。
10,集羣搭建
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後發現成功了。
11 ,鏈接到zookeeper並測試
在命令行中輸入:zkCli.sh -server 192.168.1.201:2181 便可鏈接到其中一臺ZooKeeper服務器。其餘自動實現同步,客戶端只須要和一臺保持鏈接便可。鏈接成功後,系統會輸出ZooKeeper的相關配置信息和相關環境,並在屏幕上輸出Welcome to ZooKeeper!等信息
在任意一臺上建立節點並關聯測試數據,而後在另一臺上查看是否能夠看到相關節點保存的數據