Zookeeper 基础
Zookeeper(以下简称ZK), 动物管理员。是一个分布式应用程序的协调服务框架,是Hadoop的一个重要组成组件。
分布式应用需要解决的问题:
- 数据一致性
- 统一的命名服务
- 配置管理
- 分布式锁
- 集群管理
ZK安装
参见官网教程…(需要安装在Linux系统下)
ZK指令和数据结构
ZK有一个最开始的节点(/)。ZK的节点叫做znode节点,每个znode节点都可以存储数据,每个znode节点都可以创建自己的子节点。
znode和ZK根节点组成了一个znode树。znode树维系在内存中,查询起来是很快的。
每个znode都有一个名称,并且这个名称是唯一的。
要想运行ZK的指令,需要先启动ZKServer,然后启动ZKClient。
在ZK的bin路径下,执行下面两个命令:
./zkServer.sh start
./zkCli.sh
启动ZK客户端后可以进入ZK的命令行模式,有如下常见的命令:
- ls: 查看节点,例如:ls /
- create znode data:创建节点,例如:create /zk01 hello
- 不加参数表示创建普通持久节点
- 加上-e参数表示创建普通临时节点,这样的节点在连接断开后将会消失。利用临时节点可以检查集群节点有没有挂掉。注意临时节点不能拥有子节点。
- 加上-s表示创建一个顺序持久节点,这样的节点在不同的服务器抢占时会产生一个递增的顺序号。利用它可以实现分布式锁。
- 加上-s -e就表示创建临时顺序持久节点。
- get znode:查看节点数据,含有以下信息:
- DATA: 具体数据
- cZxid: 节点创建时的zxid
- ctime: 创建节点的时间戳
- mZxid: 节点最新一次更新发生的zxid
- mtime: 修改此节点数据的最新时间戳
- cversion: 子节点的更新次数
- dataVsersion: 数据版本号,每次数据发生修改,递增1
- aclVersion: 节点ACL(授权信息)更新次数
- ephemeralOwner: 如果节点为临时的,表示和该节点绑定的session id。如果不是则为0。
- dataLength: 数据大小
- numChildren: 子节点个数
- set znode data: 修改节点数据
- delete znode: 删除一个节点。注意如果节点有子节点则禁止删除。
- quit: 退出ZK客户端
对于ZK集群中每个节点来说,znode树都是一致的,命名也是完全一致的。具体在后面会有介绍。S
ZK API
Zookeeper是由Java实现的分布式框架。下面我们来看如果通过Java程序来操作znode。
基本方法
ZooKeeper是一个类,构造方法参数如下:
- connectString: 包含连接信息的字符串,格式是:zk服务IP地址:端口号。zk默认服务监听端口是2181。
- sessionTimeout: 表示会话的超时时间,单位是ms。
- watcher: 观测者对象
在默认情况下,创建时采用的是非阻塞的模式。
以下代码可以检测是否连接上zkServer:
public class TestConnect {
public static void main(String[] args) throws IOException {
ZooKeeper zk = new ZooKeeper("192.168.117.21:2181", 3000,
(watchedEvent) -> System.out.println("连接成功!")
);
while (true);
}
}
加上while(true)是为了防止main线程提前结束导致”连接成功”无法被及时打印出来。
在连接的时候可能产生java.net.ConnectException。这是因为在服务器上没有打开zkServer。
我们可以使用闭锁的技术来保证Zookeeper连接成功再执行接下来的代码:
public class TestConnect {
public static void main(String[] args)