第一章:Zookeeper介紹 Zookeeper,動物管理員,是用來管理hadoop(大象)、Hive(蜜蜂)、Pig(小豬)的管理員。 Apache Hbase和Apache Solr的分散式集群都用到了Zookeeper。 Zookeeper是一個分散式、開源的程式協調服務,是Hadoop項目 ...
第一章:Zookeeper介紹
Zookeeper,動物管理員,是用來管理hadoop(大象)、Hive(蜜蜂)、Pig(小豬)的管理員。
Apache Hbase和Apache Solr的分散式集群都用到了Zookeeper。
Zookeeper是一個分散式、開源的程式協調服務,是Hadoop項目下的一個子項目。它提供的主要功能是配置管理、名字服務、分散式鎖、集群管理。
1.1:Zookeeper的作用:配置管理(重點)
拋出問題:
在我們的應用中,除了代碼,還有一些就是各種配置。比如:資料庫連接等。一般我們都是使用配置文件的形式,在代碼中引入這些配置文件。
當我們只有一種配置,只有一臺伺服器,並且不經常做修改的時候,使用配置文件是一個很好的做法。但是,如果我們的配置非常多,而且很多伺服器都需要這個配置,這時,使用配置文件求不是一個很好的選擇。
這個時候就需要尋找一種集中管理配置的方法,我們在這個集中的地方修改了配置,所有對該配置文件感興趣的都可以獲得變更,Zookeeper就這樣的一種服務。
問題解決:
Zookeeper使用Zab這樣的一致性協議來提供一致性。現在很多開源項目都使用Zookeeper來維護配置。
比如HBase,客戶端就是連接一個Zookeeper,獲得必要的HBase集群配置信息,然後才可以進一步進行操作。
開源的消息隊列Kafka中,也是使用Zookeeper來維護broker的信息。
在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實現服務治理
1.2:Zookeeper的作用:名字服務(瞭解)
問題拋出:
比如,為了通過網路訪問一個系統,我們得知道對方的IP地址,但是IP地址很複雜,這個時候就需要使用功功能變數名稱來進行訪問。但是,電腦是不能為功能變數名稱的,有一種解決方案,就是我們為你每台機器都備份有一份功能變數名稱到IP的映射,這個能解決一部分問題,但是如果功能變數名稱對應的IP發生變化怎麼辦?於是就有了DNS,我們只需要訪問一個大家都熟知的(known)的點,它就會告訴你這個功能變數名稱對應的IP是什麼。
問題解決:
在我們的應用中也會存在這種問題,特別是在我們的服務特別多的時候,如果我們在本地保存服務的地址的時候將非常不方便,但是,如果我們只需要訪問一個大家都熟知的訪問點,這裡提供統一的入口,那麼維護起來就會很方便
1.3:Zookeeper的作用:分散式鎖(瞭解)
問題拋出:
比如:在一個分散式環境中,為了提高可靠性,我們集群的每台伺服器都部署著同樣的服務,但是,一件事情如果集群中的每個伺服器都進行的話,那相互之間就需要進行協調,編程起來就會非常複雜。而如果我們只讓一個服務進行操作,那又存在單點問題。
問題解決:
使用分散式鎖,在某個時刻只讓一個服務去幹活,的那個這台服務出現問題的時候鎖釋放,立即fail over到另外的服務。在很多分散式系統中,都是這麼做的,也叫Leader Election。
比如:HBase的Master就是採用這種機制,但是要註意的是分散式鎖和同一個進程的鎖還是有區別的,所以使用的時候,要比同一個進程里的鎖更謹慎的使用。
1.4:Zookeeper的作用:集群管理(重點)
問題拋出:
在分散式的集群中,經常會由於各種原因,比如硬體故障、軟體故障、網路問題,有些節點會進進出出。有新的節點加入進來,也有老的節點退出集群。
這個時候,集群中的其他機器需要感知到這種變化,然後根據這種變化做出相應的對策。
問題解決:
比如,我們是一個分散式存儲系統,有一個中央控制節點負責存儲的分配,當有新的存儲進來的時候我們需要根據現在集群的狀態來分配存儲節點。這時我們就需要動態感知到集群目前的狀態。
比如,一個分散式的SOA架構中,服務是一個集群提供的,當消費者訪問某個服務時,就需要採用某種機制發現現在有哪些節點可以提供這種服務(也被稱之為服務發現,比如Alibaba開源的SOA框架Dubbo就採用了Zookeeper作為服務發現的底層機制)。還有開源的Kafka隊列就採用了Zookeeper作為Cosnumer的上下線管理。
第二章:Zookeeper的存儲結構
2.1:Znode
在Zookeeper中,znode是一個根Unix文件系統路徑相似的節點,可以往這個節點存儲或者獲取數據。
Zookeeper底層是一套數據結構。這個數據結構是一個樹形結構,上面的每一個節點,稱之為“znode”,Zookeeper中的數據是按照樹結構進行存儲的,而且znode節點還分為4中不同的類型。
每個znode節點預設存儲1MB的數據(僅僅用來記錄狀態)。
可以使用zkCli命令,登錄到Zookeeper上,並通過ls、create、delete、get、set等命令來操作這些znode節點。
2.2:Znode節點類型
(1)PERSISTENT(持久化節點):所謂持久化節點,是指在節點創建後,就會一直存在,直到有刪除操作來主動清除這個節點,否則不會因為創建該節點的客戶端會話失效而消失。
(2)PERSISTENT_SEQUENTIAL(持久順序節點):這類節點基本特征和持久化節點是一致的。額外的特性是,在ZK中,每個父節點會為它的第一級子節點維護一份時序,會記錄每個子節點創建的先後順序。基於這個特性,在創建子節點的同時,可以設置這個屬性,那麼在創建節點的過程中,ZK會自動為給定節點加上一個數字尾碼,作為新的節點名。這個數字尾碼範圍是整型的最大範圍值。在創建節點的同時,只需要傳入節點“/test_”,這樣,Zookeeper會自動給後面補充數字。
(3)EPHEMERAL(臨時節點):和持久化節點不同的是,臨時節點的生命周期和客戶端會話綁定。也就是說,如果客戶端會話失效,那麼這個節點就會自動被清除掉。註意,這裡提到的是會話失效,而不是連接斷開。另外,在臨時節點下麵不能再創建子節點。
值得註意的是,當客戶端失效的時候,所產生的節點並不是一下子就消失,也要過一段時間,大概10s以內。
(4)EPHEMERAL_SEQUENTIAL(臨時自動編號節點):此節點屬於臨時節點,不過帶有順序,客戶端會話結束,節點就消失。
第三章:Zookeeper的安裝(單機版)
安裝環境: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集群原理
4.1:Zookeeper集群中的角色
Zookeeper集群中的角色主要有以下三類:
4.2:設計目的
(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創建集群
使用三個zookeeper搭建一個偽集群,應用部署在linux系統:192.168.110.128;伺服器監聽埠為2181、2182、2183;投票選舉埠為2881/3881、2882/3882、2883/3883。
三個集群都在:/usr/local/zookeepercluster目錄下
子目錄分別為:zookeeper01、zookeeper02、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常見命令
啟動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
表示:退出控制台