相关定义:Zookeeper类似于一个树形文件系统,Zookeeper里面的文件既可以是文件也可以是文件夹,每个文件都可以有子文件,这样的每个文件叫做Znode,每个Znode都很小,大小在千字节(kilobyte range)。
相关功能:Zookeeper支持监听机制(watches),client可以在Znode上注册一个监听事件,当Znode发生变化的时候会通知client,当client于Zookeeper断开连接,client也会收到相应的通知。
Zookeeper特性
1.顺序一致性 按照客户端发送请求的顺序更新
2.原子性:更新要么成功,要么失败,不会出现部分更新
3.单一性:无论客户端连接哪个sever,看到的数据都相同
4.可靠性:一旦数据更新成功,将一直保持一致
5.及时性:客户端会在一个确定的时间内得到数据
Zookeeper linux安装单机版
1.下载zookeeper-3.4.12.tar.gz,上传服务器解压
2.进入conf目录,修改zoo_sample.cfg为zoo.cfg,具体zoo.cfg配置详情可以自定义
3.启动Zookeeper服务,./zkServer.sh start
4.测试连接,./zkCli.sh
Zookeeper Java使用
<!-- zookeeper依赖包-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.12</version>
</dependency>
/**
* Zookeeper 基本操作
* @author xiang.xin
*/
public class Zookeeper01 implements Watcher{
private static ZooKeeper zk = null;
private static CountDownLatch countDownLatch = new CountDownLatch(1);
private static Stat stat = new Stat();
public static void main(String[] args) {
try {
String path = "/zk";
zk = new ZooKeeper("192.168.1.250:2181",5000,new Zookeeper01());
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
zk.create(path,new String("zookeeper").getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void process(WatchedEvent watchedEvent) {
/**
* 连接成功
*/
if(Event.KeeperState.SyncConnected == watchedEvent.getState()){
System.out.println("Zookeeper连接成功====");
if(Event.EventType.None == watchedEvent.getType() && watchedEvent.getPath() == null){
countDownLatch.countDown();
}
if(Event.EventType.NodeDataChanged == watchedEvent.getType()){
try {
System.out.println("Zookeeper配置发生改变===="+new String(zk.getData(watchedEvent.getPath(),true,stat)));
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(Event.EventType.NodeDeleted == watchedEvent.getType()){
try {
System.out.println("Zookeeper配置删除===="+new String(zk.getData(watchedEvent.getPath(),true,stat)));
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(Event.EventType.NodeCreated == watchedEvent.getType()){
try {
System.out.println("Zookeeper配置创建===="+new String(zk.getData(watchedEvent.getPath(),true,stat)));
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}else {
System.out.println("Zookeeper连接失败====");
}
}
}