动物园管理员——ZooKeeper
Posted 菜鸟联盟NoobAssn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动物园管理员——ZooKeeper相关的知识,希望对你有一定的参考价值。
随着分布式架构的出现,越来越多的分布式应用会面临数据一致性的问题。很遗憾的是,在解决分布式数据一致性上,除了ZooKeeper之外,目前还没有一个成熟稳定且被大规模应用的解决方案。
——《从Paxos到ZooKeeper分布式一致性原理与实践》
推荐阅读时间:10分钟
分布式系统与数据一致性
分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。
由于分布式系统是由多个节点构成的,因此如何保证数据在各个节点上的一致性显得尤为重要。
ZooKeeper的核心就是保证分布式系统中数据的一致性,可以说围绕它的绝大部分功能都是基于此实现的。
ZooKeeper诞生于雅虎,为了管理分布在各个服务器节点上的以动物命名的分布式应用,而起名为“动物园管理员”。
几个关键概念
首先,介绍一下ZooKeeper中比较重要的几个概念。
ZNode
最核心的概念!ZooKeeper在内存中维护者一个树形层次结构,树中的节点称为ZNode,每个ZNode都可以存储数据。如下图:
对ZNode的访问具有原子性特点,即不会出现读取或更改ZNode中部分数据的情况。
ZNode有两种:临时节点和持久节点。临时节点会在客户端断开连接时被删除,而持久节点不会。此外,还有顺序节点,顺序节点会在创建上面的两种节点的基础上,给每个节点追加一个自增数字,该数字由其父节点维护。
Watches
客户端可以在节点上添加监控(watches),当节点状态发生变化时,通知该客户端并删除监控,即一个watches只能被触发一次。
ACL
每个ZNode都附带一个ACL(Access Control List)列表,ACL是权限控制列表,用于决定谁可以执行何种操作。
ACL的五种权限:
CREATE: 可以创建一个子节点
READ: 可以从节点获取数据并列出其子项。
WRITE: 可以设置节点的数据
DELETE: 可以删除一个子节点
ADMIN: 可以设置ACL权限
应用场景
介绍完概念,让我们看下围绕ZooKeeper的这些概念,产生了哪些应用场景。
配置中心
由于ZooKeeper可以保证存储数据的一致性,所以可以将它作为公共参数配置中心,当某个配置信息发生变动时,还可以利用监控特性,及时通知客户端。
集群管理
集群管理主要包括两部分:选举master、监控各个服务节点的状况(加入或断开)。
每添加一个服务节点,就创建一个对应的临时ZNode。选举master可以通过选取序列号最小的临时ZNode实现。监控节点可以通过ZNode的监控功能实现。
分布式锁
锁分为两种:排它锁和共享锁。
对于排它锁,可以通过使多个客户端共同尝试创建同一个临时节点实现,如: /exclusive/lock 节点。由于一个节点只能创建一次,所以只会有一个节点创建成功,表示该节点获得了锁。同时由于是临时节点,当该客户端断开时,节点便会删除,意味着释放了锁。
对于共享锁,则需要利用顺序节点的特性。每次读和写都创建一个顺序临时节点,当执行读请求时,若不存在序号比自己小的节点或者比自己小的节点中没有写请求时,则可以执行,否则等待;当执行写请求时,只有不存在比自己小的节点时,才可以执行,否则等待。
分布式队列
ZooKeeper也可以实现消息队列!实现原理就是根据临时顺序节点特性实现。按节点顺序号由小到大依次消费。
命名服务
比如,在dubbo中,不同服务节点提供的不同的服务可以在ZooKeeper中按相应目录结构创建,通过路径名即可识别相应服务。
ZooKeeper还有其他一些其他应用,感兴趣可以自行搜索。(我不会告诉你我也没怎么去查过)
深入:ZAB(选读)
原理和功能都已经讲完了,可是你知道ZooKeeper集群是如何保证各个ZooKeeper节点上的ZNode数据一致的吗?其实主要是依赖了ZooKeeper特有的ZAB协议。
ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息广播协议)是zookeeper数据一致性的核心算法。主要包括两个可无限重复的阶段:
领导者选举
集群中所有的机器通过选举,产生一个leader,其他的节点都是follower。当超过半数的follower将其状态与leader同步,该阶段结束。
原子广播
对于读请求,所有的节点都可以提供服务。对于写请求,只有leader节点提供服务,follower会将写请求转发给leader,由leader统一广播该请求。当半数以上的follower将修改持久化后,leader才会提交该更新,给客户端返回写入成功的响应。
当leader出现故障时,将重复上述阶段,当故障leader恢复时将变成follower。
如果觉得对你有帮助,麻烦点下赞和关注,谢咯(o゚▽゚)o
以上是关于动物园管理员——ZooKeeper的主要内容,如果未能解决你的问题,请参考以下文章