什么是Zookeeper
官方定义:
他是用来管大象(hadoop),密封(Hive),小猪(pig)的管理员,Apache Hbase和Apache Solr以及阿里的Dubbo等项目中都采用到了zookeeper。
一句话:Zookeeper是一个分布式的、高性能的、开源的分布式系统的协调(Coordination)服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件,它是一个为分布式应用提供一致性服务的软件
从设计模式的角度理解
是一个基于观察模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应,从而实现集群中类似Master/Slave管理模式。
一句话总结
Zookeeper能干吗
- 命名服务
- 配置维护
- 集群管理
- 分布式消息同步和协调机制
- 负载均衡
- 对Dubbo的支持
Zookeeper提供了一套很好的分布式集群管理的机制,就是它这种基于层次型的目录树的数据结构,并对树中的节点进行有效管理,从而可以设计出多种多样的分布式的数据管理模型,作为分布式系统的沟通调度桥梁
Zookeeper 安装配置参考:**Zookeeper 单机 & 集群搭建
ZNode 深入理解
ZNode 数据模型
ZNode 是什么
Znode维护了一个stat结构,这个stat包含数据变化的版本号、访问控制列表变化、还有时间戳。版本号和时间戳一起,可让Zookeeper验证缓存和协调更新。每次znode的数据发生了变化,版本号就增加。
例如:无论何时客户端检索数据,它也一起检索数据的版本号。并且当客户端执行更新或删除时,客户端必须提供他正在改变的znode的版本号。如果它提供的版本号和真实的数据版本号不一致,更新将会失败。
ZNode stat 结构体
- czxid- 引起这个znode创建的zxid,创建节点的事务zxid(Zookeeper Transaction Id)
- 每次修改Zookeeper状态都会收到一个zxid形式的时间戳,也就是Zookeeper事务ID。事务ID是Zookeeper中所有修改总的次序,每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
- ctime - znode被创建的毫秒数(从1970年开始)
- mzxid - znode最后更新的zxid
- mtime - znode最后修改的毫秒数(从1970年开始)
- pZxid - znode最后更新子节点zxid
- cversion - znode子节点变化号,znode子节点修改次数
- dataversion - znode数据变化号
- aclVersion - znode访问控制列表的变化号
- ephemeralOwner - 如果是临时节点,这个是znode拥有者的session id,如果不是临时节点则是0
- datalength - znode的数据长度
- numChildren - znode子节点数量
总结
zookeeper内部维护了一套类似Unix的树形数据结构;
由znode构成的集合,
znode的集合又是一个树形结构;
每一个znode又有很多属性进行描述。Znode = path + nodeValue + StatZNode 的四种类型
PERSISTENT - 持久化目录节点
创建这个节点的客户端与zookeeper断开连接后,该节点不会被删除(除非使用API强制删除)PERSISTENT_SEQUENTIAL - 持久化顺序编号目录节点
持久化顺序编号节点,当客户端请求创建这个节点后,Zookeeper会根据parent-znode的zxid状态,为这个节点编写一个全目录唯一的编号(这个编号只会一直增长),当客户端与Zookeeper断开连接之后,这个节点也不会删除EPHEMERAL - 临时目录节点
创建这个节点的客户端与zookeeper断开连接后,该节点(以及子节点)被删除EPHEMERAL_SEQUENTIAL - 临时顺序编号目录节点
临时顺序编号节点,当客户端请求创建这个节点后,Zookeeper会根据parent-znode的zxid状态,为这个节点编写一个全目录唯一的编号(这个编号只会一直增长),当客户端与Zookeeper断开连接之后,这个节点会删除
另外,无论是 EPHEMERAL 还是 **EPHEMERAL_SEQUENTIAL 节点类型,在Zookeeper的client异常中断之后,节点就会被删除。**
zkCli 的基础命令
一句话: 与 Redis的key/value键值对类似,只不过在ZK中,key 是 路径, value 是 data
常用命令
- help
- ls: 使用ls命令来查看当前znode中所包含的内容
- ls2: 查看当前节点数据并能看到更新次数等数据
- stat
- set
- get
- create
- delete
-
Zookeeper的四字命令
zookeeper支持某些特定的四字命令,他们大多是用来查询zk服务的当前状态及相关信息的,通过telnet或nc向zookeeper提交相应命令,如: echo ruok | nc 127.0.0.1 2181
运行公式: echo 四字命令 | nc 主机ip zookeeper端口
常用的四字命令
ruok: 测试服务是否处于正确状态,如果确实如此,那么服务返回“imok”,否则不做任何响应
- stat: 输出关于性能和连接的客户端的列表
- conf:输出相关服务配置的详细信息
- cons:列出所有连接到服务器的客户端的完全的连接/会话的详细信息。包括“接受/发送”的包数量、会话
- dump:列出未经处理的会话和临时节点
- envi:输出关于服务环境的详细信息(区别于conf命令)
- reqs:列出未经处理的请求
- wchs:列出服务器watch的详细信息
- wchc:通过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列表
- wchp:通过路径列出服务器watch的详细信息。它输出一个与session相关的路径