一、概述
1、是什么
zookeeper是一个分布式的,开放源码的分布式应用程序的协调服务,是google的Chubby一个开源的实现,是一个高可用、强一致性的数据库。
2、干什么
集群管理,统一命名服务,分布式配置管理,分布式消息队列,分布式锁,分布式通知协调
实例:对于zk+dubbo结合使用而言,zk是服务注册中心,dubbo的服务提供方和消费方都在zk注册,这样服务消费方就可以找到服务提供方。zk自带watcher监听,可以保证服务上线下线变更及时通知。
3、构成
zookeeper的实现是由 client 、server 构成
zk通常由 2n+1 台 server 组成,只要有 n+1 台 server 可用,整个系统保持可用
4、有哪些角色
角色 | 描述 |
---|---|
领导者 (leader) | 负责进行投票的发起和决议,更新系统状态 |
学习者-跟随者 (follower) | follower用于接收客户端请求并向客户端返回结果,在选主过程中参与投票 |
学习者-观察者(observer) | observer可以接收客户端连接,将写请求转发给leader节点,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度 |
客户端(client) | 请求发起方 |
二、为什么
1、相关现状
(1)大部分分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程(如资源、任务分配等)
(2)目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制
(3)协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器
(4)Keepalived监控节点不好管理、采用优先级监控(没有协同工作、功能单一)、可扩展性差
2、zookeeper优点
特点 | 说明 |
---|---|
最终一致性 | 为客户端展示同一个视图,这是zookeeper里面一个非常重要的功能 |
可靠性 | 如果消息被一台服务器接受,那么它将被所有的服务器接受 |
实时性 | Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口 |
独立性 | 各个Client之间互不干预 |
原子性 | 更新只能成功或者失败,没有中间状态 |
顺序性 | 所有Server,同一消息发布顺序一致 |
三、怎么用
1、工作原理
(1)每个Server在内存中存储了一份数据
(2)Zookeeper启动时,将从实例中选举一个Leader(Paxos协议)
(3)Leader负责处理数据更新等操作
(4)一个更新操作成功,当且仅当大多数Server在内存中成功修改数据
2、核心
Zookeeper 的核心是原子广播,这个机制保证了各个 Server 之间的同步,实现这个机制的协议叫做 Zab 协议。Zab 协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领与者被选举出来,且大多数 Server 完成了和 leader 的状态同步以后,恢复模式就结束了。状态同步保证了 leader 和 Server 具有相同的系统状态。
为了保证事务的顺序一致性,zookeeper 采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了 zxid 。实现中 zxid 是一个64位的字,它高32位是epoch用来标识 leader 关系是否改变,每次一个 leader 被选出来,它都会有一个新的 epoch,标识当前属于那个 leader 的统治时期。低32位用于递增计数。
每个server在工作过程中有三种状态:
1、LOOKING:当前 Server 不知道 leader是谁,正在搜寻
2、LEADING:当前 Server 即为选举出来的 leader
3、FOLLOWING:leader 已经选举出来,当前 Server 与之同步