1.Zookeeper 是什么?
Zookeeper 是一个分布式协调服务,基于它实现诸如数据发布/订阅,负载均衡,命名服务,分布式协调/通知,集群管理,Master选举,分布式锁和分布式队列等功能等。
Zookeeper 是一个高可用的分布式管理与协调框架,基于ZAB算法(原子消息广播协议)的实现。该框架能够很好的保证分布式环境中数据的一致性。也正是基于这样的特点,使得Zookeeper成为了解决分布式一致性问题的利器。
Zookeeper的特性:
顺序一致性:从一个客户端发起的事务请求,最终将严格地按照其发起的顺序被应用到Zookeeper 中去
原子性:所有事务请求的处理结果在整个集群中所有的机器上的应用情况都是一致的,也就是说,要么整个集群所有的机器都成功,要么都失败,不会出一部分成功 一部分失败。
单一视图:无论客户端连接的是哪一个zookeeper服务器,其看到的服务端数据都是一致的。
可靠性:一旦服务器成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务器端状态将会被一致保留下来。除非有另外一个事务对其更改。也就是如果集群的各个节点出现网络问题 未同步成功,那么客户端会一直等待服务器端的响应,或者返回超时异常。
实时性:通常所说的实时性就是指一旦事务被成功应用,那么客户端就能立刻从服务器上获取变更后的数据,仅仅能保证一段时间内,客户端最终一定能从服务器端读取最新的数据状态。
Zookeeper 的核心是原子广播:
这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。 各个节点之间同步的算法 就是 Paxos,它是一个基于消息传递的一致性算法。
为了保证事务的顺序一致性:
zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。
每个Server在工作过程中有三种状态:
LOOKING:当前Server不知道leader是谁,正在搜寻
LEADING:当前Server即为选举出来的leader
FOLLOWING:leader已经选举出来,当前Server与之同步
全局数据一致性:
每个server保存一份相同的数据副本,client无论连接到哪个 server,数据都是一致的。
2、Zookeeper 设计目标:
1、简单的数据结构。就是以简单的树形结构来进行相互协调的
2、可构件集群。一般要基数个节点,只要集群中半数以上正常运行就能对外提供服务
3、顺序访问。每个客户端请求都会分配一个全局唯一的递增编号,这个编号反应了所有事务操作的先后顺序
4、高性能。它是将全量数据存储在内存中,并直接服务与所有的非事务请求,尤其在读场景下性能突出,但是它不适合存储大量数据。
3、Zookeeper的结构
Zookeeper会维护一个具有 层次关系的数据接口,它类似于一个标准的文件系统。
每个子目录项如 NameService 都被称作为znode,和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。
有四种类型的znode:
1、PERSISTENT-持久化目录节点 :客户端与zookeeper断开连接后,该节点依旧存在
2、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
3、EPHEMERAL-临时目录节点
客户端与zookeeper会话结束,该节点被删除 ,多用于处理分布式锁
4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
4、Zookeeper组成
5、Zookeeper应用场景
配置管理、数据发布/订阅,负载均衡,命名服务,分布式协调/通知,集群管理,Master选举,分布式锁和分布式队等
命名服务
在分布式环境下,经常需要对应用/服务进行统一名称,便于识别。例如:IP不容易记住,而域名容易记住
配置管理
配置信息写入zookeeper上的znode。
各个客户端服务器监听这个znode。
统一集群管理
1) 分布式环境中,实时掌握每个节点的状态是必要的。
可根据节点实时状态做出一些调整
2)Zookeeper可以是实现实时监控节点状态变化
可将节点信息写入Zookeeper上的一个Znode
监听这个znode可获取它的实时状态变化
服务器动态上下线
客户端能实时洞察到服务器上下线的变化
软负载均衡
在Zookeeper中记录每台服务器的访问次数,让访问最少的服务器去处理最新的请求
下一节链接地址http://blog.youkuaiyun.com/lm324114/article/details/78376776