http://www.biaodianfu.com/zookeeper.htmlhtml
=======node
----api
zookeeper這種數據結構有以下這些特色:服務器
1,每一個子目錄如NameService都被做爲znode,這個znode是被她所在的路徑惟一標示,網絡
若是Server1這個zndoe的標示爲/NameService/Server1session
2,znode能夠有字節點目錄,每一個znode能夠存儲數據,注意ephemeral類型的目錄節點不能有字節點目錄數據結構
3,znode是有版本的,每一個znode中存儲的數據能夠有多個版本,也就是一個訪問路徑中能夠村村多分數據app
4,znode能夠是臨時節點,一旦建立這個znode的客戶端與服務端失去聯繫,這個znode也將自動刪除,zk的client和server通訊採用長連接方式,每一個客戶端和服務器經過心跳來保持連接,這個連接狀態成爲session,若是znode是臨時節點,這個session失效,znode也就刪除了。框架
5,znode的目錄名能夠自動編號,app1-》app2異步
6,znode能夠被監控,包括這個目錄節點中存儲的數據的修改,字節點目錄的編號等。
===========
zookeeper client library 提供了api:
create(path,data,flags):建立一個znode,path爲路徑,data是要存儲在蓋znode上的數據,flags經常使用的有,
presisten,presistent_sequentail,ephemeral,ephemeral_sequentail
delete(path,version):刪除一個znode,能夠經過ersion刪除指定的版本,若是version是-1的話,表示刪除全部的版本
exists(path,watch):判斷指定的znode是否存在,並設置是否watch這個znode。這裏若是要設置Watcher的話,watcher是在建立zookeeper實例時指定的,若是要設置特定的Watcher的話,能夠調用另外一個版本的exists(path,watcher)。如下幾個帶watch的API也都相似。
getData(path,watch):讀取指定znode上的數據,並設置是否watch這個znode
setData(path,watch):讀取指定znode的數據,並設置是否watch這個znode
getChildren(path,watch):獲取指定znode的全部子znode的名字,並設置watch這個znode
sync(path):把全部在sync以前的更新操做都進行同步,達到每一個請求都在半數以上的zookeeper server上生效。path目前沒有用
setAcl(path,acl):設置指定znode的Acl信息
getAcl(path):獲取指定znode的acl信息。
================
zookeeper的應用場景:
1,命名服務:在分佈式系統中,經過使用命名服務,客戶端可以根據名字獲取資源或服務的地址,提供者等信息。被命名的實體一般能夠是集羣中的機器,提供的服務地址,遠程對象等等--這些咱們均可以統稱爲名字(Name)。其中較爲常見的就是一些分佈式服務框架中的服務地址列表。經過調用zk提供的建立節點的api,可以很容易建立一個全局唯一的path,這個path就能夠做爲一個名稱。
2,配置管理,
程序老是須要配置的,若是程序分散部署在多個機器上,要逐個配置變得困難。如今把這些配置所有放到zookeeper上,保存在zookeeper的某個目錄節點中,而後全部相關應用程序對這個目錄節點金像監聽,一旦配置信息發生變化,每一個應用程序就會受到zookeeper的通知,而後從zookeeper獲取新的配置信息應用到系統中就行了。
3,
集羣管理
所謂集羣管理就在於:是否有及其退出和加入,選舉master
對於第一個點,全部機器約定在父目錄groupMembers下建立臨時節點,而後監聽目錄節點的字節點變化消息。一旦有機器掛掉,該機器與zookeeper的連接斷開,起所建立的臨時目錄節點被刪除,全部其餘及其都受到通知:某個兄弟目錄被刪除了,因而全部人都知道了:他上船了。新機器加入也是相似,全部機器收到通知:新兄弟目錄加入,highcount又有了。
對於第二點:咱們稍微改變一下,全部機器建立臨時順序編號目錄節點,每次選取編號最小的機器做爲master就好。
==
4,分佈式鎖
有個zookeeper的一致性文件系統,鎖的問題變得容易。
鎖服務能夠分爲兩類,一個保持獨佔,另外一個控制時序。
http://www.biaodianfu.com/zookeeper.html
==============
func watchCallback-B create
event_type= 3
stat= 3
path= /signal_server/sig_5
func watchCallback-E
==========
func watchCallback-B delete
event_type= 2
stat= 3
path= /signal_server/sig_5
func watchCallback-E
===========
http://www.cnblogs.com/haippy/archive/2013/02/21/2920261.html
watches簡介
zookeeper中全部的讀——getData(), getChildren(), 和 exists() 都 能夠設置監視(watch),監視事件能夠理解爲一次性的觸發器, 官方定義以下: a watch event is one-time trigger, sent to the client that set the watch, which occurs when the data for which the watch was set changes。對此須要做出以下理解:
1,一次性觸發:one time trigger
當設置監視的數據發生改變時,該監視事件會被髮送到客戶端,例如,若是客戶端調用了 getData("/znode1", true) 而且稍後 /znode1 節點上的數據發生了改變或者被刪除了,客戶端將會獲取到 /znode1 發生變化的監視事件,而若是 /znode1 再一次發生了變化,除非客戶端再次對 /znode1 設置監視,不然客戶端不會收到事件通知。
2,發送至客戶端,sent to the client
zookeeper客戶端和服務端是經過socket進行通訊的,因爲網絡存在故障,因此監視事件頗有可能不會成功地到達客戶端,監視事件是異步發送到監視者的,zookeeper自己提供了ordering guanrantee:即client首先看到了監視事件後,纔會感知到它所設置監視的znode發生了變化(a client will never see a change for which it has set a watch until it first sees the watch event).網絡延遲或其餘因素可能致使不一樣的客戶端在不一樣的時刻感知某一監視事件,可是不一樣的客戶端所看到的一切具備一致的順序。
3,被設置watch的數據,the data for which the watch was set
這意味着znode節點自己具備不一樣的改變方式。你能夠想象zookeeper維護了兩條監視鏈表:數據監視和子節點監視(data watches and child watches)getData() and exists()設置數據監視,getChildren()設置子節點監視。
或者,你能夠想象zookeeper設置的不一樣監視返回不一樣的數據,getData()和exists()返回znode節點的相關信息,而getChildren()返回字節點列表。所以,setData()會觸發設置在某一節點上所設置的數據監視(假定數據設置成功),而一次成功的create()操做則會發出當前節點上所設置的數據監視以及父節點的字節點監視。一次成功的delete()操做將會觸發當前節點的數據監視和字節點監視事件,同時也會觸發該父節點的child watch.
==
Zookeeper 中的監視是輕量級的,所以容易設置、維護和分發。當客戶端與 Zookeeper 服務器端失去聯繫時,客戶端並不會收到監視事件的通知,只有當客戶端從新鏈接後,若在必要的狀況下,之前註冊的監視會從新被註冊並觸發,對於開發人員來講 這一般是透明的。只有一種狀況會致使監視事件的丟失,即:經過 exists() 設置了某個 znode 節點的監視,可是若是某個客戶端在此 znode 節點被建立和刪除的時間間隔內與 zookeeper 服務器失去了聯繫,該客戶端即便稍後從新鏈接 zookeeper服務器後也得不到事件通知。
=============
連接狀態Stat相關的常量
如下常量均與 Zookeeper 鏈接狀態有關,他們一般用做監視器回調函數的參數。
ZOOAPI const int ZOO_EXPIRED_SESSION_STATE
ZOOAPI const int ZOO_AUTH_FAILED_STATE
ZOOAPI const int ZOO_CONNECTING_STATE
ZOOAPI const int ZOO_ASSOCIATING_STATE
ZOOAPI const int ZOO_CONNECTED_STATE
=============
與監視類型(watch types)相關的常量
如下常量標示監視事件的類型,一般用做監視器回調函數的第一個參數:
ZOO_CREATED_EVENT; // 節點被建立(此前該節點不存在),經過 zoo_exists() 設置監視。
ZOO_DELETED_EVENT; // 節點被刪除,經過 zoo_exists() 和 zoo_get() 設置監視。
ZOO_CHANGED_EVENT; // 節點發生變化,經過 zoo_exists() 和 zoo_get() 設置監視。
ZOO_CHILD_EVENT; // 子節點事件,經過zoo_get_children() 和 zoo_get_children2()設置監視。
ZOO_SESSION_EVENT; // 會話丟失
ZOO_NOTWATCHING_EVENT; // 監視被移除。
==Zookeeper C API中各類回到函數簡介
監視函數(watch function)原型:
typedef void (*watcher_fn)(zhandle_t *zh, int type, int state, const char *path,void *watcherCtx);
//zk zookeeper句柄
//type 事件類型(event type).*_EVENT常量之一
//state 連接狀態(conncetion state).狀態值*_STATE常量之一
//path觸發監視事件的znode節點的路徑,若未null,則事件類型爲ZOO_SESSION_EVENT
//watcherCtx
====
其餘回調函數的原型:
Zookeeper 中還有幾種在異步 API(通常以 zoo_a*開頭的函數) 中使用的回調函數,根據回調函數處理異步函數返回值類型的不一樣分爲如下幾類:處理返回 void 類型的回調函數,處理返回 Stat 結構的回調函數,處理返回字符串的回調函數,處理返回數據的回調函數,處理返回字符串列表(a list of string)的回調函數,同時處理返回字符串列表(a list of string)和 Stat 結構的回調函數,以及處理返回 ACL 信息的回調函數
=====
‘
function callback_children($path){ echo "callback_children-b \r\n"; echo "<br>=====$path<br> \r\n"; $arr_path = explode('/', $path); $key = $arr_path[1]; echo "$key \r\n"; if(!isset($this->valueTkey[$key])){ $this->valueTkey[$key] = array(); } if (!isset($_SESSION[$key])){ $_SESSION[$key] = array(); } var_dump($_SESSION[$key]); $value = $this->getChildren($path); unset($_SESSION[$key]); foreach ($value as $item){ array_push($_SESSION[$key], $item); } var_dump($_SESSION); echo "callback_children-e\r\n";}