zookeeper是一个开源的分布式的,为分布式应用提供协调服务的apache项目;
zookeeper从设计模式来理解:是一个基于观察者模式设计的分布式服务管理框架,她负责存储和管理大家都关心的数据,然后接收观察者的注册,一旦这些数据的状态发生变化zookeeper就将负责通知已经在zookeeper上注册的哪些观察者做出相应的反应;
zookeeper = 文件系统+消息通知机制
zookeeper是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能,高可用,且居于严格顺序访问控制能力的分布式协调存储服务
zookeeper的设计目标
zookeeper的数据结点可以是为树状结构(或者目录) 书中的各节点被称为znode ,一个znode可以有多个子节点,zookeeper节点在结构上表现为树状,使用路径path来定位某个znode
znode 兼具文件和目录两种特点,即像文件一样维护者数据,元信息,acl,时间戳等数据结构,又像目录一样可以作为路径标识的一部分.
znode主要包含以下三部分:
节点的数据
节点的子节点
节点的状态stat:用来描述当前节点的创建,修改记录,
节点信息说明
临时节点和持久化结点
客户端登录shell
./zkCli.sh 回车 [-server ip] 客户端登录到某一台服务器上 尽量启动zookeeper集群,否则只启动一台zookeeper不知道自己是leader还是follower,就拒绝操作了
create /hadoop "sofency"
create -s /aa "alice";
create -e /bb "hello"
create -s -e /hh "alice"
get /hadoop
rmr path
监听结点数据的变化
注解监听器
get /hadoop watch
stat /hadoop watch
当结点数据发生变化的时候,向客户端发出通知,需要注意的是 zookeeper的触发器是一次性的,即触发一次后就会立即失效;
zookeeper类似文件系统,client可以创建节点,更新节点,删除节点,那么如何做到节点的权限的控制的呐?
acl权限控制,使用scheme : id : permission来标识
权限模式(scheme) 授权的策略
授权对象(id): 授权对象
权限(permission):授予的权限
zookeeper的权限控制是基于每个znode节点的,需要对每个结点设置权限
每个znode支持设置多种权限控制方案和多个权限
子节点不会继承父节点的权限,客户端无泉访问某节点 ,但可以访问它的子节点
eg:
setAcl /test1 ip:192.168.60.130:crwda
将节点权限设置为ip:192.168.60.130的客户端可以对节点进行增删改查管理权限
权限模式
方案 | 描述 |
---|---|
world | 只有一个用户:anyone 代表登录zookeeper的所有人(默认) |
ip | 对客户端使用ip认证 |
auth | 使用已添加认证的用户认证 |
digist | 使用用户名:密码方式认证 |
权限
权限 | acl简写 | 描述 |
---|---|---|
create | c | 可以创建节点 |
delete | d | 可以删除节点 |
read | r | 可以读取节点数据及描述子节点列表 |
write | w | 可以设置节点数据 |
admin | a | 可以设置节点访问控制列表权限 |
查询节点的权限 | ||
getAcl /hadoop |
||
world授权 | ||
setAcl /hadoop world:anyOne:crwda |
||
ip多授权模式 | ||
setAcl /hadoop ip:192.168.60.129:crwda,ip:192.168.60.130:crwda |
||
auth授权 | ||
首先先将用户添加进授权的范围内 | ||
addauth digist sofency:12344 添加用户 addauth digist 用户名:密码 |
||
setAcl /node1 auth:sofency:crdwa //设置权限 |
多种授权方式之间用逗号间隔开
setAcl path ip:host:power,auth:用户名:power
zookeeper的权限管理模式有一种叫做super,该模式提供一个超管可以方便的访问任何权限的节点,假设这个超管是super:admin 需要先为超管生成密码的密文
echo -n super:admin | openssl dgst -binary -sha1 | openssl base64
打开zookeeper目录下的/bin/zkServer.sh服务器的脚本 找到如下一行
nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"
这就是脚本中启动zookeeper的命令,默认只有以上两个配置项,我们需要加上超管的配置项
“-Dzookeeper.DigestAuthenticationProvider.superDigest=super:密文”
之后启动zookeeper,输入以下命令添加权限
addauth digest super:admin # 添加认证用户