什么是ZooKeeper
ZooKeeper原意为动物园管理员,是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,它提供了一系列简单的原子操作,分布式系统可以使用这些操作实现上层的服务,例如:配置维护、名字服务、分布式同步、集群管理等等。
ZooKeeper的特性
简单的。ZooKeeper通过一个共享的类似于文件系统的命名空间实现分布式系统的协调功能,它封装好了分布式系统中复杂而且容易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
分布式的。ZooKeeper是为分布式系统提供服务的,同时它本身也是支持分布式的。
组成ZooKeeper服务的各个主机需要知道其他主机是否在线,只要超过一半的主机没有宕机,整个ZooKeeper服务就仍然可用。客户端使用ZooKeeper服务的时候只需要连接任意一台主机即可。客户端和ZooKeeper的主机之间通过TCP保持长连接,如果客户端与主机之间的连接断掉,客户端就会连接到另一台主机上。
有序的。ZooKeeper对每一次的更新操作都会用一个数字来标记,从而记录ZooKeeper事务的顺序。分布式系统可以使用这个顺序实现上层的服务。
高效的。ZooKeeper可以支持上千台机器的分布式系统,如果大部分工作都是读取操作,ZooKeeper会显得尤为高效,如果读写比例在10:1左右,效率将达到最高。
ZooKeeper的数据模型和命名空间
ZooKeeper的命名空间类似于一个标准的文件系统,但与文件系统唯一不同的是ZooKeeper中的每个节点都可以存储数据,相当于文件系统中的目录也可以包含数据。每个名字都是一个以‘/’分隔元素的路径。ZooKeeper命名空间中的每个节点都是用路径来标识的。
数据模型的特点
- 每个目录项被称作为znode,每个znode 被它所在的路径唯一标识。znode存储的数据不能太大,限制在1M以内。
- znode可以有子节点目录,并且每个 znode可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录。
- 每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据。
- znode可以是临时节点,一旦创建这个 znode的客户端与服务器失去联系,这个 znode也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为session,如果 znode 是临时节点, session失效,znode就被删除。
- znode的目录名可以自动编号,如 App1 已经存在,再创建的话,将会自动命名为App2。
- znode可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端。
ZooKeeper的三种角色
- Leader:负责进行投票的发起和决议,更新系统状态。
- Follower:接受客户端请求并向客户端返回结果,在选主过程中进行投票。
- Observer:和Follower一样处理客户端请求,但是不参与投票,只同步Leader状态。
Zab协议(原子广播协议)
- 可靠提交:指如果一个message被提交,则该消息会被传递到所有的server上。
- 全局有序:指各个Server收到的message有序,这个由TCP协议保证;
- 因果有序:指如果a消息发生在b消息之前,并被一起发送,那么对于每个Server,a消息都在b消息之前被执行。
- Leader选举。选出具有最大zxid(事物id)的server作为leader,采用FastPaxos算法。
- Leader和Follower同步数据。follower连接leader,将自己的zxid发送给leader,leader根据zxid确定同步点
- Active Messaging。leader从消息队列里面提取消息,并向follower发送proposal,如果有超过一半的follower接受该提议并发送ACK给leader后,leader就发送commit指令给follower,然后该消息被提交。