http://zookeeper.apache.org/
Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly reliable distributed coordination.
一、zookeeper提供了什么
1、文件系统
Zookeeper维护一个类似文件系统的数据结构:
每个子目录项如 zookeeper 都被称作为 znode,和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。
znode有四种类型:
PERSISTENT: 持久化目录节点
PERSISTENT_SEQUENTIAL: 持久化顺序编号目录节点
EPHEMERAL: 临时目录节点
EPHEMERAL_SEQUENTIAL: 临时顺序编号目录节点
2、通知机制 Watcher
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。
可以注册watcher的方法:getData、exists、getChildren。
可以触发watcher的方法:create、delete、setData。连接断开的情况下触发的watcher会丢失。
一个Watcher实例是一个回调函数,被回调一次后就被移除了。如果还需要关注数据的变化,需要再次注册watcher。
New ZooKeeper时注册的watcher叫default watcher,它不是一次性的,只对client的连接状态变化作出反应。
二、如何使用Zookeeper
1、单机模式部署
配置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
2、集群模式部署、伪集群部署
配置文件 zoo.cfg:
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地址相同,所以所有的端口不能相同。
3、通过命令行连接
Zookeeper/bin/zkCli.sh 或 zkCli.cmd
zkCli.sh -server [ip]:[port]
-- 查看
ls /
-- 创建节点及数据
create /zoo "mydata"
-- 获取节点数据
get /zoo
-- 设置(修改)节点数据
set /zoo "newData"
-- 删除节点
delete /zoo
4、通过JAVA API连接
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();
5、Zookeeper可视化工具ZooInspector
https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip

三、Zookeeper在中艺库分布式图片处理项目中的应用
参考资料:
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
来源:oschina
链接:https://my.oschina.net/u/3721212/blog/1561051