zookeeper使用

⼀一、概述
官⽹网
https://zookeeper.apache.org/
介绍
ZooKeeper是⼀一个开源的分布式应⽤用协调服务系统,主要⽤用来完成统⼀一命名服务、状态同步服务、集
群管理理、分布式应⽤用配置项的管理理等⼯工作。
特点
1. ZooKeeper有⼀一个层次化的名称空间,很像⼀一个分布式⽂文件系统(树形层次结构)
2. ZooKeeper树中的每个节点被称为——Znode
3. Znode,兼具⽂文件和⽬目录两种特点。既像⽂文件⼀一样维护着数据、元信息、ACL、时间戳等数据结
构,⼜又像⽬目录⼀一样可以作为路路径标识的⼀一部分
ZNode类型
ZooKeeper中的节点分为临时节点、永久节点和顺序节点。节点的类型在创建时即被确定,并且不不能
改变。
1. 临时节点(Ephemeral Node):该节点的⽣生命周期依赖于创建它们的会话。⼀一旦会话
(Session)结束,临时节点将被⾃自动删除,ZooKeeper的临时节点不不允许拥有⼦子节点。
2. 永久节点(Persistent Node):该节点的⽣生命周期不不依赖于会话,并且只有在客户端执⾏行行删除
操作的时候,他们才能被删除。
3. 顺序节点(Sequential Node):顺序节点可以是持久的或临时的。当⼀一个新的Znode被创建
为⼀一个顺序节点时,ZooKeeper通过将10位的序列列号附加到原始名称来设置Znode的路路径。例例
如,如果将具有路路径 /myapp 的znode创建为顺序节点,则ZooKeeper会将路路径更更改
为 /myapp0000000001 ,并将下⼀一个序列列号设置为0000000002。
Watches
客户端可以在节点上设置watch,我们称之为监视器器。当节点状态发⽣生改变时(ZNode的增、删、改)将
会触发watch所对应的操作。当watch被触发时,ZooKeeper将会向客户端发送且仅发送⼀一条通知。
⼆二、环境搭建
安装
注:单机模式为例例
1. 配置JDK的环境变量量
2. 下载
3. 解压
4. 修改配置⽂文件
启动
1. 启动ZK Server
2. 启动成功
wget http://mirrors.shu.edu.cn/apache/zookeeper/zookeeper-
3.4.11/zookeeper-3.4.11.tar.gz
tar -zxvf zookeeper-3.4.11.tar.gz -C /usr
修改配置⽂文件
cp /usr/zookeeper-3.4.11/conf/zoo_sample.cfg /usr/zookeeper-
3.4.11/conf/zoo.cfg
# 修改配置⽂文件
vi /usr/zookeeper-3.4.11/conf/zoo.cfg
tickTime=2000
dataDir=/root/zkData
clientPort=2181
cd /usr/zookeeper-3.4.11/bin
./zkServer.sh start ../conf/zoo.cfg
三、ZooKeeper指令操作
使⽤用客户端脚本连接ZK Server
常⽤用指令
help 帮助
connect host:port 连接到指定zk server
get path [watch] 获取指定节点数据
ls path [watch] 查看指定节点所有⼦子节点
set path data [version] 给指定节点设置数据
rmr path  递归删除指定节点
quit 退出客户端
create [-s][-e] path data acl 创建节点 -s 顺序节点 -e 临时节点
close 关闭连接
delete path [version] 删除节点
四、JAVA API操作
Maven依赖坐标
增、删、改、查操作
./zkCli.sh -server ip:port
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.8</version>
</dependency>
package com.baizhi.zookeeper;
import org.I0Itec.zkclient.ZkClient;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Date;
import java.util.List;
/**
* @author gaozhy
* @date 2018/3/5.16:26
*/
public class ZkClientOperation {
private ZkClient zkClient = null;
@Before
public void before(){
zkClient = new ZkClient("192.168.128.160");
}
/**
* 增删改查
*/
@Test
public void zkCRUD(){
// 创建持久节点
zkClient.createPersistent("/tencent",true);
// 创建临时节点
zkClient.createEphemeral("/zpark","bzjy");
// 创建临时顺序节点
String e1 = zkClient.createEphemeralSequential("/tencent/league-of-
legends", "lol");
String e2 = zkClient.createEphemeralSequential("/tencent/cross-
fire", "cf");
System.out.println("创建的临时顺序节点e1:"+e1);
System.out.println("创建的临时顺序节点e2:"+e2);
// 获取节点列列表
List<String> list = zkClient.getChildren("/tencent");
list.forEach(n -> System.out.println(n));
// 删除节点
boolean result = zkClient.deleteRecursive("/tencent");
System.out.println("删除结果:"+result);
// 获取节点内容
Object data = zkClient.readData("/zpark");
System.out.println("/zpark 保存的数据为:"+data);
// 更更新节点内容
监听接⼝口 订阅⽅方法 取消订阅⽅方法
IZkChildListener subscribeChildChanges unsubscribeChildChanges
IZkDataListener subscribeDataChanges unsubscribeDataChanges
注册监听
在ZkClient中客户端可以通过注册相关的事件监听来实现对Zookeeper服务端事件的订阅,其中
ZkClient提供的常⽤用监听事件接⼝口有以下⼏几种:
测试代码:
zkClient.writeData("/zpark",new Date());
Object newData = zkClient.readData("/zpark");
System.out.println("/zpark 更更新后数据为:"+newData);
}
@After
public void after(){
zkClient.close();
}
}
package com.baizhi.zookeeper;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import java.io.IOException;
import java.util.List;
/**
* @author gaozhy
* @date 2018/4/20.17:32
*/
public class ZKListener {
public static void main(String[] args) throws IOException {
ZkClient zkClient = new ZkClient("192.168.128.160:2181");
// 订阅⼦子节点改变
zkClient.subscribeChildChanges("/tencent", new IZkChildListener() {
@Override
public void handleChildChange(String parentPath, List<String>
currentChilds) throws Exception {
System.out.println("parentPath: "+parentPath);
currentChilds.forEach( n -> System.out.println("child node:
"+n));
System.out.println("-----------------------------------");
五、应⽤用
命名服务(Naming Service)
如:阿⾥里里巴巴集团开源的分布式服务框架Dubbo中使⽤用ZooKeeper来作为其命名服务,维护全局的服
务地址列列表。在Dubbo实现中: 服务提供者在启动的时候,向ZK上的指定节
点/dubbo/${serviceName}/providers⽬目录下写⼊入⾃自⼰己的URL地址,这个操作就完成了了服务的发
布。 服务消费者启动的时候,订阅/dubbo/${serviceName}/providers⽬目录下的提供者URL地址, 并
向/dubbo/${serviceName} /consumers⽬目录下写⼊入⾃自⼰己的URL地址。 注意,所有向ZK上注册的地址
都是临时节点,这样就能够保证服务提供者和消费者能够⾃自动感应资源的变化。
}
});
// 订阅数据改变
zkClient.subscribeDataChanges("/tencent", new IZkDataListener() {
@Override
public void handleDataChange(String dataPath, Object data)
throws Exception {
System.out.println("data change: "+dataPath + ",change
data: "+data);
}
@Override
public void handleDataDeleted(String dataPath) throws Exception
{
System.out.println("delete node path: "+dataPath);
}
});
System.in.read();
}
}
集群管理理与Master选举
利利⽤用ZooKeeper有两个特性,就可以实时另⼀一种集群机器器存活性监控系统:
1. 客户端在节点 x 上注册⼀一个Watcher,那么如果 x?的⼦子节点变化了了,会通知该客户端。
2. 创建EPHEMERAL类型的节点,⼀一旦客户端和服务器器的会话结束或过期,那么该节点就会消失。
数据发布与订阅(配置中⼼心)
发布与订阅模型,即所谓的配置中⼼心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获
取数据,实现配置信息的集中式管理理和动态更更新。例例如全局的配置信息,服务式服务框架的服务地址
列列表等就⾮非常适合使⽤用。
分布式锁
分布式锁,这个主要得益于ZooKeeper为我们保证了了数据的强⼀一致性。锁服务可以分为两类,⼀一个是
保持独占,另⼀一个是控制时序。
更更详细的应⽤用场景,可参考:
1. http://jm.taobao.org/2011/10/08/1232/
2. https://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值