zookeeper介绍
百度百科
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
ZooKeeper的基本运转流程:
1、选举Leader。
2、同步数据。
3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。
4、Leader要具有最高的执行ID,类似root权限。
5、集群中大多数的机器得到响应并接受选出的Leader。
在ZooKeeper中,每⼀个数据节点都能够维护⼀份⼦节点的顺序顺列
zookeeper作用
主要用于解决分布式集群中应用的一致性问题
通过类似文件系统的Znode树方式进行数据存储,来维护和监控数据的状态变化,达到基于数据的集群管理
- 集群管理
在分布式集群中,zookeeper提供协调节点的服务,对集群中各节点进行监测、管理
- 节点加入与退出
所有节点在父目录groupMembers下创建临时节点目录,且所有节点都对父目录下的子节点进行监听
一旦某个子节点宕机,则断开zookeeper的连接,对应的临时目录也进行删除,且对所有监听的节点进行通知 - 选举master
利用临时有序节点的特性来实现
所有参与选举的节点在 ZooKeeper 服务器的/master节点下创建临时有序节点,编号最小的节点选举为master
后续的节点监听前一个节点的删除事件,用于重新选举master(某一节点宕机,则对其进行监听的节点被选举为master)
- 分布式锁
分布式环境下,存在各个节点都能够访问的共享资源,zookeeper通过临时序列节点机制实现分布式锁 - 配置管理
分布式环境下,zookeeper提供了对各节点配置的管理、更新服务
将节点配置的变更,通知到集群中的所有节点 - 状态同步
- 命名服务
客户端可以通过指定名字来获取资源或服务的地址和提供者的信息等
帮助应用系统通过一个资源引用的方式来实现对资源的定位与使用
广义上的命名服务的资源定位都不是真正意义上的实体资源,在分布式环境中,上层应用仅需要一个全局唯一ID
zookeeper会在数据模型上,创建一个以路径为名称的节点;路径为名称,实体为具体指向的内容(实体指向的可以是提供服务的地址、远程对象等) - 负载均衡
zookeeper建立servers节点,每个服务器启动时,都在servers节点下创建子节点,并存入对应服务器相关信息
zookeeper创建监听器监听servers中个节点的状态,并可自定义负载均衡算法,根据算法从服务器列表中获取处理请求的服务器来处理请求
zookeeper角色
zookeeper包括Leader、Follower和Observer三种角色
- Leader:被选举出来的zookeeper节点
- 为客户端提供读写服务
- 在ZAB崩溃恢复之后,消息广播之前,进行集群中的数据同步
- 维持与Learner的心跳,接收Learner的请求消息,根据不同消息类型进行处理
- Learner消息类型:
- PING
- REQUEST:Follower发送的提议信息,包括写请求与同步请求
- ACK:Follower对提议的回复,超半数通过
- REVALIDATE:延长SESSION有效时间
- …
- Follower
- 参与选举Leader
- 为客户端提供读服务
- 与Leader保持心跳连接
- Observer
- 不参与选举Leader
- 为客户端提供读服务
Learner:代表Follower与Observer
当Leader接收到一个写请求时,会发送给所有的Follower,统计写入成功的数量;当超过半数的Follower返回写入成功时,则Leader认为写请求成功,通知所有Follower进行commit
所有的写请求都会转发给Leader节点进行处理
zookeeper数据模型
zookeeper提供了分层的命名空间,类似操作系统的文件系统
命名空间中每个节点都称作Znode
参考:https://www.cnblogs.com/tgzhu/p/14750323.html