一、前言
Zookeeper是一个为分布式应用所设计的开源协议服务。它可以为用户提供同步、配置、管理、分组和命名等服务。用户可以使用Zookeeper提供的实现一致性、组管理、Leader选举及某些协议。
二、zooKeeper特点
简单的、丰富的组件(分布式队列、分布式锁和同级选举)、高可用、松耦合、资源库
Zookeeper可以看成一个具有高可用的文件系统,但这个文件系统没有文件和目录,而是统一使用节点,称为Znode。所有的Znode 构成层次化的命名空间。一种自然的建立组
成员列表的方式就是利用这种层次结构,创建一个以组名为节点的znode作为父亲节点。
三、ZooKeeper API 的使用
package hadoop.v15;
import java.io.IOException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
public class Demo {
//会话超时时间,设置为与系统默认时间一致
private static final int SESSION_TIMEOUT=30000;
//创建ZooKeeper实例
ZooKeeper zk;
//创建Watcher实例
Watcher wh=new Watcher(){
public void process(org.apache.zookeeper.WatchedEvent event)
{
System.out.println(event.toString());
}
};
//初始化ZooKeeper实例
private void createZKInstance() throws IOException
{
zk=new ZooKeeper("192.168.100.150:2181",Demo.SESSION_TIMEOUT,this.wh);
}
private void ZKOperations() throws IOException,InterruptedException,KeeperException
{
System.out.println("\n1.创建ZooKeeper节点(znode:zoo2,数据:myData2,权限:OPEN_ACL_UNSAFE,节点类型:Persistent");
zk.create("/zoo2","myData2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("\n2.查看是否创建成功:");
System.out.println(new String(zk.getData("/zoo2",false,null)));
System.out.println("\n3.修改节点数据");
zk.setData("/zoo2", "shenlan211314".getBytes(), -1);
System.out.println("\n4.查看是否修改成功:");
System.out.println(new String(zk.getData("/zoo2", false, null)));
System.out.println("\n5.删除节点");
zk.delete("/zoo2", -1);
System.out.println("\n6.查看节点是否被删除:");
System.out.println("节点状态:["+zk.exists("/zoo2", false)+"]");
}
private void ZKClose() throws InterruptedException
{
zk.close();
}
public static void main(String[] args) throws IOException,InterruptedException,KeeperException {
Demo dm=new Demo();
dm.createZKInstance( );
dm.ZKOperations();
dm.ZKClose();
}
}
四、ZooKeeper的数据模型
1、Znode
zookeeper目录树中的每一个节点对应着一个Znode,每个Zonde 维护着一个属性结构,包含版本号、时间戳等状态信息.
Watches
分为两类:数据Watch(data watch) , 孩子watch(child watch)
数据访问(ACL)
acl不能被子节点继承父节点所拥有的权限与子节点的权限没有任何关系。
Zookeeper ACL 的使用依赖于验证,支持如下几种验证模式
world 代表某一特定的用户
auth 代表任何已经通过验证的用户
digest 通过用户名和密码的用户
ip 通过客户端ip地址验证
API支持的三种标准用户权限
ZOO_OPEN_ACL_UNSAFE
ZOO_READ_ACL_UNSAFE
ZOO_CREATE_ALL_ACL
临时节点
顺序节点(唯一性保证)
2、Zookeeper时间
Zxid
版本号
3、节点属性结构