Zookeeper学习
Zookeeper概念
Zookeeeper是Apache Hadoop项目下的一个子项目,是一个树形目录
Zookeeper翻译过来就是动物管理员,它是用来管Hadoop(大象)、Hive(蜜蜂)、Pig(小猪)的管理员,简称zk
Zookeeper是一个分布式的、开源的、分布式应用程序的协调服务
Zookeeper提供的主要功能包括:
- 配置管理
- 分布式锁
- 集群管理
Zookeeper命令操作
Zookeeper数据模型
Zookeeper是一个树形目录服务,其数据模型和Unix的文件系统目录数很相似,拥有一个层次化结构
这里面的每一个节点都被称为:ZNode,每个节点上都会保存自己的数据和节点信息
节点可以拥有子节点,同时也允许少量(1MB)数据存储在该节点之下
节点可以分为四大类:
- PERSISTENT 持久化节点
- EPHEMERAL 临时节点
- PERSISTENT_SEQUENTITIAL 持久化顺序节点 : -s
- EPHEMERAL_SEQUENTIAL 临时顺序节点 ; -es
Zookeeper服务端常用命令
- 启动 ZooKeeper 服务:
./zkServer.sh start
- 查看 ZooKeeper 服务状态:
./zkServer.sh status
- 停止 ZooKeeper 服务:
./zkServer.sh stop
- 重启 ZooKeeper 服务:
./zkServer.sh restart
高版本不搭建集群无法查看服务
Zookeeper客户端常用命令
连接zookeeper服务器
./zkCli.sh –server ip:port
断开连接
quit
查看命令帮助
help
显示指定目录下节点
ls 目录
创建节点
crete /节点path value
获取节点值
get /节点path
设置节点值
set /节点值path value
删除节点
delete /节点path
创建临时节点
create -e /节点path value
创建顺序节点
create -s /节点path value
查询节点详细信息
ls -s /节点path
ZookeeperJavaAPI操作
Curator介绍
Curator是ApacheZookeeper的java客户端库
常见的Zookeeper Java API
- 原生Java API
- ZkClient
- Curator
Curator项目的目标是简化ZooKeeper客户端
CuratorAPI常用操作
建立连接
//建立连接
@Test
public void testConnect(){
//第一种方式
/**
* @param connectString 连接字符串 192.168.7.134:2181
* @param sessionTimeoutMs 会话超时时间 单位ms
* @param connectionTimeoutMs 连接超时时间
* @param retryPolicy 重试策略
*/
RetryPolicy retryPolicy=new ExponentialBackoffRetry(3000,10);
/*CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.7.134:2181", 60 * 1000, 15 * 1000, retryPolicy);
//开启连接
client.start();*/
//第二种方式
CuratorFramework client = CuratorFrameworkFactory.builder().connectString("192.168.7.134:2181").sessionTimeoutMs(60 * 1000)
.connectionTimeoutMs(15 * 1000).retryPolicy(retryPolicy).namespace("ybp").build();
client.start();
}
添加节点
/**创建节点 create 持久,临时,顺序,设置数据
* 基本创建
* 创建节点,带有数据
* 设置节点的类型
* 创建多级节点
*/
@Test
public void testCreate() throws Exception {
//基本创建
//如果创建节点没有指定数据,则默认将当前客户端的ip作为数据存储
//client.create().forPath("/app1");
//如果创建节点,没有指定数据,则默认将当前客户端的ip作为数据存储
//client.create().forPath("/app2","hehe".getBytes());
//设置节点类型
//默认类型:持久化
//String path = client.create().withMode(CreateMode.EPHEMERAL).forPath("/app3");
//创建多级节点
String path = client.create().creatingParentsIfNeeded().forPath("/app4/p1");
System.out.println(path);
}
删除节点
/**
* 删除节点 delete deleteall
* 删除单个节点
* 删除带有子节点的节点
* 必须成功删除
* 回调
*/
@Test
public void testDelete() throws Exception {
//删除单个节点
//client.delete().forPath("/app1");
//删除带有子节点的节点
client.delete().deletingChildrenIfNeeded().forPath("/app4");
//必须删除成功
client.delete().guaranteed().forPath("/app2");
//回调
client.delete().guaranteed().inBackground(new BackgroundCallback() {
@Override
p