ZooKeeper介绍

什么是ZooKeeper

ZooKeeper原意为动物园管理员,是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,它提供了一系列简单的原子操作,分布式系统可以使用这些操作实现上层的服务,例如:配置维护、名字服务、分布式同步、集群管理等等。

ZooKeeper的特性

简单的。ZooKeeper通过一个共享的类似于文件系统的命名空间实现分布式系统的协调功能,它封装好了分布式系统中复杂而且容易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

分布式的。ZooKeeper是为分布式系统提供服务的,同时它本身也是支持分布式的。


组成ZooKeeper服务的各个主机需要知道其他主机是否在线,只要超过一半的主机没有宕机,整个ZooKeeper服务就仍然可用。客户端使用ZooKeeper服务的时候只需要连接任意一台主机即可。客户端和ZooKeeper的主机之间通过TCP保持长连接,如果客户端与主机之间的连接断掉,客户端就会连接到另一台主机上。

有序的。ZooKeeper对每一次的更新操作都会用一个数字来标记,从而记录ZooKeeper事务的顺序。分布式系统可以使用这个顺序实现上层的服务。

高效的。ZooKeeper可以支持上千台机器的分布式系统,如果大部分工作都是读取操作,ZooKeeper会显得尤为高效,如果读写比例在10:1左右,效率将达到最高。

ZooKeeper的数据模型和命名空间

ZooKeeper的命名空间类似于一个标准的文件系统,但与文件系统唯一不同的是ZooKeeper中的每个节点都可以存储数据,相当于文件系统中的目录也可以包含数据。每个名字都是一个以‘/’分隔元素的路径。ZooKeeper命名空间中的每个节点都是用路径来标识的。


数据模型的特点

  • 每个目录项被称作为znode,每个znode 被它所在的路径唯一标识。znode存储的数据不能太大,限制在1M以内。
  • znode可以有子节点目录,并且每个 znode可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录。
  • 每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据。
  • znode可以是临时节点,一旦创建这个 znode的客户端与服务器失去联系,这个 znode也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为session,如果 znode 是临时节点, session失效,znode就被删除。
  • znode的目录名可以自动编号,如 App1 已经存在,再创建的话,将会自动命名为App2。
  • znode可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端。

ZooKeeper的三种角色

  1. Leader:负责进行投票的发起和决议,更新系统状态。
  2. Follower:接受客户端请求并向客户端返回结果,在选主过程中进行投票。
  3. Observer:和Follower一样处理客户端请求,但是不参与投票,只同步Leader状态。

Zab协议(原子广播协议)

原子广播协议(Atomic Brodcast)是ZooKeeper最核心的一个协议,通过原子广播协议ZooKeeper保证了各个主机之间的数据同步。该协议保证了以下三点:
  1. 可靠提交:指如果一个message被提交,则该消息会被传递到所有的server上。
  2. 全局有序:指各个Server收到的message有序,这个由TCP协议保证;
  3. 因果有序:指如果a消息发生在b消息之前,并被一起发送,那么对于每个Server,a消息都在b消息之前被执行。
原子广播协议分为以下三个阶段:
  1. Leader选举。选出具有最大zxid(事物id)server作为leader,采用FastPaxos算法。
  2. Leader和Follower同步数据。follower连接leader,将自己的zxid发送给leader,leader根据zxid确定同步点
  3. Active Messaging。leader从消息队列里面提取消息,并向follower发送proposal,如果有超过一半的follower接受该提议并发送ACK给leader后,leader就发送commit指令给follower,然后该消息被提交。

ZooKeeper主要接口

String create(String path, byte[] data, List<ACL> acl,CreateMode createMode)

创建 一个给定的目录节点path,并给它设置数据,CreateMode 标识有四种形式的目录节点:PERSISTENT:持久化目录节点。PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点。EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器断开连接,这种节点会被自动删除。EPHEMERAL_SEQUENTIAL:临时自动编号节点

Stat exists(String path, boolean watch) 

判断某个 path 是否存在,并设置是否监控这个目录 节点。

Stat exists(String path,Watcher watcher)

重载方法判断某个path是否存在,并设置特定的Watcher监控这个目录节点。

void delete(String path, int version) 

删除 path 对应的目录节点, version -1 可以 匹配任何版本 ,即删除这个 目录 节点的所有 数据 。

List<StringgetChildren(String path, boolean watch) 

获取指定path下的所有子目录节点,并设置是否监控子目录节点。

List<StringgetChildren(String path,Watcher watcher) 

重载方法,获取指定path下的所有子目录节点,并设置具体的Watcher监控子目录节点状态的变化。

Stat setData(String path, byte[] data, int version)

path设置数据,可以指定这个数据的版本号,如果version-1怎可以匹配任何版本。

byte[] getData(String path, boolean watch,Stat stat) 

获取这个path对应的目录节点存储的数据,数据的版本等信息可以通过stat来指定,同时还可以设置是否监控这个目录节点数据的状态

注:部分内容来源于网络,个人整理而成。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值