您的位置:首页 > 其它

ZooKeeper -- 分布式开源协调服务

2014-11-23 17:47 357 查看
  ZooKeeper是一个为分布式应用所设计的开源协调服务,适用于大型的分布式系统,可以提供统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等服务。ZooKeeper支持Java和C两种编程语言的接口,可以很方便地实现一致性、组管理、leader选举和某些协议。

一、ZooKeeper简介
1、一致性

  1) 顺序一致性:客户端的更新顺序与他们被发送的顺序相一致;

  2) 原子性:更新操作要么全部成功,要么全部失败;

  3) 单系统镜像:无论客户端连接到哪一个服务器,都可以看到相同的ZooKeeper视图;

  4) 可靠性:一旦一个更新操作被应用,那么在客户端再次更新它之前,其值将不会被改变;

  5) 实时性:在特定的一段时间内,系统的任何变更都将被客户端检测到;

2、为什么使用ZooKeeper

  大部分分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程(如资源、任务分配等),而目前大部分应用需要开发私有的协调程序,缺乏一个通用的机制。此外协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器,由此诞生了一个能提供通用的分布式锁服务,用以协调分布式应用系统的协调服务ZooKeeper。

3、Zookeeper节点类型

  Zookeeper的节点Znode有两种类型,分别是emphemeral(短暂的)和persistent(持久的),并且节点类型在创建时制定后就不可更改。

  emphmeral节点在客户端会话结束时就自动删除,短暂Znode下不可以有子节点。

  persistent节点不依赖于客户端会话,只有当客户端明确执行删除操作时,该节点才会被删除。

4、ZooKeeper的数据模型

  在ZooKeeper中存在着节点的概念,通常称为Znode。Znode既含有数据。又可以用来标识路径,因此既可以被看作是一个文件,又可以被看作是一个目录。Znode的目录结构如下图所示:

package com.hicoor.zookeeper;

import java.util.List;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

public class ZookeeperDemo {

private static String connectString = "172.19.7.31:2181";
private static int sessionTimeout = 999999;
private static String testNode = "/hans";

/**
* 为确保程序顺利运行,运行前最好关闭服务端的防火墙
*/
public static void main(String[] args) throws Exception {
//监视器
Watcher watcher = new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("触发事件:" + event);
}
};
//创建连接实例
ZooKeeper zooKeeper = new ZooKeeper(connectString, sessionTimeout, watcher);
System.out.println("获取连接:" + zooKeeper);

//创建节点并设置值
zooKeeper.create(testNode, "haha.mx".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

//重新设置节点值(不存在报异常)
zooKeeper.setData(testNode, "hicoor.com".getBytes(), -1);

//读取节点值
getNodeData(watcher, zooKeeper);

//删除节点
zooKeeper.delete(testNode, -1);
System.out.println("删除节点");

List<String> children = zooKeeper.getChildren("/", watcher);
System.out.println(children);

//关闭连接实例
zooKeeper.close();
}

//读取节点值
private static void getNodeData(Watcher watcher, ZooKeeper zooKeeper)
throws KeeperException, InterruptedException {

byte[] data = zooKeeper.getData(testNode, watcher, null);
System.out.println("读取的值:"+new String(data));
}

}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: