複製鏈接
請複製以下鏈接發送給好友

zookeeper

(分佈式應用程序協調服務軟件)

鎖定
ZooKeeper是一個分佈式的,開放源碼分佈式應用程序協調服務,是Google的Chubby一個開源的實現,是HadoopHbase的重要組件。它是一個為分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。
ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用户。
ZooKeeper包含一個簡單的原語集,提供Java和C的接口。
ZooKeeper代碼版本中,提供了分佈式獨享鎖、選舉、隊列的接口,代碼在$zookeeper_home\src\recipes。其中分佈鎖和隊列有Java和C兩個版本,選舉只有Java版本。(概述圖片來源:)
中文名
動物園管理員
外文名
ZooKeeper
類    別
分佈式系統的可靠協調系統
特    點
高效,可靠
領    域
大數據技術,分佈式系統
所屬分類
Hadoop的正式子項目

zookeeper工作原理

ZooKeeper是以Fast Paxos算法為基礎的,Paxos 算法存在活鎖的問題,即當有多個proposer交錯提交時,有可能互相排斥導致沒有一個proposer能提交成功,而Fast Paxos做了一些優化,通過選舉產生一個leader (領導者),只有leader才能提交proposer,具體算法可見Fast Paxos。因此,要想弄懂ZooKeeper首先得對Fast Paxos有所瞭解。
ZooKeeper的基本運轉流程:
1、選舉Leader。
2、同步數據。
3、選舉Leader過程中算法有很多,但要達到的選舉標準是一致的。
4、Leader要具有最高的執行ID,類似root權限
5、集羣中大多數的機器得到響應並接受選出的Leader。

zookeeper特點介紹

在Zookeeper中,znode是一個跟Unix文件系統路徑相似的節點,可以往這個節點存儲或獲取數據。如果在創建znode時Flag設置為EPHEMERAL,那麼當創建這個znode的節點和Zookeeper失去連接後,這個znode將不再存在在Zookeeper裏,Zookeeper使用Watcher察覺事件信息。當客户端接收到事件信息,比如連接超時、節點數據改變、子節點改變,可以調用相應的行為來處理數據。Zookeeper的Wiki頁面展示瞭如何使用Zookeeper來處理事件通知,隊列,優先隊列,鎖,共享鎖,可撤銷的共享鎖,兩階段提交。
那麼Zookeeper能做什麼事情呢,簡單的例子:假設我們有20個搜索引擎的服務器(每個負責總索引中的一部分的搜索任務)和一個總服務器(負責向這20個搜索引擎的服務器發出搜索請求併合並結果集),一個備用的總服務器(負責當總服務器宕機時替換總服務器),一個web的cgi(向總服務器發出搜索請求)。搜索引擎的服務器中的15個服務器提供搜索服務,5個服務器正在生成索引。這20個搜索引擎的服務器經常要讓正在提供搜索服務的服務器停止提供服務開始生成索引,或生成索引的服務器已經把索引生成完成可以提供搜索服務了。使用Zookeeper可以保證總服務器自動感知有多少提供搜索引擎的服務器並向這些服務器發出搜索請求,當總服務器宕機時自動啓用備用的總服務器。

zookeeper客户端

注:以下代碼依賴於PHP擴展libzookeeper。
連接集羣:
<?php
$zc = new ZookeeperClient();
$zc->connect('192.168.0.2:2181, 192.168.0.3:2181');
?>
創建節點:
<?php
$zc = new ZookeeperClient();
$zc->connect('localhost:2181');
$zc->create('/new_node', 'node_value');
?>
刪除節點:
<?php
$zc = new ZookeeperClient();
$zc->connect('localhost:2181');
$zc->delete('/existing_node');
?>
獲取節點值:
<?php
$zc = new ZookeeperClient();
$zc->connect('localhost:2181');
var_dump($zc->get('/existing_node'));
?>
獲取子節點:
<?php
$zc = new ZookeeperClient();
$zc->connect('localhost:9010');
$childNodes = $zc->getChildren('/parent_node');
foreach ($childNodes as $nodeName) {
var_dump($nodeName);
}
?>

zookeeper其他信息

HBase和ZooKeeper
HBase內置有ZooKeeper,也可以使用外部ZooKeeper。
讓HBase使用一個已有的不被HBase託管的ZooKeeper集羣,需要設置 conf/hbase env sh文件中的HBASE_MANAGES_ZK 屬性為 false
... # Tell HBase whether it should manage it's own instance of Zookeeper or not. export HBASE_MANAGES_ZK=false
接下來,指明Zookeeper的host和端口。可以在 hbase-site.xml中設置, 也可以在HBase的CLASSPATH下面加一個zoo.cfg配置文件。 HBase 會優先加載 zoo.cfg 裏面的配置,把hbase-site.xml裏面的覆蓋掉.
當HBase託管ZooKeeper的時候,Zookeeper集羣的啓動是HBase啓動腳本的一部分。但你需要自己去運行。你可以這樣做
${HBASE_HOME}/bin/hbase-daemons sh {start,stop} zookeeper
你可以用這條命令啓動ZooKeeper而不啓動HBase. HBASE_MANAGES_ZK 的值是 false, 如果你想在HBase重啓的時候不重啓ZooKeeper,你可以這樣做
對於獨立Zoopkeeper的問題,你可以在 Zookeeper啓動得到幫助. [1] 
參考資料