1、zookeeper应用场景
是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用、具有严格顺序访问控制能力的分布式协调存储服务。
- 维护配置信息
- 分布式锁服务
- 集群管理
- 生成分布式唯一ID
2、 zookeeper的数据模型
zookeeper的数据节点可以视为树状结构(或者目录),树种的各节点被称为znode(即zookeepernode),一个znode可以有多个子节点。zookeeper节点在结构上表现为树状;使用路径path来定位某个znode,比如 /ns-1/sch/table1。
znode兼具文件和目录的两个特点。既像文件一样维护着数据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。
一个znode大体分为3个部分
- 节点的数据:即znode data(节点path、节点data)的关系就像map(key value)的关系
- 节点的子节点children
- 节点的状态stat:用来描述当前节点的创建、修改记录、包括cZxid、ctime等
节点状态stat的属性
使用get 命令查看查看指定路径节点的data、stat信息
cZxid:数据节点创建时的事物ID
ctime:数据节点创建的时间
mZxid:数据节点最后一次更新时的事物ID
mtime:数据节点最后一次更新的时间
pZxid:数据节点的子节点最后一次被修改的事物ID
cversion:子节点的更改次数
dateVersion:节点数据的更改次数
aclVersion:节点的ACL的更改次数
ephemeralOwner:如果节点是临时节点,则表示创建该节点的会话的SessionID,如果是持久节点为0
dataLength:数据内容的长度
numChildren:数据节点当前的子节点个数
节点类型
临时节点和永久节点,节点的类型在创建时被确定,不能改变
临时节点:该节点的生命周期依赖于创建它的会话,一旦会话结束,临时节点将被自动删除,当然也可手动删除。虽然每个临时的Znode都会绑定到一个客户端会话,但他们对所有的客户端还是可见的。临时节点不允许有子节点。
持久化节点:生命周期不依赖于会话,只有在客户端显示执行操作的时候,才会被删除。
3、zookeeper安装
cd ~ 进入用户目录
tar -xzvf zookeeper.tar.gz 解压
cp zoo_sample.cfg zoo.cfg 复制配置文件
mkdir data 创建data目录
dataDir=/app/zk/zookeeper-3.4.10/data 此路径用于存储zookeeper中数据的内存快照及事物日志文件
./zkServer.sh start 启动
./zkServer.sh status 查看启动是否完成
ZooKeeper JMX enabled by default
Using config: /app/zo/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: standalone
./zkServer.sh stop
./zkCli.sh [-server ip:port] 登录
ps -ef|grep zookeeper 查看zookeeper进程存在
4、zookeeper常用shell命令
4.1、新增节点
create [-s] [-e] path data -s为有序节点 -e临时节点
create /hadoop "创建持久化节点"
create -s /a "创建持久化有序节点" 会在节点路径后面加序列号 Created /a0000000001,为分布式环境创建唯一id
create -e /tmp "创建临时节点" quit退出zookeeper客户端
create -s -e /aa "创建临时有序节点" 生成分布式锁
4.2、更新节点
set /hadoop "aaa"
set /hadoop "aaa" 2 基于路径和版本号更改,传入的版本号和当前节点的数据版本号不符合,
会拒绝修改version No is not valid : /hadoop
4.3、删除节点
delete path [version] 与更新类似,也可以指定路径和版本号。如果有子节点,无法删除
rmr path 可删除有子节点的节点
4.4、查看节点和状态
get path 返回数据和节点属性
stat path 只返回当前节点属性
4.5、查看节点列表
ls /hadoop 返回子节点列表
ls2 /hadoop 前者的增加,返回子节点列表和当前节点信息
4.6、监听器 (配置信息)
监听器能够在节点内容发生改变的时候,向客户端发出通知。注意:zookeeper的触发器是一次性的(One-time trigger),触发一次后立即失败 (在A客户端注册监听器,在B客户端修改,A能获得通知。且一次通知后监听器失效)
注册监听器 get /hadoop watch
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop
注册监听器2 stat path [watch]
注册监听器3 ls/ls2 path watch 监听子节点
5、zookeeper的acl权限控制
5.1、概述
zookeeper类似于文件系统。access control list访问控制列表可以做到节点的权限控制。
acl权限控制,使用scheme:id:permission来标识,主要涵盖3个方面
- 授权模式(scheme):授权的策略
- 授权对象(id):授权的对象
- 权限(permission):授权的权限
其特性如下:
- zookeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限
- 每个znode支持设置多种权限控制方案和多个权限
- 子节点不会继承父节点的权限,客户端无权访问莫节点,但可能可以访问它的子节点
5.2、授权模式 采用何种方式授权
方案 | 描述 |
---|---|
world | 只有一个用户:anyone,代表登录zookeeper的所有人(默认) |
ip | 对客户端使用IP地址认证 |
auth | 使用已添加认证的用户认证 |
digest | 使用“用户名:密码”方式认证 |
5.3、授予的权限
权限 | ACL简称 | 描述 |
---|---|---|
create | c | 可以创建子节点 |
delete | d | 可以删除子节点(仅下一级节点) |
read | r | 可以读取节点数据及显示子节点列表 |
write | w | 可以设置节点数据 |
admin | a | 可以设置节点访问控制列表权限ACL |
5.4、授权的相关命令
setAcl /test2 ip:192.168.60.130:crwda
getAcl path
addauth scheme auth
5.5 setAcl world:anyone:[acl]
setAcl world:anyone: 去掉所有权限
5.6、ip授权模式 连接其他ipzk服务:先zkCli.sh -server ip
给两个ip设置权限 setAcl ip:ip1:crwda,ip:ip2:crwda
5.7、Auth授权模式:
先添加授权用户:addauth digest itcast:123456 每次quit退出要重新添加
5.8、Digest授权模式
命令: setAcl path digest:<user>:<密码密文>:[acl]
这里的密码是经过SHA1和BASE64处理的密文,在shell中可以通过以下命令计算:
echo -n haha:123456 | openssl dgst -binary -sha1 | openssl base64
5.9、acl超级管理员
zookeeper的权限管理模式有一种叫做supper,改模式提供一个超管可以方便的访问任何权限的节点
假设这个超管是supper:admin,需要先为超管生成密码的密文
打开/bin/zkServer.sh,添加如下命令,使用超级管理员之前要先添加授权用户 addauth digest super:123456
nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs=" \
6、zookeeper的java原生api
6.1、链接
//计数器对象
CountDownLatch countDownLatch = new CountDownLatch(1);
ZooKeeper zooKeeper = new ZooKeeper("168.61.9.142:2181", 5000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
//链接成功
if (watchedEvent.getState() == KeeperState.SyncConnected) {
countDownLatch.countDown();
}
}
});
//主线程堵塞等待连接对象的创建成功
countDownLatch.await();
System.out.println(zooKeeper.getSessionId());
zooKeeper.close();
6.2、创建节点