1、zookeeper下载安装命令
$ wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
$ tar -zxvf zookeeper-3.4.14.tar.gz
$ cd zookeeper-3.4.14
$ cd conf/
$ cp zoo_sample.cfg zoo.cfg
$ cd ..
$ cd bin/
$ sh zkServer.sh start
2、基本介绍
ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。
ZooKeeper 的架构通过冗余服务实现高可用性。
Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
3、zookeeper集群搭建(3台虚拟机)
(1) 分别在三台虚拟机解压安装包,并且创建zoo.cfg
cd /installment/zookeeper-3.4.14/conf
cp zoo_sample.cfg zoo.cfg
(2) 创建myid文件,在zoo.cfg文件末尾添加以下信息
//文件内容写1,2,3之类这些编号,myid对应下面在cfg文件里面添加的id
vim /tmp/zookeeper/myid
端口的作用:
2181 : 对 client 端提供服务
2888 : 集群内机器通信使用
3888 : 选举 leader 使用
/**
server.id=ip:port:port
其中ip通过ifconfig获得
*/
server.1=192.168.3.33:2888:3888
server.2=192.168.3.35:2888:3888
server.3=192.168.3.37:2888:3888
(3) 关闭机器防火墙
systemctl stop firewalld
(4) 逐台机器启动zookeeper服务端
cd /installment/zookeeper-3.4.14/bin
sh zkServer.sh start
//查看启动状态
sh zkServer.sh status
启动成功并且加入集群(leader/follower)
(5) 启动客户端
sh zkCli.sh
(6) 关闭zookeeper
sh zkServer.sh stop
4、java客户端
(1) 客户端的 zookeeper 原生 API
public class ZookeeperClient {
public static void main(String[] args) {
try {
final CountDownLatch countDownLatch = new CountDownLatch(1);
ZooKeeper zooKeeper=
new ZooKeeper("192.168.142.130:2181,192.168.142.131:2181,192.168.142.132:2181",
4000, new Watcher() {
// @Override
public void process(WatchedEvent event) {
if(Event.KeeperState.SyncConnected==event.getState()){
//如果收到了服务端的响应事件,连接成功
countDownLatch.countDown();
}
}
});
countDownLatch.await();
//CONNECTED
System.out.println(zooKeeper.getState());
//添加节点
zooKeeper.create("/runoob","0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
// zooKeeper.setData("/runoob","1".getBytes(),0);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
}
(2) 使用curator框架连接
Curator 是 Netflix 公司开源的一套 zookeeper 客户端框架,解决了很多 Zookeeper 客户端非常底层的细节开发工作,包括连接重连、反复注册 Watcher 和 NodeExistsException 异常等。
Curator 包含了几个包:
- curator-framework:对 zookeeper 的底层 api 的一些封装。
- curator-client:提供一些客户端的操作,例如重试策略等。
- curator-recipes:封装了一些高级特性,如:Cache 事件监听、选举、分布式锁、分布式计数器、分布式 Barrier 等。
public class CuratorClient {
public static void main(String[] args) throws Exception {
CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().connectString("192.168.142.130:2181,192.168.142.131:2181,192.168.142.132:2181").sessionTimeoutMs(4000).retryPolicy(new ExponentialBackoffRetry(1000,3)).namespace("").build();
curatorFramework.start();
Stat stat = new Stat();
byte[] bytes = curatorFramework.getData().storingStatIn(stat).forPath("/runoob");
System.out.println(new String(bytes));
curatorFramework.close();
}
}
5、znode
在 zookeeper 中,可以说 zookeeper 中的所有存储的数据是由 znode 组成的,节点也称为 znode,并以 key/value 形式存储数据。
整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。
进入 zookeeper 安装的 bin 目录,通过sh zkCli.sh打开命令行终端,执行 "ls /" 命令显示:
ls /runoob
6、命令
//ls 命令用于查看某个路径下目录列表
ls path
//用于查看某个路径下目录列表,它比 ls 命令列出更多的详细信息
ls2 path
//用于获取节点数据和状态信息,path:代表路径,[watch]:对节点进行事件监听
get path [watch]
//用于查看节点状态信息,path:代表路径,[watch]:对节点进行事件监听
stat path [watch]
/**用于创建节点并赋值
[-s] [-e]:-s 和 -e 都是可选的,-s 代表顺序节点, -e 代表临时节点,注意其中 -s 和 -e 可以同时使用的,并且临时节点不能再创建子节点,
path:指定要创建节点的路径,比如 /runoob,
data:要在此节点存储的数据
acl:访问权限相关,默认是 world,相当于全世界都能访问
*/
create [-s] [-e] path data acl
//用于修改节点存储的数据,path:节点路径,data:需要存储的数据,[version]:可选项,版本号(可用作乐观锁)
set path data [version]
//用于删除某节点,path:节点路径,[version]:可选项,版本号(同 set 命令)
delete path [version]
7、四字命令
使用nc(netcat)或者telnet向zookeeper提交命令
命令格式
echo [command] | nc [ip] [port]
四字命令 | 功能描述 |
conf | 3.3.0版本引入的。打印出服务相关配置的详细信息。 |
cons | 3.3.0版本引入的。列出所有连接到这台服务器的客户端全部连接/会话详细信息。包括"接受/发送"的包数量、会话id、操作延迟、最后的操作执行等等信息。 |
crst | 3.3.0版本引入的。重置所有连接的连接和会话统计信息。 |
dump | 列出那些比较重要的会话和临时节点。这个命令只能在leader节点上有用。 |
envi | 打印出服务环境的详细信息。 |
reqs | 列出未经处理的请求 |
ruok | 测试服务是否处于正确状态。如果确实如此,那么服务返回"imok",否则不做任何相应。 |
stat | 输出关于性能和连接的客户端的列表。 |
srst | 重置服务器的统计。 |
srvr | 3.3.0版本引入的。列出连接服务器的详细信息 |
wchs | 3.3.0版本引入的。列出服务器watch的详细信息。 |
wchc | 3.3.0版本引入的。通过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列表。 |
wchp | 3.3.0版本引入的。通过路径列出服务器watch的详细信息。它输出一个与session相关的路径。 |
mntr | 3.4.0版本引入的。输出可用于检测集群健康状态的变量列表 |
8、节点特性
(1) 同一级节点 key 名称是唯一的
(2) 创建节点时,必须要带上全路径
(3) session 关闭,临时节点清除
(4) 自动创建顺序节点
(5) watch 机制,监听节点变化
(6) delete 命令只能一层一层删除
9、权限控制ACL
10、实现分布式锁
可以使用curator框架的相关类
- 1、InterProcessMutex:分布式可重入排它锁
- 2、InterProcessSemaphoreMutex:分布式排它锁
- 3、InterProcessReadWriteLock:分布式读写锁