Windows Firefox mysql java Ubuntu Python 程序员 wordpress linux Android php shell google apache 云计算 centos 开源 编程 微软 nginx

Hadoop學習之ZooKeeper理論知識和集群安裝配置

1.   簡介:zookeeper是Google的Chubby的一個開源實現,是hadoop的分布式協調服務

2.    Zookeeper(簡稱zk)包含一個簡單的原語集,分布式應用程序可以給予它實現同步服務,配置維護和命名服務等

3.    Zk的設計目標

a)      簡單化:通過共享體系的,命名空間進行協調,與文件系統相似,有一些數據寄存器組成,被稱為Znode。Zk的數據是放在內存中的,zk可以達到高吞吐量、低延遲。

Zk能用在大型、分布式的系統。

嚴格的序列訪問控制意味者復雜的控制源可以用在客戶端上。

b)     健壯性:zk互相知道其他服務器存在。維護一個處於內存中的狀態鏡像,以及一個位於存儲器中的交換日誌和快照。只要大部分服務器可用,zk服務就可用。

c)      有序性:zk為每次更新賦予一個版本號,全局有序。

d)     速度優勢:讀主要負載時尤其快,當讀操作比寫操作多時,性能會更好。

e)      Zk還有原子性、單系統鏡像、可靠性和實效性特點。

4.    Zk可以用來保證數據在zk集群之間的數據的事務性的一致      (一般數據在2M以下)

5.    如何搭建zk集群

a)      前提:

                       i. Zk服務器集群規模不小於3個節點,並且各個服務器之間時間一致

b)       安裝:

將zookeeper的壓縮包上傳到Linux,通過winscp軟件,暫定為/usr/local/下,解壓zookeeper壓縮包

<pre name="code" class="plain">#tar –xzvf  zookeeper-3.4.5.tar.gz


為zookeeper-3.4.5改為簡單的名字,便於使用

#mv zookeeper-3.4.5 zk

添加環境變量
#vim /etc/profile


使環境變量生效

#source /etc/profile
進入zookeeper的配置文件目錄

#cd /usr/local/zk/conf

復制一份zoo_sample.cfg  並更名為zoo.cfg

#cp zoo_sample.cfg  zoo.cfg

修改zookeeper的配置文件zoo.cfg

#vim zoo.cfg

修改第十三行的datadir路徑為自己想要的路徑


配置三個zk服務器

其中第一個端口用來集群成員的信息交換,第二個端口是在leader掛掉時專門用來進行選舉leader所用。

創建文件夾data


#mkdir /usr/local/zk/data

在data目錄下,創建文件myid,並寫上對應的zoo.cfg中的標號
例如:server.1=hadoop1:2888:3888

則在hadoop1主機上的myid中添加1

 

在三臺hadoop機器上同步部署zk的文件夾及環境變量


#scp -r /etc/profile  hadoop2:/etc/
#scp -r /etc/profile hadoop3:/etc/

使得環境變量生效

#source /etc/profile
#scp -r /usr/local/zk/  hadoop2:/usr/local/
#scp -r /usr/local/zk/ hadoop3:/usr/local/

修改各個主機中的myid文件中的值,以便與zoo.cfg中的配置對應,使得zk能找到對應的機器
#echo 2 >/usr/local/zk/data/myid (機器hadoop2上)
#echo 3 >/usr/local/zk/data/myid (機器hadoop3上)

c)       啟動zk集群服務
在每臺機器上分別執行/usr/local/zk/bin/zkServer.sh文件


#/usr/local/zk/bin/zkServer.sh start

在這裏三臺zookeeper服務器會自動選舉loader然後其他的都是follower
檢驗每個節點上的zookeeper的角色狀態

#/usr/local/zk/bin/zkServer.sh status


6.    使用zookeeper

在命令行中執行/usr/local/zk/bin/zkCli.sh

a)    隨便輸入什麽,回車後可以查看提示信息

b)   試一試顯示的命令

create /test  test 創建一個路徑/test,設置數據位test

登錄另一臺zk服務器的客戶端,執行get /test命令,同樣會看到如上的結果,則證明機器間的數據同步成功

 

7.    配置zookeeper

Zk是通過配置文件zoo.cfg控制,各個機器上的配置文件幾乎是相同的,在集群部署時非常方便。

a)      最低配置:

                       i. clientPort:監聽客戶端連接的端口
                       ii.dataDir:存儲內存中數據庫快照的位置
                       iii. tickTime:基本事件單元,毫秒單位,控制心跳和超時,默認為tickTime的兩倍
b)     高級配置:

                       i. dataLogDir:事務日誌寫入” dataLogDir”指定的目錄,而不是dataDir指定的目錄。
                       ii.  maxClientCnxns:限制連接到zk的客戶端數量,限制並發連接的數量,通過ip區分客戶端。設置為0或不設置會取消並發連接的控制。
                       iii. minSessionTimeout和maxSessionTimeout
最小會話超時時間和最大會話超時時間,默認最小為tickTime的兩倍。最大為20倍。

c)      集群配置:

                       i. initLimit
允許follower連接並同步到leader的初始化連接時間,以tickTime的倍數表示,當時間超過tickTime的指定倍數時會失敗。
                     ii. syncLimit:
leader和follower之間發送消息時請求和應答的時間長度。如果follower在設置的時間內不能和leader通信,那此follower將被丟棄。
8.    Zookeeper特性

Zookeeper中指向節點的路徑必須使用規範的絕對路徑表示,並以斜線”/”分隔,zookeeper中不允許使用相對路徑。

a)      Znode:zk目錄樹中每個節點對應一個znode,每個znode維護者屬性結構,包含版本號、時間戳等狀態,跟linux的iNode節點作用類似。

Znode的主要特征:

                       i.   Watches:設置watch(監視器),節點發生改變時,會觸發watch對應操作,會向客戶端發送且只一個通知,因為watch只能被觸發一次。
                      ii.  數據訪問:zk中每個節點存儲的數據需要被原子性操作,每個節點都有ACL,限定了特定用戶對目標節點可以執行的操作。
                      iii.  臨時節點:節點分為臨時節點和永久節點,節點類型在創建時確定,不能被改變。Zk臨時節點的生命周期依賴創建他們的會話,會話結束臨時節點結束。臨時節點不能有子節點。永久節點不依賴會話,只能在客戶端執行刪除操作刪除。
                      iv. 順序節點:創建Znode時,用戶可在請求zk路徑結尾添加遞增計數。
b)     Zook中的時間

                       i.  Zxid:每一個操作都會使節點收到zxid格式的時間戳,全局有序。每個節點維護三個zxid:cZxid、mZxid、pZxid。
                     ii. 版本號:對節點每個操作會使該節點版本號增加,三個版本號:dataVersion(節點數據版本號)、cversion(子節點版本號)、aclVersion(節點所擁有的ACL版本號)
c)      Zookeeperwatches:zk可以為所有的讀操作設置watch,包括(exists()、getChildren()、getData()).watch是一次性觸發器。Watch事件將被異步發送到客戶端,並且zk為watch提供了有序的一致性保證。

Zookeeper的watch分為兩類:數據watch和子watch。exists()和getData()負責設置數據watch,getChildren()負責設置子watch。Create()和delete()觸發znode的數據watch和子watch

Watch由客戶端所連接的zookeeper服務器在本地維護,非常容易設置、管理和分派。

當客戶端連接新的服務器時,任何會話事件都可能觸發watch,當從服務器斷開連接時,watch不會被接收,但當客戶端重新連接時,先前註冊的watch會被重新註冊。

d)     ZookeeperACL

Ids.OPEN_ACL_UNSAFE  --> 對所有的ACL都完全開放,

Ids.READ_ACL_UNSAFE  --> 對任何應用程序都只有讀權限

Ids.CREATOR_ALL_ACL -->  節點創建者的所有權限,創建者必須通過服務器認證。

e)      zookeeper的一致性:順序一致性(與被發送順序一直)、原子性(要麽成功要麽失敗)、單系統鏡像(客戶端連接到集群的任一服務器看到相同的zookeeper視圖)、可靠性(1.客戶端成功返回代碼à成功,否則不知道操作是否生效;2.故障恢復時,任何客戶端能看到的執行成功的更新操作將不會回滾)和實時性(特定時間內,客戶端看到的系統是實時的,任何系統的改變將被客戶端看到,或者被客戶端偵測到)

9.    zookeeper進行leader選舉

核心思想:

1.首先創建EPHEMERAL目錄節點,如”/election”

2.每個zookeeper服務器在此目錄下創建一個SEQUENCE|EPHEMERAL類型節點”如/election/n_”,

3.zookeeper將自動為每個zookeeper服務器分配一個比前面所分配的序號要大的序號,擁有最小編號的zookeeper服務器將成為leader。

為了能在leader發生意外時,整個系統能選出leader,需要所有的follower都監視leader所對應節點,當leader故障時,leader對應的臨時節點將會被刪除,會觸發所有監視的follower的watch,從而進行選舉leader操作。

缺點:這樣的解決方案會導致”從眾效應。”

實現:每個follower為follower集群中對應著比自己節點序號小的節點中x序號最大的節點設置一個watch,只有當follower所設置的watch被觸發時,他才進行leader操作,一般講其設置為集群的下一個leader。這樣很快,因為每一leader選舉幾乎只涉及單個leaderfollower的操作

 

10.  zookeeper鎖服務

a)      zookeeper中完全分布的鎖是全局存在的。

b)     zookeeper的鎖機制(實現加鎖)

                       i.   zk調用create(),創建路徑格式為”_locknode/lock_”的節點,此節點類型為sequence(連續)和ephemeral(臨時),創建節點為臨時節點,所有節點連續編號à“lock-i”格式
                       ii. 在創建鎖節點上調用getChildren()方法,以獲取鎖目錄下的最小編號節點,並且不設置watch。
                       iii.  步驟2獲取的節點是步驟1中客戶端創建的節點,此客戶端會獲得該種類型的鎖,然後退出操作。
                      iv.  客戶端在鎖目錄上調用exists()方法,並設置watch來監視鎖目錄下序號相對自己次小的連續臨時節點的狀態。
                      v. 如果監視節點狀態發生變化,則跳轉到步驟2,繼續後續操作直到退出鎖競爭。
                      vi.Zookeeper解鎖簡單,只需在步驟1中創建的臨時節點刪除即可。

ps:1.一個客戶端解鎖後,將只可能有一個客戶端獲得鎖,因此每個臨時的連續節點對應一個客戶端,並且節點間沒有重疊;2.在zookeeper鎖機制中沒有輪詢和超時。

11.  BooKeeper

副本功能。提供可靠的日誌記錄。BooKeeper為每份日誌提供了分布式存儲,並且采用了大多數概念,就是說只要集群中大多數機器可用,那麽該日誌一直有效。

BooKeeper包含四個角色:賬本(服務器),賬戶(Ledger,賬本中存儲的一系列記錄)、客戶端(BooKeeper Client,允許APP在系統上進行操作,包括創建賬戶,寫賬戶)、元數據存儲服務(metadata storage service,存儲關於賬戶和版本的信息) 

延伸阅读

    评论