分布式编程中,网络中各个节点的数据同步,数据一致性保障,事务控制,容错控保障等都需要一个稳定可靠的协调服务。Zookeeper则是分布式程序中使用最广泛的协调服务技术。从前面的kafka,storm,ignite使用文章中我们可以看到,Zookeeper广泛用于这些方分布式大数据技术的节点选举以及数据同步等服务。百度百科上对Zookeeper的介绍如下:
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,[1] 提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3src ecipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
Zookeeper实际上组织了一个分布式的树形目录数据结构(类似windows的文件夹系统),各个Zookeeper节点可以同步监听目录树的增删改,所以可以通过对目录树的操作来达到数据同步的目的。
本文简单介绍Zookeeper在Java编程中对树形目录增删改操作,Zookeeper详细介绍请参考后续文章。
1、 Zookeeper服务端搭建暂且不表,可以参考《Ignite集群管理——基于Zookeeper的节点发现》中单机zookeeper的安装步骤;
2、 Zookeeper树形目录增删改查代码
package com.coshaho.learn.zookeeper; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper; /** * * ZookeeperTest.java Create on 2017年6月10日 下午11:07:02 * * 类功能说明: zookeeper入门 * * Copyright: Copyright(c) 2013 * Company: COSHAHO * @Version 1.0 * @Author coshaho */ public class ZookeeperHelloWorld { private static final int TIME_OUT = 3000; private static final String HOST = "192.168.1.104:12181"; public static void main(String[] args) throws Exception { ZooKeeper zookeeper = new ZooKeeper(HOST, TIME_OUT, null); // 创建目录/coshaho if(zookeeper.exists("/coshaho", false) == null) { // 参数:目录名称,目录数据,不进行ACL控制,节点为永久性目录 zookeeper.create("/coshaho", "zookeeper, I'm comming.".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } // 查询目录/coshaho数据 System.out.println("节点/coshaho数据为:" + new String(zookeeper.getData("/coshaho", false, null))); // 创建目录/coshaho/learn if(zookeeper.exists("/coshaho/learn", false) == null) { zookeeper.create("/coshaho/learn", "Hello, zookeeper.".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } // 查询目录/coshaho/learn数据 System.out.println("节点/coshaho/learn数据为:" + new String(zookeeper.getData("/coshaho/learn", false, null))); // 修改目录/coshaho/learn数据 String data = "I have modified node text."; zookeeper.setData("/coshaho/learn", data.getBytes(), -1); // 查询目录/coshaho/learn数据 System.out.println("修改节点/coshaho/learn数据后:" + new String(zookeeper.getData("/coshaho/learn", false, null))); // 删除目录 //zookeeper.delete("/coshaho/learn", -1); zookeeper.close(); } }
3、 运行结果
4、 命令行连接Zookeeper服务端:zkCli.sh -server {IP}:{Port}
5、 可以看到,/coshaho/learn目录成功创建,/coshaho目录文本信息和程序设置一致
6、 maven配置
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency>