http://zookeeper.apache.org/
Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly reliable distributed coordination.html
Zookeeper維護一個相似文件系統的數據結構:
每一個子目錄項如 zookeeper 都被稱做爲 znode,和文件系統同樣,咱們可以自由的增長、刪除znode,在一個znode下增長、刪除子znode,惟一的不一樣在於znode是能夠存儲數據的。java
znode有四種類型:
PERSISTENT: 持久化目錄節點
PERSISTENT_SEQUENTIAL: 持久化順序編號目錄節點
EPHEMERAL: 臨時目錄節點
EPHEMERAL_SEQUENTIAL: 臨時順序編號目錄節點node
客戶端註冊監聽它關心的目錄節點,當目錄節點發生變化(數據改變、被刪除、子目錄節點增長刪除)時,zookeeper會通知客戶端。linux
能夠註冊watcher的方法:getData、exists、getChildren。
能夠觸發watcher的方法:create、delete、setData。鏈接斷開的狀況下觸發的watcher會丟失。
一個Watcher實例是一個回調函數,被回調一次後就被移除了。若是還須要關注數據的變化,須要再次註冊watcher。
New ZooKeeper時註冊的watcher叫default watcher,它不是一次性的,只對client的鏈接狀態變化做出反應。apache
配置JAVA環境變量: JAVA_HOME
建立配置文件 zookeeper/conf/zoo.cfg:服務器
tickTime=2000 dataDir=/data/zookeeper clientPort=2181
tickTime: 客戶端與服務端鏈接的心跳間隔(毫秒)。
dataDir: 數據文件目錄。
clientPort: 客戶端鏈接服務端的端口。數據結構
運行啓動腳本
linux: zookeeper/bin/zkServer.sh
Windows: zookeeper/bin/zkServer.cmd分佈式
配置文件 zoo.cfg:ide
tickTime=2000 dataDir=/tmp/zookeeper clientPort=2181 initLimit=5 syncLimit=2 server.1=127.0.0.1:2888:3888 server.2=127.0.0.1:2889:3889 server.3=127.0.0.1:2890:3890
initLimit :服務端集羣之間初始化鏈接的心跳單位。
syncLimit :服務端集羣之間同步數據的心跳單位。
server.{myid}={每一個實例ip}:{集羣交換信息的端口}:{集羣選舉Leader的端口}函數
clientPort: 每一個實例不能相同。
myid: 集羣中服務器編號,須要在dataDir目錄中建立一個myid文件,內容就是編號的值。
僞集羣模式,因爲ip地址相同,因此全部的端口不能相同。
Zookeeper/bin/zkCli.sh 或 zkCli.cmd
zkCli.sh -server [ip]:[port]
-- 查看
ls /
-- 建立節點及數據
create /zoo "mydata"
-- 獲取節點數據
get /zoo
-- 設置(修改)節點數據
set /zoo "newData"
-- 刪除節點
delete /zoo
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183", 5000, new Watcher() { @Override public void process(WatchedEvent event) { System.out.println("event: " + event.getType()); } }); zk.create("/zoo", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zk.create("/zoo/node", "nodeData".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zk.setData("/zoo", "zooData".getBytes(), -1); System.out.println(new String(zk.getData("/zoo", false, null))); System.out.println(zk.getChildren("/zoo", false)); zk.delete("/zoo/node", -1); zk.delete("/zoo", -1); zk.close();
https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
參考資料:
http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html
https://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/
http://www.open-open.com/lib/view/open1415453633887.html