深入理解与应用Zookeeper(二)

深入理解与应用Zookeeper(二)

image.png
image.png

3. Zookeeper的安装

3.1 zookeeper安装

3.1.1 zookeeper的下载

下载链接

image.png

上面的版本比下面的版本多了lib目录,该目录下存放zk运行依赖的jar包。

3.1.2 修改配置文件

image.png

进入conf目录 复制zoo_sample.cfg并重命名为zoo.cfg

新增两行配置:

#存储快照文件snapshot的目录。默认情况下,事务日志也会存储在这里。建议同时配置参数dataLogDir, 事务日志的写性能直接影响zk性能。
dataDir=D:/amos/dev/zookeeper/apache-zookeeper-3.5.5-bin/data/data 
##存储事务日志的目录
dataLogDir=D:/amos/dev/zookeeper/apache-zookeeper-3.5.5-bin/data/datalog

配置文件详情

image.png image.png image.png image.png image.png

几个比较重要的配置:

  • clientPort:参数无默认值,必须配置,用于配置当前服务器对外的服务端口,客户端必须使用这端口才能进行连接
  • dataDir:用于存放内存数据库快照的文件夹,同时用于集群的myid文件也存在这个文件夹里(注意:一个配置文件只能包含一个dataDir字样,即使它被注释掉了。)
  • dataLogDir:用于单独设置transaction log的目录,transaction log分离可以避免和普通log还有快照的竞争

以下配置集群中才会使用,后面再讨论

  • tickTime:心跳时间,为了确保连接存在的,以毫秒为单位,最小超时时间为两个心跳时间
  • initLimit:多少个心跳时间内,允许其他server连接并初始化数据,如果ZooKeeper管理的数据较大,则应相应增大这个值
  • syncLimit:多少个tickTime内,允许follower同步,如果follower落后太多,则会被丢弃。

3.1.3 zk的启动

进入bin目录执行以下操作

#服务端相关操作
./zkServer.sh start #启动
./zkServer.sh stop #关闭
./zkServer.sh restart #重启
./zkServer.sh status #查看ZK服务状态:
#客户端相关操作
./zkCli.sh start #启动
quit #关闭

启动成功的标识

执行指令

jps

返回的结果如下:

7350 QuorumPeerMain
7383 Jps

如果不是上述结果则zk启动失败。

3.2 zk常用命令

使用 zkCli.sh -server 127.0.0.1:2181 连接到 ZooKeeper 服务,连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息。 命令行工具的一些简单操作如下:

  • 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
  • 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据
  • 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串 [-e] [-s] 【-e 零时节点】 【-s 顺序节点】
  • 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串 [watch]【watch 监听】
  • 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置 •
  • 删除文件: delete /zk 将刚才创建的 znode 删除,如果存在子节点删除失败
  • 递归删除:deleteall /zk将刚才创建的 znode 删除,子节点同时删除
  • 退出客户端: quit •
  • 帮助命令: help

4. zk的特性

image.png

4.1 会话

客户端与服务端的一次会话连接,本质是TCP长连接,通过会话可以进行心跳检测和数据传输。 image.png 会话(session)是zookepper非常重要的概念,客户端和服务端之间的任何交互操作都与会话有关

会话状态 看下这图,Zk客户端和服务端成功连接后,就创建了一次会话,ZK会话在整个运行期间的生命周期中,会在不同的会话状态之间切换,这些状态包括: CONNECTING、CONNECTED、RECONNECTING、RECONNECTED、CLOSE

一旦客户端开始创建Zookeeper对象,那么客户端状态就会变成CONNECTING状态,同时客户端开始尝试连接服务端,连接成功后,客户端状态变为CONNECTED,通常情况下,由于断网或其他原因,客户端与服务端之间会出现断开情况,一旦碰到这种情况,Zookeeper客户端会自动进行重连服务,同时客户端状态再次变成CONNCTING,直到重新连上服务端后,状态又变为CONNECTED,在通常情况下,客户端的状态总是介于CONNECTING和CONNECTED之间。但是,如果出现诸如会话超时、权限检查或是客户端主动退出程序等情况,客户端的状态就会直接变更为CLOSE状态

4.2 zk的数据模型

image.png

4.3 zk的节点类型

  • Znode有两种类型:
    • 短暂(ephemeral)(create -e /app1/test1 “test1” 客户端断开连接zk删除ephemeral类型节点)
    • 持久(persistent) (create -s /app1/test2 “test2” 客户端断开连接zk不删除persistent类型节点)
  • Znode有四种形式的目录节点(默认是persistent )
    • PERSISTENT
    • PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )
    • EPHEMERAL
    • EPHEMERAL_SEQUENTIAL
  • 创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护

image.png

  • 在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

4.4 zk节点属性

image.png

4.5 ACL保障数据的安全

ACL机制,表示为scheme : id : permissions,第一个字段表示采用哪一种机制,第二个id表示用户,permissions表示相关权限(如只读,读写,管理等)。

4.5.1 Scheme

zookeeper提供了如下几种机制(scheme):

  • world: 它下面只有一个id, 叫anyone, world:anyone代表任何人,zookeeper中对所有人有权限的结点就是属于world:anyone的
    • 默认方式,相当于全世界都能访问
  • auth: 它不需要id, 只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authencation, 也支持username/password形式的authentication)
    • 代表已经认证通过的用户(可以通过addauth digest user:pwd 来添加授权用户)
  • digest: 它对应的id为username:BASE64(SHA1(password)),它需要先通过username:password形式的authentication
    • 即用户名:密码这种方式认证,这也是业务系统中最常用的
  • ip: 它对应的id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:192.168.1.0/16, 表示匹配前16个bit的IP段
    • 使用Ip地址认证

4.5.2 id

id是验证模式,不同的scheme,id的值也不一样。

  • scheme为auth时: username:password
  • scheme为digest时: username:BASE64(SHA1(password))
  • scheme为ip时: 客户端的ip地址。
  • scheme为world时 anyone。

4.5.3 Permission

CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)

  • CREATE(c):创建子节点的权限
  • DELETE(d):删除节点的权限
  • READ(r):读取节点数据的权限
  • WRITE(w):修改节点数据的权限
  • ADMIN(a):设置子节点权限的权限

4.5.4 ACL命令

  • getAcl

获取指定节点的ACL信息

create /testDir/testAcl amos  # 创建一个子节点 
getAcl /testDir/testAcl      # 获取该节点的acl权限信息
  • setAcl

设置指定节点的ACL信息

setAcl /testDir/testAcl world:anyone:crwa   # 设置该节点的acl权限
getAcl /testDir/testAcl   # 获取该节点的acl权限信息,成功后,该节点就少了d权限

create /testDir/testAcl/xyz xyz-data   # 创建子节点
delete /testDir/testAcl/xyz    # 由于没有d权限,所以提示无法删除
  • addauth

注册会话授权信息

  • Auth
addauth digest user1:123456                # 需要先添加一个用户
setAcl /testDir/testAcl auth:user1:123456:crwa   # 然后才可以拿着这个用户去设置权限

getAcl /testDir/testAcl    # 密码是以密文的形式存储的

create /testDir/testAcl/testa aaa   
delete /testDir/testAcl/testa   # 由于没有d权限,所以提示无法删除

代码示例:

#创建节点/test1
[zk: localhost:2181(CONNECTED) 4] create /node1/test1
Created /node1/test1
#给节点test1设置crdwa五个权限
[zk: localhost:2181(CONNECTED) 5] setAcl /node1/test1 world:anyone:crdwa 
#查看是否授权成功
[zk: localhost:2181(CONNECTED) 6] getAcl /node1/test1
'world,'anyone
: cdrwa 

退出客户端后:

ls /testDir/testAcl  #没有权限无法访问
create /testDir/testAcl/testb bbb #没有权限无法访问
addauth digest user1:123456  # 重新新增权限后可以访问了
  • digest

auth与digest的区别就是,前者使用明文密码进行登录,后者使用密文密码进行登录

create /testDir/testDigest  data
addauth digest user1:123456
setAcl /testDir/testDigest digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:crwa   # 使用digest来设置权限

注意:这里如果使用明文,会导致该znode不可访问

  • ip
create  /testDir/testIp data
setAcl  /testDir/testIp ip:192.168.30.10:cdrwa
getAcl  /testDir/testIp

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×