二、安装与命令
[2.0 Zookeeper 安装配置 | 菜鸟教程 (runoob.com)](https://www.runoob.com/w3cnote/Zookeeper -setup.html)
2.1 安装
2.1.1 安装 jdk
-
安装jdk。创建目录 /usr/local/java ,将 jdk 安装包移入并解压至该目录。
-
配置jdk环境变量。
-
编辑 /etc/profile
JAVA_HOME=/usr/local/java/jdk1.8.0_231 CLASSPATH=JAVA_HOME/lib/ PATH=PATH:$JAVA_HOME/bin export PATH JAVA_HOME CLASSPATH
-
使配置文件生效:source /etc/profile
-
检查 java 环境变量是否生效:java -version | javac
-
2.1.2 安装 Zookeeper
- 安装 wget 下载工具。yum install -y wget
- 进入 Zookeeper 官网。复制相应版本的下载链接。
- 创建并进入目录 /usr/local/Zookeeper
- 下载并安装 Zookeeper :wget https://mirrors.bfsu.edu.cn/apache/Zookeeper /Zookeeper -3.5.9/apache-Zookeeper -3.5.9-bin.tar.gz
- 解压至目录 /usr/local/Zookeeper :tar -zxvf apache-Zookeeper -3.5.9-bin.tar.gz -C ./
- 修改配置文件名:cp zoo_sample.cfg zoo.cfg
-
启动 Zookeeper 客户端与服务端。进入 /usr/local/Zookeeper /bin
- 启动服务端:./zkServer.sh start
-
关闭服务端:./zkServer.sh stop
-
启动客户端并自动进入:./zkCli.sh
-
退出客户端:quit
2.2 配置文件
Zookeeper的配置文件:zoo.cfg
- 心跳间隔【tickTime】
- 初始化同步时间【initLimit】
- 运行时同步时间【syncLimit】
- 数据持久化路径【dataDir】
- 客户端连接服务端的端口【clientPort】
- 集群配置文件【server.id】
- 观察者角色【peerType】
# The number of milliseconds of each tick
tickTime=2000 # 心跳间隔
# The number of ticks that the initial
# synchronization phase can take
initLimit=10 # 集群启动时,Leader与Follower之间通信的最大时长【10个心跳时间】。若超出,则说明两者通信断开
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5 # 集群启动后,Leader与Follower之间通信的最大时长【5个心跳时间】。若超出,则说明两者通信断开
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/Zookeeper # 数据文件目录+数据持久化路径
# the port at which the clients will connect
clientPort=2181 # 客户端连接端口
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://Zookeeper .apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
# 观察者角色
# peerType=observer
# 并在集群中所有server的配置文件中,在配置成observer模式的server配置信息后追加:observer
# server.3=192.168.225.136:2289:3389:observer
# 集群配置信息
# server.A=B:C:D
# A:是一个数字,表示服务器的编号
# B:当前服务器的ip地址
# C:当前服务器与Zookeeper 集群中其他服务器进行通信的端口
# D:集群中选举Leader时的端口
# server.1=192.168.225.136:2287:3387
# server.2=192.168.225.136:2288:3388
# server.3=192.168.225.136:2289:3389
2.3 常用Shell命令
2.3.1 新增结点
create [-s] [-e] path data
# 其中 -s 为有序结点,-e 临时结点(默认是持久结点)
create /zdp "123456" # 默认创建持久化结点。此时,如果quit退出后再./ZkCient.sh 登入
# 再用输入 get /hadoop 获取,结点依然存在(永久结点)
create -s /a "a" # 创建一个持久化有序结点,创建的时候可以观察到返回的数据带上了一个id
create -s /b "b" # 返回的值,id递增了
create -s -e /aa "aa" # 依然还会返回自增的id,quit后再进来,继续创建,id依然是往后推的
create /aa/xx # 继续创建结点,可以看到pZxid变化了
- 默认创建方式【持久结点】:
- 创建持久有序结点【在结点名后添加自增ID】:
- 创建临时结点:
- 创建临时有序结点:
注意:在 Zookeeper 中只有一个序号计数器,统一管理着持久结点与临时结点的序号ID,以保证序号为一直递增状态。
2.3.2 修改结点
set path "newValue" [version]
# version 版本号
set /hadoop "345" # 修改结点值
set /hadoop "hadoop-x" 1 # 也可以基于版本号进行更改,类似于乐观锁,当传入版本号(dataVersion)
# 和当前结点的数据版本号不一致时,Zookeeper 会拒绝本次修改
结点的值可以被修改,但是结点的类型不允许被修改。
2.3.3 删除结点
- 删除单个结点
delete path [version]
和 set
方法相似,也可以传入版本号,版本号不一致时,将会禁止删除
delete /hadoop # 删除结点
delete /hadoop 1 # 乐观锁机制,与set 方法一致
- 删除当前结点及其后代结点
使用递归删除,命令为 deleteall path
2.3.4 查看结点状态
stat path
2.3.5 返回结点列表
ls path
ls / # 根结点
ls /hadoop # 可以查看结点的列表
ls -s /hadoop # 可以查看结点的列表以及目标结点的信息
2.3.6 监听器
需要注意的是
Zookeeper
的触发器是一次性的(One-time trigger
),即触发一次后就会立即失效。
(1)get 监听
使用get path [watch]
注册的监听器能够在结点内容发生改变的时候,向客户端发出通知。
get /hadoop watch # get 的时候添加监听器,当值改变的时候,监听器返回消息
set /hadoop 45678 # 测试
(2)ls 监听
使用 ls path [watch] 或 ls2 path [watch]
注册的监听器能够监听该结点下所有子结点的增加和删除操作。
ls /hadoop watch # 添加监听器
set /hadoop/node "node" # 更新结点
delete /hadoop/node # 删除结点
2.3.7 权限控制
Zookeeper
类似文件系统,client
可以创建结点、更新结点、删除结点,可以通过Zookeeper
的 access control list
访问控制列表实现对结点权限的控制。
acl
权限控制,使用scheme:id:permission
来标识,主要涵盖3个方面:
- 权限模式(
scheme
):授权的策略 - 授权对象(
id
):授权对象的id - 权限(
permission
):授予的权限
其特性如下:
-
Zookeeper
的权限控制是基于每个znode
结点的,需要对每个结点设置权限 -
每个
znode
支持多种权限控制方案和多个权限 -
子结点不会继承父结点的权限,客户端无权访问某结点,但可以访问它的子结点
// 将 IP 为:192.168.133.133 的客户端的结点权限设置为可以对结点进行增删改查和管理的权限
setAcl /test2 ip:192.168.133.133:crwda
(1)权限模式
权限模式scheme:采用何种方式授权
方案 | 描述 |
---|---|
world | 只有一个用户:anyone ,代表登录Zookeeper 所有人(默认) |
ip | 对客户端使用IP地址认证 |
auth | 使用已添加认证的用户认证【密码为明文形式】 |
digest | 使用"用户名:密码"方式认证【密码为密文形式】 |
(2)授权对象
授权对象id:权限被赋予的实体
方案 | 描述 |
---|---|
world | 只有一个用户:anyone ,代表登录Zookeeper 所有人(默认) |
ip | 对客户端使用IP地址认证 |
auth | 使用已添加认证的用户认证【密码为明文形式】 |
digest | 使用"用户名:密码"方式认证【密码为密文形式】 |
(3)权限类型
create、delete、read、writer、admin
也就是 增、删、查、改、管理权限,这5种权限简写为 c d r w a,注意:这五种权限中,有的权限并不是对结点自身操作的例如:delete是指对子结点的删除权限。可以试图删除父结点,但是子结点必须删除干净,所以delete
的权限也是很有用的。
权限 | ACL简写 | 描述 |
---|---|---|
create | c | 可以创建子结点 |
delete | d | 可以删除子结点(仅下一级结点) |
read | r | 可以读取结点数据以及显示子结点列表 |
write | w | 可以设置结点数据 |
admin | a | 可以设置结点访问控制权限列表 |
(4)相关命令
命令 | 使用方式 | 描述 |
---|---|---|
getAcl | getAcl path | 读取ACL权限 |
setAcl | setAcl path acl | 设置ACL权限 |
addauth | addauth scheme auth | 添加认证用户 |
2.4 ZK JavaAPI
Znode 是 Zookeeper 的核心组件,Zookeeper API 提供了一组方法使用 Zookeeper 来操纵 Znode 的所有细节。客户端应该遵循以下步骤,与 Zookeeper 服务端进行交互。
- 连接到 Zookeeper 服务器。Zookeeper 服务器为客户端为客户端分配会话 ID
- 定期向服务器发送心跳。否则,Zookeeper 服务器将为过期会话 ID,客户端需要重新连接
- 只要会话 ID 处于活动状态,就可以获取/设置 Znode
- 所有任务完成后,断开与 Zookeeper 服务器的连接。如果客户端长时间不活动,则 Zookeeper 服务器将自动断开客户端
2.4.1 连接至 ZK 服务器
public static void main(String[] args) throws IOException, InterruptedException {
// 计数器对象
CountDownLatch countDownLatch = new CountDownLatch(1);
// 服务器IP与端口号
// 客户端与服务器之间的会话超时时间,以毫秒为单位
// 监视器对象:监听客户端与服务端之间的连接状态
ZooKeeper zookeeper = new ZooKeeper("192.168.225.136:2181", 5000, (WatchedEvent x) -> {
if (x.getState() == Watcher.Event.KeeperState.SyncConnected) {
System.out.println("连接成功");
// 主线程结束阻塞状态
countDownLatch.countDown();
}
});
// 主线程阻塞等待连接对象的创建成功——通过监听器对象实现
countDownLatch.await();
System.out.println(zookeeper.getSessionId());
zookeeper.close();
}
ZooKeeper 创建连接时是异步进行的,所以此时需要借助一个对象来讲主线程进行阻塞,从而能够监听到客户端与服务端之间的连接是否已经建立成功。本段代码中使用的是计数器对象来进行线程的阻塞,并通过 ZooKeeper 的 Watcher 监听机制来监听客户端与服务端之间的连接状态。
2.4.2 新增结点
// 同步
create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
// 异步
create(String path, byte[] data, List<ACL> acl, CreateMode createMode,
AsynCallback.StringCallback callBack, Object ctx)
- path:结点路径
- data:服务器IP:端口号PORT
2.4.3 修改结点
2.4.4 删除结点
2.4.5 查看结点
2.4.6 检查结点是否存在
三、集群搭建
单机环境下,jdk/Zookeeper 安装完毕,基于一台虚拟机,进行 Zookeeper 伪集群的搭建,Zookeeper 集群中包含3个结点,结点对外提供服务的端口是2181、2182、2183。首先需要在解压缩的文件中创建一个用于存储快照文件的文件夹:
- 基于原 Zookeeper 安装包的解压缩文件,复制三份创建对应的服务器文件,分别对应 Zookeeper 2181、Zookeeper 2182、Zookeeper 2183
- 分别修改三份的配置文件。如2181的zoo2181.cfg
# 数据快照文件所在路径
dataDir=/usr/local/Zookeeper /Zookeeper 2181/zkData
# 服务器对应端口号
clientPort=2181
# 集群配置信息
# server.A=B:C:D
# A:是一个数字,表示服务器的编号
# B:当前服务器的ip地址
# C:当前服务器与Zookeeper 集群中其他服务器进行通信的端口
# D:集群中选举Leader时的端口
server.1=192.168.225.136:2287:3387
server.2=192.168.225.136:2288:3388
server.3=192.168.225.136:2289:3389
- 在存储快照文件的文件夹 zkData 中,执行
echo “1” > myid
创建 myid 文件,在其中添加配置文件中设置的服务器ID。
- 首先启动集群中的第一个 server。启动2181:
当集群中只启动了一个 server 时,该启动的 server 不会变为 Leader ,即在未建立连接之前,选举机制不会生效。
- 启动集群中的其他 server 并查看各服务器的工作状态:./zkServer.sh status【因为集群中设置了3个服务器,所以默认第2个为Leader】
只有当连接建立后,选举机制才会生效。
- 通过客户端登录集群中的服务器:
./zkCli.sh -server [服务器IP]:[服务器端口号]
./zkCli.sh -server 192.168.225.136:2181
./zkCli.sh -server 192.168.225.136:2182
./zkCli.sh -server 192.168.225.136:2183
- 集群同步。集群中的某一个服务器进行了更新操作,该更新都会更新到集群中的其他服务器中