组件

ZooKeeper简单介绍

Umschalten
ZooKeeper简单介绍
zookeeper
Antwort
23.12.16 05:18

A. 资源与参考文档

 

B. 在本地(Windows系统)安装ZK

  1. 下载 zookeeper-3.4.8.tar.gz,解压
  2. 修改 conf 目录下的 zoo_sample.cfg(修改dataDir,指向本地文件夹),并重命名为 zoo.cfg(服务启动脚本默认找conf目录下的zoo.cfg文件)
  3. 双击 bin/zkServer.cmd 启动zk服务器
  4. 双击 bin/zkCli.cmd 连接到zk服务器
 

C. Linux系统下使用ZK

  • 启动服务:bin/zkServer.sh start
  • 客户端连接:bin/zkCli.sh -server 127.0.0.1:2181
 

D. ZK概览

以下是官网ZK overview 页面部分翻译
 
1. ZooKeeper为分布式应用提供分布式协作服务(Distributed Coordination Service
ZooKeeper为分布式应用提供一些原语(primitives),基于这些原语,分布式应用可以构建出用于同步、配置维护和分组与命名服务等高级服务。ZooKeeper使用的数据模型与操作系统中的目录树结构非常相似。
 
2. 设计目标
 
3. 数据模型与层级化名字空间(Data model and the hierarchical namespace)
ZooKeeper提供的名字空间非常像一个标准的文件系统。名字是由一系列的路径(path)元素通过反斜杠(/)组合而来的。ZooKeeper名字空间的每个节点(node)都是通过路径来标识的。
 
 
4. 节点与临时节点(Nodes and ephemeral nodes
与标准文件系统不同的是,ZooKeeper的每个节点能同时包含数据和子节点。有点像一个允许文件同时也能作为目录的文件系统。
ZooKeeper设计为存储协作数据,例如状态信息、配置信息、位置信息等,所以每个节点存储的数据通常都比较小,一般不超过1kb。
我们一般使用术语znode表示ZooKeeper的数据节点。
 
Znodes维持了一个状态结构,包含数据版本信息、ACL版本信息和时间戳等。每当znode的数据发生变化时,这些版本会增长。客户端获取节点数据时也会获取到这些数据的版本信息。
 
每个znode存储的数据的读、写操作都是原子性的。读操作获取znode的整个数据,而写操作会覆盖所有的数据。每个节点都可以配置ACL(Access Control List)来限制读写权限。
 
ZooKeeper可以创建临时节点。临时节点只在创建该节点的会话(session)处于活动状态时存在。当会话关闭时,临时节点被删除。
 
5. 条件修改与监视(Conditional updates and watches)
ZooKeeper支持对znode的监视。一次监视会在znode发生改变时触发并自动移除。当监视被触发时,客户端会受到znode改变相关的信息。
 

E. 常用命令

help
ls /
create /zk_test my_data
get /zk_test
set /zk_test my_data_v2
delete /zk_test
 

F. 简单代码示例

        try {
            //创建一个Zookeeper实例,第一个参数为目标服务器地址和端口,第二个参数为Session超时时间,第三个为节点变化时的回调方法
            ZooKeeper zk = new ZooKeeper("10.203.98.51:2181", 300000, new Watcher() {
                // 监控所有被触发的事件
                public void process(WatchedEvent event) {
                    System.out.println("## " + event.getWrapper() + " ##");
                    System.out.println("## " + event + " ##");
                }
            });
            //创建一个节点root,数据是mydata,不进行ACL权限控制,节点为永久性的(即客户端shutdown了也不会消失)
            String s = zk.create("/root", "mydata".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            System.out.println(s);
            //在root下面创建一个childone znode,数据为childone,不进行ACL权限控制,节点为永久性的
            s = zk.create("/root/childone", "childone".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            System.out.println(s);
            //取得/root节点下的子节点名称,返回List<String>
            List<String> children = zk.getChildren("/root", true);
            System.out.println(children);
            //取得/root/childone节点下的数据,返回byte[]
            byte[] data = zk.getData("/root/childone", true, null);
            System.out.println(new String(data));
            //修改节点/root/childone下的数据,第三个参数为版本,如果是-1,那会无视被修改的数据版本,直接改掉
            Stat stat = zk.setData("/root/childone", "childonemodify".getBytes(), -1);
            System.out.println(stat);
            //删除/root/childone这个节点,第二个参数为版本,-1的话直接删除,无视版本
            zk.delete("/root/childone", -1);
            zk.delete("/root", -1);
            //关闭session
            zk.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
 
 
+1 (1 Stimme)

RE: ZooKeeper简单介绍
Antwort
01.03.17 07:17 als Antwort auf 令国 孔.
找时间好好向国架构学习
0 (0 Stimmen)