zookeeper它是为分布式的应用提供了一个高效可靠的一个分布式协调服务。它的实现依赖zab协议,用来保证数据的一致性。zookeeper使分布式应用可以通过一个共享的树形结构的命名空间实现协调,zookeeper将所有的数据存储在内存中,zookeeper集群中的任何一台机器都可以响应客户端的读操作,zookeeper更适合读操作为主的业务场景。zookeeper集群包括三种角色:leader、follower和observer。其中leader是通过选举出来的,为客户端提供读写操作,主要用来处理事务操作。Follower和observer提供读操作,不同的是follower参与leader选举和过半提交,而observer不参与,只提供读操作,因此observer可以提高读的性能。zookeeper节点分为:临时节点、持久节点、顺序节点。最主要的功能是watcher监听机制。
zab协议:是zookeeper的底层协议,包括故障恢复和消息广播。zab协议只有leader可以处理事务请求。leader收到请求之后,将事务请求转换成proposal,leader会为每个follower创建一个队列,将事务加入队列,保证顺序性,follower收到后将写入到本地日志中,并向leader发送ack,leader当收到一半以上follower的ack响应后,向follower节点发送commit请求,同时leader也提交该提案。
zab协议有两种模式:故障恢复和消息广播。当系统宕机或者leader服务器挂掉,系统会进入故障恢复模式,然后选出新的leader,然后与follower进行数据同步,之后推出故障恢复模式,进入消息广播模式。leader将事务请求转发给follower,等待反馈,当一半以上的follower给出ack响应,leader发送commit,然后自己也提交。
故障恢复包括两部分:leader选举和数据同步。数据同步是leader为每个follower准备了一个队列,leader将还没有提交的事务请求发送给队列,然后跟随者一个commit指令,这样使得新leader与follower数据同步。
新leader选举的条件:leader宕机或者挂掉,集群中少于一半的节点与当前leader保持连接。