Apache ZooKeeper学习之ZooKeeper总览

ZooKeeper为使用者提供了一个分布式并且开源的一致性服务。他提供了一系列的原语操作,开发者基于这些原语操作为同步管理,配置管理,组服务以及命名服务开发更加高级复杂的服务。ZooKeeper易于使用并且它的数据模型使用类似于文件系统的树状结构易于理解。 在分布式应用中,一致性服务是一件非常令人头痛的事,特别是条件竞争和死锁的处理。ZooKeeper在一致性服务上面提供了很好的方案,并且开箱即用。开发者不需要重头开发这些内容而只需要引用ZooKeeper,大大减轻了开发的压力。

ZooKeeper设计目标

易于使用: ZooKeeper通过一个共享分层命名空间来保证分布式进程的一致性,这种命名空间的组织方式和标准的文件结构方式类似。命名空间是由被称为znodes的数据节点构成,这些节点关系有些类似于目录和文件的关系,也就是说节点可能挂载其他节点也可能作为一个独立节点。还有一点比较特殊的是ZooKeeper的数据都保存在内存之中,这样可以保证高吞吐和低延迟,不过使用内存硬件花费会高一些,鱼和熊掌的选择。

冗余: ZooKeeper对外提供服务的时候,本身也支持冗余的方式。 来自于zookeeper官网

ZooKeeper服务的所有服务器之间必须互相知道对方,这些服务器会维护一个内存状态镜像,一个事务日志以及一个持久化存储的快照。只要提供ZooKeeper服务的服务器大部分可用,ZooKeeper服务就可以正常使用。

顺序执行

ZooKeeper会对每一个更新操作标注一个数字,这个数字会影响到事务的执行顺序。

快速

ZooKeeper运行非常快速,并且读操作占主导的时候会更快,ZooKeeper推荐读和写操作的比例在十倍以上。

数据模型和分层命名空间

ZooKeeper中的命名空间和普通的文件系统结构结构非常类似。它的名字是由一个顺序的路径元素组成,路径元素之间通过分隔符\来分隔。命名空间中的每一个节点都是路径唯一的。 来自于zookeeper官网

节点与临时节点

ZooKeeper的节点既可以有数据也可以关联其他节点,这个和普通的文件系统不太相同,这一点来看ZooKeeper的节点既像目录又像文件。为了方便说明后续ZooKeeper的节点数据简单使用znode来表示。另外由于ZooKeeper保存的是条件数据例如状态信息,配置和位置信息这些,节点数据比较小,一般在几字节到几千字节范围。

Znode会维护一个包含版本号的状态结构,这个版本号在数据更新,ACL(访问控制列表)修改,时间戳变化的时候会被更新,并被应用在缓存验证和一致性修改方面。每次Znode数据发生变化的时候,这个版本号都会增加。

Znode中数据的读写都是原子操作,每次读操作或者写操作都是对整个节点的数据进行操作。每一个Znode都会有一个ACL(访问控制列表),通过ACL来控制什么人有权限操作此节点。

Znode中有一个特殊的节点,被称为临时节点。这种节点的生命周期和会话一致,会话创建的时候临时节点被激活,会话结束的时候,临时节点被删除。

条件更新和监视器

ZooKeeper支持一种称为监视器的概念,客户的可以在znode设置一个监视器,当znode数据发生变化的时候监视器将会被触发或者删除。

保障

ZooKeeper非常的快速并且很简单,但是ZooKeeper的目标是成为构建复杂服务的基础,为了保障这个目标ZooKeeper提供了以下的措施:

  1. 顺序一致性:严格按照客户的发送的顺序更新
  2. 原子性:操作只有成功或者失败,不存在部分成功失败。
  3. 单一的系统镜像:客户的连接提供ZooKeeper服务集群任意一台服务器,看到的结果都是一样的。
  4. 可靠性:数据一旦被更新后将会一直保存更新后的状态,直到下一次被更新。
  5. 及时性:客户端视图将会在一定时间内保证是最新的。

简单的API

ZooKeeper支持的接口方法:

create:创建节点 delete:删除节点 exists:判断节点是否存在 get data:获取节点数据 set data:设置节点数据 get children:获取子节点列表 sync:同步数据

具体实现

来自官网

如上图所示,除了请求处理器外,其他的组件都会有自己的备份。冗余数据库是一个内存数据库包含整个数据树。更新操作都会被记录到磁盘中,在数据恢复的时候使用。数据的写入会首先写入到冗余数据库然后在序列化到磁盘。客户端对ZooKeeper服务器的读请求会从本地数据库获取,客户端对ZooKeeper服务器的变更请求会通过一个约定的协议进行。协议规定来自于客户端的所有写请求将会转发给一个被称为领导的服务器。其他的服务器被称为随从,从领导服务器获取到建议消息并对达成一致的内容进行消息传递。如果领导服务器无法服务的时候,ZooKeeper将会从随从服务器中重新选择一个领导服务器。

ZooKeeper使用一个自定义的原子性协议,这种协议可以保证本地数据保持一致。领导服务器接收到一个写请求的时候,它将会计算出写完后的系统状态,然后将这个写操作转换为一个可以获取到新状态事务。

转载于:https://my.oschina.net/MyHeaven1987/blog/726193

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值