Zookeeper 入门

Zookeeper 简介

ZooKeeper致力于提供一个高性能、高可用,且具备严格的顺序访问控制能力的分布式协调服务,是雅虎公司创建,是Google的Chubby一个开源的实现,也是Hadoop和Hbase的重要组件。

设计目标

  1. 简单的数据结构:共享的树形结构,类似文件系统,存储于内存;

  2. 可以构建集群:避免单点故障,3-5台机器就可以组成集群,超过半数正常工作就能对外提供服务;

  3. 顺序访问:对于每个读请求,zk会分配一个全局唯一的递增编号,利用这个特性可以实现高级协调服务;

  4. 高性能:基于内存操作,服务于非事务请求,适用于读操作为主的业务场景。3台zk集群能达到13w QPS;

哪些常见需要用到ZK

数据发布订阅:下面的基础 负载均衡:客户端的负载均衡 命名服务 Master选举 集群管理 配置管理 分布式队列 分布式锁

ZK的下载跟安装

百度即可,

Zookeeper 入门

Zookeeper配置文件

Zookeeper 入门Zookeeper 入门Zookeeper 入门Zookeeper 入门Zookeeper 入门

ZK 特性

会话(session)

客户端与服务端的一次会话连接,本质是TCP长连接,通过会话可以进行心跳检测和数据传输;看下Zk客户端和服务端成功连接后,就创建了一次会话,ZK会话在整个运行期间的生命周期中,会在不同的会话状态之间切换,这些状态包括: CONNECTING、CONNECTED、RECONNECTING、RECONNECTED、CLOSE 一旦客户端开始创建Zookeeper对象,那么客户端状态就会变成CONNECTING状态,同时客户端开始尝试连接服务端,连接成功后,客户端状态变为CONNECTED,通常情况下,由于断网或其他原因,客户端与服务端之间会出现断开情况,一旦碰到这种情况,Zookeeper客户端会自动进行重连服务,同时客户端状态再次变成CONNCTING,直到重新连上服务端后,状态又变为CONNECTED,在通常情况下,客户端的状态总是介于CONNECTING和CONNECTED之间。但是,如果出现诸如会话超时、权限检查或是客户端主动退出程序等情况,客户端的状态就会直接变更为CLOSE状态

数据模型

ZooKeeper的视图结构和标准的Unix文件系统类似,其中每个节点称为数据节点ZNode,每个znode可以存储数据,还可以挂载子节点,因此可以称之为。Znode一般存储小于1M的数据。每一个znode都必须有值,如果没有值,节点是不能创建成功的。

  1. 在Zookeeper中,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据

  2. 通过客户端可对znode进行增删改查的操作,还可以注册watcher监控znode的变化。

Zookeeper 入门

在这里插入图片描述

Zookeeper节点类型

节点类型非常重要,是后面项目实战的基础。 a、Znode有两种类型: 短暂(ephemeral)(create -e /app1/test1 “test1” 客户端断开连接zk删除ephemeral类型节点) 持久(persistent) (create -s /app1/test2 “test2” 客户端断开连接zk不删除persistent类型节点) b、Znode有四种形式的目录节点(默认是persistent ) PERSISTENT PERSISTENT_SEQUENTIAL(持久序列/test0000000019 ) EPHEMERAL EPHEMERAL_SEQUENTIAL c、创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护 d、在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

Zookeeper节点状态属性

Zookeeper 入门

在这里插入图片描述

客户端常用命令

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

  1. 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容

  2. 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据

  3. 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串 [-e] [-s] 【-e 零时节点】 【-s 顺序节点】

  4. 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串 [watch]【watch 监听】

  5. 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置

  6. 删除文件: delete /zk 将刚才创建的 znode 删除,如果存在子节点删除失败

  7. 递归删除:rmr /zk将刚才创建的 znode 删除,子节点同时删除

  8. 退出客户端: quit

  9. 帮助命令: help

ACL保障数据的安全

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

通常表示为:scheme:id:permission

  1. schema:代表授权策略

  2. id:代表用户

  3. permission:代表权限

Scheme world:默认方式,相当于全世界都能访问 auth:代表已经认证通过的用户(可以通过addauth digest user:pwd 来添加授权用户) digest:即用户名:密码这种方式认证,这也是业务系统中最常用的 ip:使用Ip地址认证

id id是验证模式,不同的scheme,id的值也不一样。 scheme为auth时:username:password scheme为digest时:username:BASE64(SHA1(password)) scheme为ip时:客户端的ip地址。 scheme为world时anyone。

Permission CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写) CREATE(c):创建子节点的权限 DELETE(d):删除节点的权限 READ(r):读取节点数据的权限 WRITE(w):修改节点数据的权限 ADMIN(a):设置子节点权限的权限

ACL命令

getAcl

获取指定节点的ACL信息 create /testDir/testAcl deer # 创建一个子节点 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

addauth digest user1:123456 # 需要先添加一个用户 setAcl /testDir/testAcl auth:user1:123456:crwa # 然后才可以拿着这个用户去设置权限 getAcl /testDir/testAcl # 密码是以密文的形式存储的

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

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

ACL权限补充

练习setAcl权限的时候由于失误,导致节点无法删除
  create /enjoy1/node1  enjoy
  setAcl /enjoy1  world:anyone:r
  这个时候无论是delete 还是rmr都没有权限删除
  解决方式:启用super权限
   使用DigestAuthenticationProvider.generateDigest("super:admin"); 获得密码
1.修改zkServer启动脚本增加
"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="
2.启动客户端用管理员登陆
   addauth digest super:admin

 

常用四字命令

ZooKeeper 支持某些特定的四字命令字母与其的交互。用来获取 ZooKeeper 服务的当前状态及相关信息。可通过 telnet 或 nc 向 ZooKeeper 提交相应的命令 :当然,前提是安装好了nc

echo stat|nc 127.0.0.1 2181 来查看哪个节点被选择作为follower或者leader 使用echo ruok|nc 127.0.0.1 2181 测试是否启动了该Server,若回复imok表示已经启动。 echo dump| nc 127.0.0.1 2181 ,列出未经处理的会话和临时节点。 echo kill | nc 127.0.0.1 2181 ,关掉server echo conf | nc 127.0.0.1 2181 ,输出相关服务配置的详细信息。 echo cons | nc 127.0.0.1 2181 ,列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息 echo envi |nc 127.0.0.1 2181 ,输出关于服务环境的详细信息(区别于 conf 命令)。 echo reqs | nc 127.0.0.1 2181 ,列出未经处理的请求。 echo wchs | nc 127.0.0.1 2181 ,列出服务器 watch 的详细信息。 echo wchc | nc 127.0.0.1 2181 ,通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。 echo wchp | nc 127.0.0.1 2181 ,通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。

ZooKeeper 日志可视化

前面以及讲了两个非常重要的配置一个是dataDir,存放的快照数据,一个是dataLogDir,存放的是事务日志文件

事务日志可视化 (LogFormatter) java -cp ../../zookeeper-3.4.6.jar;../../lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter log.xxxx 数据快照可视化 (SnapshotFormatter) java -cp ../../zookeeper-3.4.6.jar;../../lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter snapshot.xxxx

ZooInspector

下载然后解压 进入目录ZooInspector\build,运行zookeeper-dev-ZooInspector.jar; Zookeeper 入门 java -jar zookeeper-dev-ZooInspector.jar //执行成功后,会弹出java ui client Zookeeper 入门 点击左上角连接按钮,输入zk服务地址:ip或者主机名:2181

Zookeeper 入门 点击OK,即可查看ZK节点信息 Zookeeper 入门

 

zookeeper资料 

上一篇:[Codeforces]Round 657 div2题解(A-D)


下一篇:超强、超详细Redis数据库入门教程(转载)