ZooKeeper是Hadoop下的一个子项目,它是针对大型分布式系统的可靠的协调系统,提供的功能包括配置维护、名字服务、分布式同步、组服务。
1.ZooKeeper API使用简介
实例化:
ZooKeeper zookeeper = new ZooKeeper(url, sessionTimeOut, null);
创建节点:
zookeeper.create("/root", "root data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
访问权限:Ids.OPEN_ACL_UNSAFE, 访问权限为开发
节点类型:CreateMode.PERSISTENT 持久节点,该节点客户端断开连接后不会删除
CreateMode.EPHEMERAL 临时节点,该节点客户端断开连接后删除
CreateMode.PERSISTEN_SEQUENTIAL 持久节点,其名下附加一个单调递增数
CreateMode.EPHEMERAL_SEQUENTIAL 临时节点,其名下附加一个单调递增数
设置节点和获取节点:
zookeeper.setData("/root", "hello".getBytes(), -1); // 设置/root节点的数据,版本号为-1,如果匹配不到相应的节点,会抛异常
// 获取/root节点的数据,并返回stat
Stat stat = new Stat();
byte[] data = zookeeper.getData("/root", false, stat);
添加子节点:
zookeeper.create("/root", "root data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
zookeeper.create("/root/child", "child data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
判断节点是否存在:
Stat stat = zookeeper.exists("/root/child", false);
if(stat == null){
// 节点不存在
}else{
// 节点存在
}
2. Zookeeper常常发生下面两种系统异常:
1)org.apache.ZooKeeper.KeeperException.ConnectionLossException, 客户端与其中的一台服务器的socker连接出现异常,连接丢失。
2)org.apache.ZooKeeper.KeeperException.SessionExpiredException, 客户端的session已经超过sessionTimeout,未进行任何操作
ConnectionLossException异常可以通过重试进行处理,客户端会根据初始化ZooKeeper时传递的服务列表,自动尝试下一个服务端节点,而在这段时间内,服务端节点变更的事件就会丢失。
SessionExpiredException异常不能通过重试进行解决,需要应用重新创建一个新的客户端(new ZooKeeper()),这时所有的watcher和EPHEMERAL节点都将丢失。