ZooKeeper集群管理

来源:互联网 发布:apche怎么使用php 编辑:程序博客网 时间:2024/06/05 00:39

ZooKeeper应用场景
1.数据订阅和发布
实现思路:
发布方注册一个节点/data
订阅节点监听这个/data 节点
只有节点发生变化,证明有新的数据产生,从而去获取数据
注意:不要在zookeeper上存储大量数据
2.分布式的协调通知(屏障)
实现思路:
注册一个节点/score
每个节点干完活之后,注册自己的子节点
排名节点判断数量是否满足,如果满足,开始排名工作
3.集群管理
实现思路:
每台机器注册临时节点,如果节点挂掉,是可以检测到的
4.集群的负载均衡
实现思路:
每台机器定时向zk服务集群通过自身的节点数据汇报负载情况,zk通过实施监控,从而做任 务分发,达到集群的负载均衡
5.实现分布式锁
实现思路:
多个节点同时抢注/park03 顺序节点,根据最小的顺序号来决定资源分配给谁。
客户端实现
final CountDownLatch cdl = new CountDownLatch(1);
ZooKeeper zk = new ZooKeeper(“192.168.1.61:2181”, 3000, new Watcher() {
@Override
public void process(WatchedEvent event) {
if (event.getState() == KeeperState.SyncConnected) {
System.out.println(“连接成功”);
cdl.countDown();
}
}});
cdl.await();
注意:Zookeeper这个方法是非阻塞方法,必须连接成功才能进行数据的传递,所以需要手动闭锁。
创建节点:
path:创建的路径名
data:存储的数据,要的是字节数组
acl:此节点的权限,Ids.OPEN_ACL_UNSAFE表示所有用户都可以操作此节点
createMode:节点类型:
EPHEMERAL:普通临时节点
EPHEMERAL_SEQUENTIAL:临时顺序节点
PERSISTENT:普通持久节点
PERSISTENT_SEQUENTIAL:持久顺序节点
zk.create(“/01”,”hellozk”.get PERSISTENT Bytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
获得节点数据:
path:指定路径
watch:观察者
Stat stat=new Stat();
byte[] data=zk.getData(“/park01”,null,null);
System.out.println(“数据为:”+new String(data));
System.err.println(stat);
节点数据更新:
path:
data:
version:数据版本号,用来更新数据的,注意,更新的版本号要和当前的版本号一直,否则更新不成功
此外,每成功进行一次写操作,数据版本号递增1
如果想无论如何都更新,忽略版本号,写-1
zk.setData(“/park01”,”helloZK”.getBytes(),-1);
得到当前结点的子节点:
List list=zk.getChildren(“/park01”,null);
for(String path:list){
System.out.println(path);
}
删除节点:
delete 只能删除为空的目录,假如有子节点,不能直接删除
zk.delete(“/park01”,-1);
持续监听节点是否更新:
for (;;) {
final CountDownLatch cdl1 = new CountDownLatch(1);
zk.getData(“/park01”, new Watcher() {
@Override
public void process(WatchedEvent event(闭锁会一直阻塞在这里知道获得值)) {
if (event.getType() == EventType.NodeDataChanged) {
System.out.println(“节点数据发生变化”);
cdl1.countDown();
}
}}, null);
cdl1.await();
}
CountDownLatch类,可以让线程一直等待,直到计数减为0。
监听创建并取得返回值:
// 删除 与 创建 EXISTS监听
zk.create(“/park04”,”helloworld”.getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL,new StringCallback() {
public void processResult(int rc, String path, Object ctx, String name) {
System.out.println(“rc:” + rc + “path:” + path + “ctx:” + ctx + “name:” + name);
}
}, “data”);
Rc:创建的状态码 0代表成功 -110代表失败
Path:节点的路径
Ctx:附件
Name:节点的名字

0 0