zookeeper
是乙個提供分布式程式協調服務的應用,它的命名空間類似linux
系統檔案路徑等等。 具體描述可以參考官網
本文將描述如何借助zookeeper
構建乙個簡單的任務發布執行應用,使用curator
。(我也是剛接觸zk
,如有不對的地方希望指出.謝謝)
我將任務發布部分作為server
,任務處理部分作為client
。
server
部分功能比較簡單。主要進行任務的發布。
首先server
啟動時向zk
建立節點/test
,為持久節點
之後我們向server
提交任務,假設任務名稱為localtask
,資料為hello world
。server
會向zk
的/test
節點下註冊新的任務節點,這是乙個持久節點,以任務名作為節點名,任務的資料存放在節點內。
client
部分主要接收任務,並允許任務。同時一旦某個執行任務所在的機器掛掉,其它機器能夠接管該任務。下面以乙個client
為例來介紹。
client
啟動時會向zk
新增對/test
節點的listener
。
server
發布任務後,client
能夠監聽任務節點的建立
當client
發現新任務時,首先會對該任務節點新增子節點變化的listener
,之後會嘗試對任務加鎖,加鎖成功的客戶端能夠執行任務。
如何進行加鎖: 建立任務節點的子節點/lock
,這是乙個臨時節點。 因為zookeeper
會保證多個客戶端同時建立同乙個節點,只有一客戶端能夠建立成功。當某台機器宕機,那麼就與zk
失去了心跳,那麼該臨時節點就會被刪除,那麼其它節點會嘗試去加鎖。
如果/lock
節點建立成功,則表示當前客戶端獲得了執行任務的權利。客戶端開始啟動任務
這裡只給出部分**,全部**
建立任務根節點
public
void
start()
catch
(exception e)
}}
建立任務
public
void
createtask
(string taskname,
byte
data)
trycatch
(exception e)
", path, e);}
}
新增對任務根節點的listener
public
void
registry()
throws exception "
, event.
getdata()
.getpath()
);lockandwork
(client, event)
;addlocklistener
(client, event.
getdata()
.getpath()
);break
;case child_removed:
log.
info
("child removed; node path: {}"
, event.
getdata()
.getpath()
);break;}
});}
server
任務發布後,建立對任務節點的listener
,並嘗試對任務加鎖,如果加鎖成功則執行任務
private
boolean
trylock
(curatorframework zkclient, string path)
catch
(exception e)
", path, e)
;return
false;}
return
true;}
private
void
lockandwork
(curatorframework zkclient, pathchildrencacheevent event)
//lock succeed
createtask
(nodedata);}
private
void
createtask
(byte
data)
", datastr)
;}
zookeeper簡單使用
zookeeper是一種分布式協調服務,用於管理大量主機。在分布式環境中協調和管理服務是乙個複雜的過 程。zookeeper通過其簡單的體系結構和api解決了這個問題。zookeeper允許開發人員專注於核心應用程式邏輯,而不必擔心應用程式的分布式性質。zookeeper框架最初是在 yahoo 構...
記錄乙個使用zookeeper資料同的乙個問題
今天在做zookeeper資料同步的時候,不知道是自己的啟動步驟錯了還是配置配有配,使用zookeeper做資料同步的時候資料一致無法同步到zookeeper,並且專案中的斷點也一直進不去。配置zookeeper作為資料同步方式,修改admin和bootstrap的配置檔案 zookeeper ur...
5 2 搭乙個zookeeper集群
在第乙個已經啟動起來的zookeeper,如果停止,用.zkserver.sh stop 如果要搭集群,那麼一定要修改配置檔案 在conf裡面的zoo.cfg裡修改 vim zoo.cfg 詳細解釋 zookeeper的預設配置檔案為zookeeper conf zoo sample.cfg,需要將...