Zookeeper基础

Zookeeper:开源的分布式应用程序协调服务

1.Zookeeper的特性

一致性:数据一致性,最终一致性,数据按照顺序分批入库
原子性:事物要么成功要么失败,不会局部化
单一视图:客户端连接集群中的任一zk节点,数据都是一致的
可靠性:每次对zk的操作状态都会保存在服务端
实时性:某段特定时间内客户端可以读取到zk服务端的最新数据

2.Zookeeper的基本数据模型

树形结构,节点称为znode,可以包含数据也可以包含子节点
zk为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构
节点存储的数据不宜过大,几K即可,默认上限1M
节点分为临时节点和永久节点,临时节点在客户端断开后消失
节点有版本号,当节点数据发生变化,该节点的版本号就会累加(乐观锁)
删除、修改过时节点,版本号不匹配则会报错
节点可以设置权限acl,通过权限来限制用户的访问

3.Zookeeper的应用场景

a.master节点选举
b.统一配置文件管理,部署一套服务器即可把相同配置文件同步到其他所有服务器
c.发布与订阅
d.提供分布式锁,分布式环境中不同进程之间争夺资源,类似于多线程的锁
e.集群管理,集群中保证数据的强一致性
f.负载均衡
g.命名服务
h.分布式协调、通知
i.分布式队列
......

4.Zookeeper的常用命令

./zkCli.sh
默认连接本机端口号为2181的zk server:localhost:2181
如果要指定连接到其他的zk server,可以设置具体的连接zk地址:./zkCli.sh -server ip:port

ls 、ls2 、 stat 、 get
ls列出节点下的子节点
ls2展示节点的状态信息并列出节点下的子节点
stat展示节点的状态信息
get获取节点的数据信息并展示节点的状态信息

create [-s] [-e] path data acl
-s这个参数表示创建有序节点
-e这个参数表示创建临时节点,否则创建永久节点

set path data [version]
delete path [version]
version节点的数据版本

更多命令

[zk: ip:port(CONNECTED) 1] help
ZooKeeper -server host:port cmd args
        connect host:port
        get path [watch]
        ls path [watch]
        set path data [version]
        rmr path
        delquota [-n|-b] path
        quit 
        printwatches on|off
        create [-s] [-e] path data acl
        stat path [watch]
        close 
        ls2 path [watch]
        history 
        listquota path
        setAcl path acl
        getAcl path
        sync path
        redo cmdno
        addauth scheme auth
        delete path [version]
        setquota -n|-b val path

详见org.apache.zookeeper.ZooKeeperMain

5.Zookeeper的状态信息

[zk: ip:port(CONNECTED) 0] stat /
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x46e0a0
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 3

cZxid创建节点的事务ID
ctime节点创建时间
mZxid节点修改的事务ID
mtime节点修改时间
pZxid子节点列表最后一次被修改的事务ID
cversion节点版本,子节点变化才会变更这个节点版本号
dataVersion节点数据版本
aclVersion节点权限版本
ephemeralOwner用于判断节点是临时节点还是永久节点,永久节点为0x0
dataLength节点数据长度
numChildren子节点数量

6.Zookeeper的watcher机制

Zookeeper中的watcher是一次性的,触发后立即销毁
对于不同类型的操作触发的watcher事件是不同的

Watcher事件类型
NodeCreated 创建节点事件
NodeDataChanged 修改节点数据事件
NodeDeleted 删除节点事件
NodeChildrenChanged 创建、删除子节点事件

Zookeeper的Watcher的使用场景
统一资源配置

7.ACL(access control lists)权限控制

权限可以指定不同的权限范围以及角色

ACL的构成:scheme:id:permissions
scheme:代表采用的某种权限机制
id:代表允许访问的用户
permissions:权限组合字符串

Schema权限机制类型:

  • world:world:anyone:[permissions]
  • auth:代表认证登录,auth:user:password:[permissions]
  • digest:需要对密码加密才能访问,digest:username:BASE64(SHA1(password)):[permissions]
  • ip:限制ip访问,ip:192.168.1.1:[permissions]
  • super:超级管理员,拥有所有权限

注意:auth与digest的区别即前者明文后者密文。
setAcl /path auth:test:test:cdrwa 等价于
setAcl /path digest:test:BASE64(SHA1(test)):cdrwa
在通过addauth digest test:test后都能操作指定节点的权限

加密方法org.apache.zookeeper.server.auth.DigestAuthenticationProvider#generateDigest

permissions:crdwa
c:create 创建子节点
r:read 获取节点/子节点
d:delete 删除子节点
w:write 设置节点数据
a:admin 设置权限

创建一个节点,默认的ACL为:

[zk: ip:port(CONNECTED) 0] getAcl /
'world,'anyone
: cdrwa

Demo:

[zk: ip:port(CONNECTED) 0] create -e /study ""
Created /study
[zk: ip:port(CONNECTED) 1] setAcl /study auth:test:test:cdrwa
Acl is not valid : /study
[zk: ip:port(CONNECTED) 2] addauth digest test:test
[zk: ip:port(CONNECTED) 3] getAcl /study                     
'world,'anyone
: cdrwa
[zk: ip:port(CONNECTED) 4] setAcl /study auth:test:test:cdrwa
cZxid = 0x1600000071
ctime = Wed Oct 17 16:56:13 HKT 2018
mZxid = 0x1600000071
mtime = Wed Oct 17 16:56:13 HKT 2018
pZxid = 0x1600000071
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x100c3363cdc001b
dataLength = 0
numChildren = 0
[zk: ip:port(CONNECTED) 5] getAcl /study                     
'digest,'test:V28q/NynI4JI3Rk54h0r8O5kMug=
: cdrwa

[zk: ip:port(CONNECTED) 6] setAcl /study world:anyone:cdrwa  
cZxid = 0x1600000071
ctime = Wed Oct 17 16:56:13 HKT 2018
mZxid = 0x1600000071
mtime = Wed Oct 17 16:56:13 HKT 2018
pZxid = 0x1600000071
cversion = 0
dataVersion = 0
aclVersion = 2
ephemeralOwner = 0x100c3363cdc001b
dataLength = 0
numChildren = 0
[zk: ip:port(CONNECTED) 7] getAcl /study                   
'world,'anyone
: cdrwa

[zk: ip:port(CONNECTED) 8] setAcl /study digest:test:V28q/NynI4JI3Rk54h0r8O5kMug=:cdrwa
cZxid = 0x1600000071
ctime = Wed Oct 17 16:56:13 HKT 2018
mZxid = 0x1600000071
mtime = Wed Oct 17 16:56:13 HKT 2018
pZxid = 0x1600000071
cversion = 0
dataVersion = 0
aclVersion = 3
ephemeralOwner = 0x100c3363cdc001b
dataLength = 0
numChildren = 0
[zk: ip:port(CONNECTED) 9] getAcl /study
'digest,'test:V28q/NynI4JI3Rk54h0r8O5kMug=
: cdrwa

[zk: ip:port(CONNECTED) 1] setAcl /study ip:10.45.81.181:crdwa
cZxid = 0x160000008a
ctime = Wed Oct 17 18:37:53 HKT 2018
mZxid = 0x160000008a
mtime = Wed Oct 17 18:37:53 HKT 2018
pZxid = 0x160000008a
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x100c3363cdc0024
dataLength = 0
numChildren = 0
[zk: ip:port(CONNECTED) 2] getAcl /study
'ip,'10.45.81.181
: cdrwa

对于超级管理员的方式有点特殊,需要修改zkServer.sh添加系统参数
-Dzookeeper.DigestAuthenticationProvider.superDigest=super:Wx8GhnKMUA5//T7rz6vCLnIl1jA=
这里配置系统参数值为:super:11
具体可以查看代码org.apache.zookeeper.server.auth.DigestAuthenticationProvider

    /** specify a command line property with key of 
     * "zookeeper.DigestAuthenticationProvider.superDigest"
     * and value of "super:" to enable
     * super user access (i.e. acls disabled)
     */
    private final static String superDigest = System.getProperty(
        "zookeeper.DigestAuthenticationProvider.superDigest");

像上面几种方式如果权限设置错误导致节点不可用的场景,就可以通过超级管理员来修改权限.

[zk: ip:port(CONNECTED) 1] ls /study
Authentication is not valid : /study
[zk: ip:port(CONNECTED) 2] addauth digest super:11
[zk: ip:port(CONNECTED) 3] ls /study
[]

8.Zookeeper的四字命令

zk提供四字命令与服务器进行交互
注意:需要用到nc命令,安装:yum install nc
使用命令: echo [commond]|nc [ip] [port]

支持的四字命令:
ruok 查看zk服务器是否启动,返回imok
stat 查看zk状态信息以及mode(单机/集群)
dump 列出未经处理的会话和临时节点
conf 查看服务器配置
cons 展示连接到zk服务器的客户端信息
envi 环境变量
mntr 监控zk健康信息
wchs 展示watch的信息
wchc session与watch的信息
wchp path与watch的信息

注意:3.4.10版本开始,有些四字命令默认是不开启的.
zoo.cfg中加入配置4lw.commands.whitelist=*

9.Zookeeper集群

集群角色:Leader、Follower、Observer
集群搭建

你可能感兴趣的:(Zookeeper基础)