zookeeper 安装和使用
1.Windows安裝和使用zookeeper
之前整理過一篇文章《zookeeper 分布式鎖服務》,本文介紹的 Zookeeper 是以 3.4.5 這個穩定版本為基礎,最新的版本可以通過官網?http://hadoop.apache.org/zookeeper/來獲取,Zookeeper 的安裝非常簡單,下面將從單機模式和集群模式兩個方面介紹 Zookeeper 的Windows安裝和配置.
首先需要安裝JdK,從Oracle的Java網站下載,安裝很簡單,就不再詳述。
單機模式
單機安裝非常簡單,只要獲取到 Zookeeper 的壓縮包并解壓到某個目錄如:C:\zookeeper-3.4.5\下,Zookeeper 的啟動腳本在 bin 目錄下,Windows 下的啟動腳本是 zkServer.cmd。
在你執行啟動腳本之前,還有幾個基本的配置項需要配置一下,Zookeeper 的配置文件在 conf 目錄下,這個目錄下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是將 zoo_sample.cfg 改名為 zoo.cfg,因為 Zookeeper 在啟動時會找這個文件作為默認配置文件。下面詳細介紹一下,這個配置文件中各個配置項的意義。
# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=C:\\zookeeper-3.4.5\\data dataLogDir=C:\\zookeeper-3.4.5\\log # the port at which the clients will connect clientPort=2181 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1- tickTime:這個時間是作為 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
- dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日志文件也保存在這個目錄里。
- dataLogDir:顧名思義就是 Zookeeper 保存日志文件的目錄
- clientPort:這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。
當這些配置項配置好后,你現在就可以啟動 Zookeeper 了,啟動后要檢查 Zookeeper 是否已經在服務,可以通過 netstat – ano 命令查看是否有你配置的 clientPort 端口號在監聽服務。
集群模式
Zookeeper 不僅可以單機提供服務,同時也支持多機組成集群來提供服務。實際上 Zookeeper 還支持另外一種偽集群的方式,也就是可以在一臺物理機上運行多個 Zookeeper 實例,下面將介紹集群模式的安裝和配置。
Zookeeper 的集群模式的安裝和配置也不是很復雜,所要做的就是增加幾個配置項。集群模式除了上面的三個配置項還要增加下面幾個配置項:
initLimit=5??
syncLimit=2??
server.1=192.168.211.1:2888:3888??
server.2=192.168.211.2:2888:3888
-
- initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這里所說的客戶端不是用戶連接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集群中連接到 Leader 的 Follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 10 個心跳的時間(也就是 tickTime)長度后 Zookeeper 服務器還沒有收到客戶端的返回信息,那么表明這個客戶端連接失敗。總的時間長度就是 5*2000=10 秒
- syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 2*2000=4 秒
- server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集群中的 Leader 服務器交換信息的端口;D 表示的是萬一集群中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通信的端口。如果是偽集群的配置方式,由于 B 都是一樣,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。
- 除了修改 zoo.cfg 配置文件,集群模式下還要配置一個文件 myid,這個文件在 dataDir 目錄下,這個文件里面就有一個數據就是 A 的值,Zookeeper 啟動時會讀取這個文件,拿到里面的數據與 zoo.cfg 里面的配置信息比較從而判斷到底是那個 server。
數據模型
Zookeeper 會維護一個具有層次關系的數據結構,它非常類似于一個標準的文件系統,如圖 1 所示:
Zookeeper 這種數據結構有如下這些特點:
- 每個子目錄項如 NameService 都被稱作為 znode,這個 znode 是被它所在的路徑唯一標識,如 Server1 這個 znode 的標識為 /NameService/Server1
- znode 可以有子節點目錄,并且每個 znode 可以存儲數據,注意 EPHEMERAL 類型的目錄節點不能有子節點目錄
- znode 是有版本的,每個 znode 中存儲的數據可以有多個版本,也就是一個訪問路徑中可以存儲多份數據
- znode 可以是臨時節點,一旦創建這個 znode 的客戶端與服務器失去聯系,這個 znode 也將自動刪除,Zookeeper 的客戶端和服務器通信采用長連接方式,每個客戶端和服務器通過心跳來保持連接,這個連接狀態稱為 session,如果 znode 是臨時節點,這個 session 失效,znode 也就刪除了
- znode 的目錄名可以自動編號,如 App1 已經存在,再創建的話,將會自動命名為 App2
- znode 可以被監控,包括這個目錄節點中存儲的數據的修改,子節點目錄的變化等,一旦變化可以通知設置監控的客戶端,這個是 Zookeeper 的核心特性,Zookeeper 的很多功能都是基于這個特性實現的,后面在典型的應用場景中會有實例介紹
如何使用
Zookeeper 作為一個分布式的服務框架,主要用來解決分布式集群中應用系統的一致性問題,它能提供基于類似于文件系統的目錄節點樹方式的數據存儲,但是 Zookeeper 并不是用來專門存儲數據的,它的作用主要是用來維護和監控你存儲的數據的狀態變化。通過監控這些數據狀態的變化,從而可以達到基于數據的集群管理.
通過C#代碼使用zookeeper
Zookeeper的使用主要是通過創建其Nuget ZooKeeperNet包下的Zookeeper實例,并且調用其接口方法進行的,主要的操作就是對znode的增刪改操作,監聽znode的變化以及處理。
參考:Windows安裝和使用zookeeper - 張善友 - 博客園
2.使用 RMI + ZooKeeper 實現遠程調用框架
在 Java 世界里,有一種技術可以實現“跨虛擬機”的調用,它就是 RMI(Remote Method Invocation,遠程方法調用)。例如,服務A 在 JVM1 中運行,服務B 在 JVM2 中運行,服務A 與 服務B 可相互進行遠程調用,就像調用本地方法一樣,這就是 RMI。在分布式系統中,我們使用 RMI 技術可輕松將 服務提供者(Service Provider)與 服務消費者(Service Consumer)進行分離,充分體現組件之間的弱耦合,系統架構更易于擴展。
參考:3 使用 RMI + ZooKeeper 實現遠程調用框架_ZooKeeper教程_田守枝Java技術博客
3.ZooKeeper之(四)配置與命令---建議參考博主寫的非常好
Nginx之(一)Nginx是什么_冰河-CSDN博客
4.zookeeper 客戶端 zkCli 命令詳解
安裝 zookeeper
啟動/停止 zookeeper
配置文件
zookeeper 命令
zookeeper cli
對 znode 進行增刪改查
創建節點 create
列出節點 ls
獲取節點信息 get
檢查狀態 stat
修改節點 set
刪除節點 rmr
刪除節點 delete
其他指令
歷史記錄 history
重復之前的命令 redo
是否輸出 watch 事件(printwatches)
關閉連接 close
打開連接 connect
退出連接 quit
強制同步 sync
ACL 操作
ACL Permissions
權限相關命令
ACL Schemes
world 方案
IP 方案
auth 方案
digest 方案
創建節點時指定 ACL
zookeeper quota
參考:https://blog.csdn.net/feixiang2039/article/details/79810102?
5.Zookeeper學習筆記
(一)znode的概念
znode通過路徑被引用,類似linux文件系統的路徑。根節點用/表示,其余節點從/開始加上各層節點的名稱,如/zoo/duck。但是與文件系統路徑不同,znode沒有相對路徑的概念,每個節點都以絕對路徑標識。
znode既可以作為保存數據的容器(如同文件),也可以作為保存其它znode的容器(如目錄)。znode除了可以保存數據外(保存的數據不能太大,一個znode存儲的數據被限制在1M以內),znode本身就是一個數據結構,其中的信息稱為元數據(如創建時間、子節點信息、版本信息、ACL信息等)。
(二)znode的操作
znode支持如下9種基本操作:
- create:創建znode
- delete:刪除znode
- exists:測試一個znode是否存在并且查詢它的元數據
- getChildren:獲取一個znode的子節點列表
- setACL:設置znode的ACL
- getACL:獲取znode的ACL
- setData:設置znode所保存的數據
- getData:獲取znode所保存的數據
- sync:將客戶端的znode視圖與zk服務器同步
(三)znode的類型
znode可分為短暫的(或叫臨時的)和持久的。所謂短暫znode,是指創建該節點的客戶端會話結束后,該節點會被自動刪除。而持久znode的生存期與創建它的客戶端會話無關,如果要刪除,需要顯示的執行命令刪除。注意,短暫znode不可以有子節點。
順序znode:指znode的名稱中包含順序號。當我們創建一個順序znode時,框架會自動在指定的名稱之后附加一個單調遞增的計數器值(由父節點維護),并且保證這個計數器值是唯一的。注意,順序znode可以是持久的,或短暫的。
(四)znode的版本信息
znode有版本信息,對于每個znode來說,均存在三個版本號:
dataVersion
數據版本號,每次對節點進行set操作,dataVersion的值都會增加1(即使設置的是相同的數據),初始值為0。
cversion
子節點的版本號。當znode的子節點有變化時,cversion 的值就會增加1,初始值為0。
aclVersion
ACL的版本號。
下面以dataVersion (數據版本號)為例來說明Zk中版本號的作用。每一個znode都有一個數據版本號,它隨著每次數據變化而自增。ZooKeeper提供的一些API例如setData和delete根據版本號有條件地執行。多個客戶端對同一個znode進行操作時,版本號的使用就會顯得尤為重要。例如,假設客戶端C1對znode /config寫入一些配置信息,如果另一個客戶端C2同時更新了這個znode,此時C1的版本號已經過期,C1調用setData一定不會成功。這正是版本機制有效避免了數據更新時出現的先后順序問題。在這個例子中,C1在寫入數據時使用的版本號無法匹配,使得操作失敗。因此使用版本號可用來阻止并行操作的不一致性。
(五)znode的ACL列表
每個znode都有一個ACL(權限控制列表),用于決定哪個客戶端可以對它執行何種操作,也就是說一種權限控制的方式。 znode的ACL列表可以在創建時指定,也可以后續重新設置。如果不加設置,默認所有客戶端可以對znode進行任何操作。關于ACL的更詳細信息本文不再介紹。
三、Zk的觀察機制
當znode的發生變化時,Zk提供一種觀察(watch)機制可以讓希望獲取這個變化信息的客戶端得到通知。當一個客戶端對一個節點設置了觀察,如果該節點發生變化(如被刪除、設置數據、添加/刪除子節點等),Zk框架會通知設置了觀察的客戶端。
注意,節點上設置了觀察,當節點發生變化后,只會通知一次。如果想再次獲取通知,需要重新設置。
四、Zk的設計思路
在集群環境下,Zk通過復制來實現高可用性,只要集群環境下的超過一半機器處于可用狀態,它就能提供服務。比如一個集群有5個節點,任意2臺機器出現問題,但因為還有3臺機器可用,3臺超過1半,所以服務可以繼續保證。如果集群是6臺節點,也最多只能有2臺機器出問題,因為如果有3臺機器有問題,則可用的沒超過一半,服務也不可用。因此,對于Zk的集群,其節點的數量通常配置為奇數個。
集群中的節點分為兩種類型:領導者(leader)和跟隨著(flower)。 集群中的機器通過一個選擇過程來選出領導者,其它的機器就作為跟隨者。如果領導者出現故障,其它機器就會選出一個新的領導者。隨后,如果之前的領導者恢復,則會成為一個跟隨者。
Zk客戶端可以連接到任意一臺Zk服務器,但是所有的寫請求都會被轉發給領導者,再由領導者將更新廣播給跟隨者,當半數以上的跟隨者已經將修改持久化之后,領導者才會提交這個更新,然后客戶端才會收到一個更新成功的響應。
下面示意圖可以簡單說明上面描述的內容:
(摘自hadoop權威指南一書)
參考:https://www.jianshu.com/p/42556d349160
總結
以上是生活随笔為你收集整理的zookeeper 安装和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 出现23.97帧率的原因
- 下一篇: 除了字节,腾讯也来“抢”阿里的这门生意