Zookeeper,動物管理員,是用來管理hadoop(大象)、Hive(蜜蜂)、Pig(小豬)的管理員。html
Apache Hbase和Apache Solr的分佈式集羣都用到了Zookeeper。node
Zookeeper是一個分佈式、開源的程序協調服務,是Hadoop項目下的一個子項目。它提供的主要功能是配置管理、名字服務、分佈式鎖、集羣管理。linux
拋出問題:數據庫
在咱們的應用中,除了代碼,還有一些就是各類配置。好比:數據庫鏈接等。通常咱們都是使用配置文件的形式,在代碼中引入這些配置文件。apache
當咱們只有一種配置,只有一臺服務器,而且不常常作修改的時候,使用配置文件是一個很好的作法。可是,若是咱們的配置很是多,並且不少服務器都須要這個配置,這時,使用配置文件求不是一個很好的選擇。編程
這個時候就須要尋找一種集中管理配置的方法,咱們在這個集中的地方修改了配置,全部對該配置文件感興趣的均可以得到變動,Zookeeper就這樣的一種服務。緩存
問題解決:服務器
Zookeeper使用Zab這樣的一致性協議來提供一致性。如今不少開源項目都使用Zookeeper來維護配置。網絡
好比HBase,客戶端就是鏈接一個Zookeeper,得到必要的HBase集羣配置信息,而後才能夠進一步進行操做。數據結構
開源的消息隊列Kafka中,也是使用Zookeeper來維護broker的信息。
在Alibaba開源的SOA框架Dubbo中也普遍的使用Zookeeper管理一些配置來實現服務治理
問題拋出:
好比,爲了經過網絡訪問一個系統,咱們得知道對方的IP地址,可是IP地址很複雜,這個時候就須要使用功域名來進行訪問。可是,計算機是不能爲域名的,有一種解決方案,就是咱們爲你每臺機器都備份有一份域名到IP的映射,這個能解決一部分問題,可是若是域名對應的IP發生變化怎麼辦?因而就有了DNS,咱們只須要訪問一個你們都熟知的(known)的點,它就會告訴你這個域名對應的IP是什麼。
問題解決:
在咱們的應用中也會存在這種問題,特別是在咱們的服務特別多的時候,若是咱們在本地保存服務的地址的時候將很是不方便,可是,若是咱們只須要訪問一個你們都熟知的訪問點,這裏提供統一的入口,那麼維護起來就會很方便
問題拋出:
好比:在一個分佈式環境中,爲了提升可靠性,咱們集羣的每臺服務器都部署着一樣的服務,可是,一件事情若是集羣中的每一個服務器都進行的話,那相互之間就須要進行協調,編程起來就會很是複雜。而若是咱們只讓一個服務進行操做,那又存在單點問題。
問題解決:
使用分佈式鎖,在某個時刻只讓一個服務去幹活,的那個這臺服務出現問題的時候鎖釋放,當即fail over到另外的服務。在不少分佈式系統中,都是這麼作的,也叫Leader Election。
好比:HBase的Master就是採用這種機制,可是要注意的是分佈式鎖和同一個進程的鎖仍是有區別的,因此使用的時候,要比同一個進程裏的鎖更謹慎的使用。
問題拋出:
在分佈式的集羣中,常常會因爲各類緣由,好比硬件故障、軟件故障、網絡問題,有些節點會進進出出。有新的節點加入進來,也有老的節點退出集羣。
這個時候,集羣中的其餘機器須要感知到這種變化,而後根據這種變化作出相應的對策。
問題解決:
好比,咱們是一個分佈式存儲系統,有一箇中央控制節點負責存儲的分配,當有新的存儲進來的時候咱們須要根據如今集羣的狀態來分配存儲節點。這時咱們就須要動態感知到集羣目前的狀態。
好比,一個分佈式的SOA架構中,服務是一個集羣提供的,當消費者訪問某個服務時,就須要採用某種機制發現如今有哪些節點能夠提供這種服務(也被稱之爲服務發現,好比Alibaba開源的SOA框架Dubbo就採用了Zookeeper做爲服務發現的底層機制)。還有開源的Kafka隊列就採用了Zookeeper做爲Cosnumer的上下線管理。
在Zookeeper中,znode是一個根Unix文件系統路徑類似的節點,能夠往這個節點存儲或者獲取數據。
Zookeeper底層是一套數據結構。這個數據結構是一個樹形結構,上面的每個節點,稱之爲「znode」,Zookeeper中的數據是按照樹結構進行存儲的,並且znode節點還分爲4中不一樣的類型。
每一個znode節點默認存儲1MB的數據(僅僅用來記錄狀態)。
可使用zkCli命令,登陸到Zookeeper上,並經過ls、create、delete、get、set等命令來操做這些znode節點。
(1)PERSISTENT(持久化節點):所謂持久化節點,是指在節點建立後,就會一直存在,直到有刪除操做來主動清除這個節點,不然不會由於建立該節點的客戶端會話失效而消失。
(2)PERSISTENT_SEQUENTIAL(持久順序節點):這類節點基本特徵和持久化節點是一致的。額外的特性是,在ZK中,每一個父節點會爲它的第一級子節點維護一份時序,會記錄每一個子節點建立的前後順序。基於這個特性,在建立子節點的同時,能夠設置這個屬性,那麼在建立節點的過程當中,ZK會自動爲給定節點加上一個數字後綴,做爲新的節點名。這個數字後綴範圍是整型的最大範圍值。在建立節點的同時,只須要傳入節點「/test_」,這樣,Zookeeper會自動給後面補充數字。
(3)EPHEMERAL(臨時節點):和持久化節點不一樣的是,臨時節點的生命週期和客戶端會話綁定。也就是說,若是客戶端會話失效,那麼這個節點就會自動被清除掉。注意,這裏提到的是會話失效,而不是鏈接斷開。另外,在臨時節點下面不能再建立子節點。
值得注意的是,當客戶端失效的時候,所產生的節點並非一會兒就消失,也要過一段時間,大概10s之內。
(4)EPHEMERAL_SEQUENTIAL(臨時自動編號節點):此節點屬於臨時節點,不過帶有順序,客戶端會話結束,節點就消失。
安裝環境:Linux系統、JDK
安裝步驟:
第一步:上傳Zookeeper壓縮包
官方資源包可在 zookeeper.apache.com 站點中下載。最新發布版本爲:3.4.12。
第二步:解壓Zookeeper壓縮包
tar -zxf zookeeper-3.4.6.tar.gz
cp zookeeper-3.4.6 /usr/local/zookeeper -r
第三步:配置Zookeeper
Zookeeper在啓動的時候,默認去conf目錄下查找一個名爲zoo.cfg的配置文件。
cp zoo_sample.cfg zoo.cfg
修改zoo.cfg配置文件:
設置dataDir路徑:即數據緩存路徑,須要先建立一個data文件夾
第四步:啓動Zookeeper
在/bin目錄下,啓動zkServer,sh文件
(1)默認加載配置文件:./zkServer.sh start,會默認去conf目錄下加載zoo.cfg配置文件
(2)指定加載配置文件:./zkServer.sh start [配置文件路徑位置]
中止Zookeeper:./zkServer.sh stop
查看Zookeeper狀態:./zkServer.sh status
zookeeper文件目錄:
Zookeeper集羣中的角色主要有如下三類:
(1)最終一致性:client不論鏈接到哪個server,展現的都是同一個視圖,這是zookeeper最重要的性能。
(2)可靠性:若是消息m被一臺服務器接收到,那麼它將會被全部的服務器接收
(3)實時性:Zookeeper保證客戶端將在一個時間間隔範圍內,得到服務器的更新信息,或者服務器失效的信息;但因爲網絡延遲的緣由,zookeeper不能保證兩個客戶端能同時獲得剛更新的數據,若是須要最新的數據,應該在讀數據以前調用sync()接口
(4)等待無關(wait-free):慢的或者實效的client不得干預快速的client請求,使得每一個client都能有效的等待
(5)原子性:更新只有成功或者失敗,沒有中間狀態
(6)順序性:包括全局有序和偏序兩種:全局有序是指若是一臺服務器上消息a在消息b以前發佈,則在全部的server上消息a都會在消息b以前發佈;偏序是指若是一個消息b在消息a後被同一個發佈者發佈,消息a必將排在消息b以前。
使用三個zookeeper搭建一個僞集羣,應用部署在linux系統:192.168.110.128;服務器監聽端口爲218一、218二、2183;投票選舉端口爲2881/388一、2882/388二、2883/3883。
三個集羣都在:/usr/local/zookeepercluster目錄下
子目錄分別爲:zookeeper0一、zookeeper0二、zookeeper03
安裝方法與單機版同樣。配置文件須要指定data目錄。
特殊地方:
每一個集羣須要提供應用惟一標識:
在zookeeper集羣中,每一個節點須要一個惟一標識,這個惟一標識要求必須是一個天然數,且惟一標識保存位置是:/data/myid,其中myid爲配置文件。
配置方案:
(1)手動用vi命令編輯myid,並添加標識1,2,3
(2)使用簡化命令:echo [惟一標識] >> myid
echo命令爲回聲命令,系統會將命令發送數據返回,「>>」爲定位,表明系統回聲數據指定發送到什麼位置,此命令表明系統回聲數據發送到myid文件中,若是沒有文件則建立文件。
一般須要給配置文件添加客戶自行權限,命令以下:
chmod +x 文件名
修改配置文件zoo.cfg:設置服務、投票、選舉端口
vi zoo.cfg(每一個集羣都須要配置)
clientPort=2181 #服務端口根據應用作對應修改,zk01-2181,zk02-2182,zk03-2183 server.1=192.168.70.143:2881:3881 server.2=192.168.70.143:2882:3882 server.3=192.168.70.143:2883:3883
啓動zookeeper應用:
在bin/zkServer.sh.start
注:zookeeper集羣搭建完成後,至少須要啓動兩個應用才能提供服務,由於須要選舉出主服務節點。啓動全部的zookeeper節點後,可使用命令:bin/zkServer.sh status來查看節點狀態,以下所示:
Model:leader 表示主機
Model:follower 表示備份機
關閉zookeeper應用:
命令:bin/zkServer.sh stop
啓動zookeeper客戶端:
bin目錄下:./zkCli.sh
(1)當輸入命令不正確時,會提示信息:
(2)經常使用命令:ls
使用格式:ls path
表示列表路徑下的資源
指的注意的是:在zookeeper中,
根節點路徑: ls /
子節點路徑: ls /zookeeper
下一級子節點:ls /zookeeper/quota
(3)經常使用命令:quit
表示:退出客戶端
(4)鏈接指定的ip地址下的服務器
./zkCli.sh -server 192.168.110.128:2182
(5)經常使用命令:connect 【ip】
表示:鏈接到指定的服務器
例如:connect 192.168.110.128:2183
(6)經常使用命令:create 【-e】【-s】 path data
表示:建立節點
-e:表示建立臨時節點,能夠不指定
-s:表示建立一個順序節點,能夠不指定
path:表示在哪一個節點下建立新的節點,其中,根節點表示爲/
data:表示節點數據
例如:create /test 123
表示:在根節點下,建立一個test節點,數據爲123,節點類型沒有給定,默認爲持久型節點。
例如:建立順序節點:create /test2 2
zookeeper自動爲節點添加後綴信息;
(7)經常使用命令:get path
表示:查看指定節點的數據
例如:get /test
123 cZxid = 0x400000004 ctime = Fri Jul 05 18:00:23 CST 2019 mZxid = 0x400000004 mtime = Fri Jul 05 18:00:23 CST 2019 pZxid = 0x400000004 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 0
(8)經常使用命令:set path data 【version】
表示:設置對應位置節點的數據
例如:
(9)delete path 【version】
表示:刪除指定節點,此命令不能刪除有子節點的節點
(10)經常使用命令:rmr path
表示:刪除指定節點,包括子節點
(11)經常使用命令:quit
表示:退出控制檯
原文出處:https://www.cnblogs.com/ncl-960301-success/p/11228597.html