众所周知,分布式协调服务很难正确无误的实现,它们很容易在竞争条件和死锁上犯错误。如何在这方面节省力气?Zookeeper是一个不错的选择。Zookeeper背后的动机就是解除分布式应用在实现协调服务上的痛苦。本文在介绍Zookeeper的基本理论基础上,用Zookeeper实现了一个配置管理中心,利用Zookeeper将配置信息分发到各个服务节点上,并保证信息的正确性和一致性。
ZooKeeper是干啥的?
ZooKeeper是一个开源的分布式协调服务,他为分布式应用提供了高效且可靠的分布式协调服务,提供了诸如统一命名空间服务,配置服务和分布式锁等分布式基础服务。
ZooKeeper基本概念
集群角色
和Paxos算法中的集群角色类型,ZooKeeper中包含Leader、Follower和Observer三个角色;
通过一次选举过程,被选举的机器节点被称为Leader,Leader机器为客户端提供读和写服务;
Follower和Observer是集群中的其他机器节点,唯一的区别就是:Observer不参与Leader的选举过程,也不参与写操作的过半写成功策略。
一个典型的ZooKeeper集群如下:
会话
会话就是一个客户端与服务器之间的一个TCP长连接。客户端和服务器的一切交互都是通过这个长连接进行的;
会话会在客户端与服务器断开链接后,如果经过了设点的sessionTimeout时间内没有重新链接后失效。
节点
节点在ZeeKeeper中包含两层含义:
集群中的一台机器,我们成为机器节点;
ZooKeeper数据模型中的数据单元,我们成为数据节点(ZNode)。
ZooKeeper的数据模型是内存中的一个ZNode数,由斜杠(/)进行分割的路径,就是一个ZNode,每个ZNode上除了保存自己的数据内容,还保存一系列属性信息;
ZooKeeper中的数据节点分为两种:持久节点和临时节点。
所谓的持久节点是指一旦这个ZNode创建成功,除非主动进行ZNode的移除操作,节点会一直保存在ZooKeeper上;而临时节点的生命周期是跟客户端的会话相关联的,一旦客户端会话失效,这个会话上的所有临时节点都会被自动移除。
版本
ZooKeeper为每一个ZNode节点维护一个叫做Stat的数据结构,在Stat中维护了节点相关的三个版本:
当前ZNode的版本 version
当前ZNode子节点的版本 cversion
当前ZNode的ACL(Access Control Lists)版本 aversion
关于怎么快速学大数据编程,有什么方法,这个问题,想必大家都已经心中有数了,打算深入了解这个行业的朋友,可以加下小编的大数据学习:790965747,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2018最新的大数据资料和0基础入门教程,欢迎初学和进阶中的小伙伴。
每天晚上20:00我都会开直播给大家分享大数据编程学习知识和路线方法,群里会不定期更新最新的教程和学习方法(进群送2018大数据编程学习教程),大家都是学习大数据的,或是转行,或是大学生,还有工作中想提升自己能力的大数据党,如果你是正在学习大数据的小伙伴可以加入学习。最后祝所有程序员都能够走上人生巅峰,让代码将梦想照进现实,非常适合新手学习,有不懂的问题可以随时问我,工作不忙的时候希望可以给大家解惑。
监听器Watcher
ZooKeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper会通过事件通知到感兴趣的客户端上。
ACL(Access Control Lists)
ZooKeeper中定义了5中控制权限:
CREATE:创建子节点的权限
READ:获取节点数据和子节点列表的权限
WRITE:跟新节点数据的权限
DELETE:删除子节点的权限
ADMIN:设置节点ACL的权限。
其中CREATE和DELETE这两种权限都是针对子节点的权限控制。
ZooKeeper的数据模型
上面有提到ZooKeeper的数据模型是一个ZNode节点树,是一个类型与标准文件系统的层次结构,也是使用斜杠(/)进行分割,如下图:
在ZooKeeper中每一个节点都可以使用其路径唯一标识,如节点p_1的标识为:/app1/p_1
每个ZNode节点都可以存储自己的数据,还可以拥有自己的子节点目录。
Zookeeper在我们业务逻辑上的运用
我们公司做极光推送,Push 业务平台有大量的逻辑服务器,按业务类型分组。逻辑服务的运行依赖于配置,并且配置会在线调整,需要一个集中的配置项管理中心。Zookeeper的发布与订阅特性以及发送更新通知的机制很好的满足了我们的需求。Zookeeper的容灾特性也免去了我们相关的大量管理工作。
下面我和大家分享一下Zookeeper在我们内部服务中的应用
我们的逻辑服务器包含两类配置
一种为Acl(访问控制列表),用户的消息消费后,按照列表中的条件走向下一个逻辑服务器。
另一种只是单独的算法逻辑的外提,称为Agl(访问算法列表),但是其中某些判断条件会经常变化。这两类配置被收集到了配置管理中心(即Zookeeper)
逻辑图如下
用户编辑好策略配置信息(xml格式),通过客户端加载到Zookeeper。Zookeeper立即通知其下的逻辑服务器(BLx),逻辑服务器下载最新的配置策略,并应用新的策略。新的策略有可能改变某一段id范围内用户的数据流向,或越过原来的逻辑服务器,或指向新加入的逻辑服务器。
数据模型设计
同一类型的逻辑服务在Zookeeper上创建一个节点,共享相同的配置信息。
该节点下面为策略配置项,分为Acl和Agl两类,如下图:(以代理逻辑服务为例)
Acl1, Acl2, Acl3, Agl1, Agl2分别存有策略配置信息。变化后会通知监听Proxy节点的逻辑服务器,Proxy逻辑服务器下载最新策略,并应用该策略。新节点的加入和退出也会通知到Proxy逻辑服务器。
业务处理流程如下图
逻辑服务监听自己类型节点(本例如前图Proxy节点)
编辑新策略,加载策略到Zookeeper(策略保存在Proxy/Acls/Acl[1..n],或Proxy/Agls/Agl1[1..n])
Zookeeper通知各逻辑节点
各逻辑节点下载新策略到本地,并应用新策略
关于怎么快速学大数据编程,有什么方法,这个问题,想必大家都已经心中有数了,打算深入了解这个行业的朋友,可以加下小编的大数据学习:790965747,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2018最新的大数据资料和0基础入门教程,欢迎初学和进阶中的小伙伴。
每天晚上20:00我都会开直播给大家分享大数据编程学习知识和路线方法,群里会不定期更新最新的教程和学习方法(进群送2018大数据编程学习教程),大家都是学习大数据的,或是转行,或是大学生,还有工作中想提升自己能力的大数据党,如果你是正在学习大数据的小伙伴可以加入学习。最后祝所有程序员都能够走上人生巅峰,让代码将梦想照进现实,非常适合新手学习,有不懂的问题可以随时问我,工作不忙的时候希望可以给大家解惑。
领取专属 10元无门槛券
私享最新 技术干货