当集群中的服务器出现已下两种情况时会进行Leader的选举
当节点初始起动时会在集群中寻找Leader节点,如果找到则与Leader建立连接,其自身状态变化follower或observer。如果没有找到Leader,当前节点状态将变化LOOKING,进入选举流程。
在集群运行其间如果有follower或observer节点宕机只要不超过半数并不会影响整个集群服务的正常运行。但如果leader宕机,将暂停对外服务,所有follower将进入LOOKING 状态,进入选举流程。
zookeeper 的数据同步是为了保证各节点中数据的一至性,同步时涉及两个流程:
leader 接收客户端写请求,并同步给各个子节点(如上图)。但实际情况要复杂的多,比如client 它并不知道哪个节点是leader 有可能写的请求会发给follower ,由follower在转发给leader进行同步处理,如下:
在集群运行过程当中如果有一个follower节点宕机,由于宕机节点没过半,集群仍然能正常服务。当leader 收到新的客户端请求,此时无法同步给宕机的节点。造成数据不一至。为了解决这个问题,当节点启动时,第一件事情就是找当前的Leader,比对数据是否一至。不一至则开始同步,同步完成之后在进行对外提供服务。 如何比对Leader的数据版本呢,这里通过ZXID事务ID来确认。
ZooKeeper响应少量命令。每个命令由四个字母组成。可通过telnet或nc向ZooKeeper发出命令。 这些命令默认是关闭的,需要配置4lw.commands.whitelist来打开,可打开部分或全部示例如下:
- 4lw.commands.whitelist=stat, ruok, conf, isro
- 4lw.commands.whitelist=*
安装 Netcat 工具,已使用 nc 命令
- yum install -y nc
echo stat | nc localhost 2181 命令列表
ZK 选举协议:ZAB,是选举过程和数据写入过程的基石。 ZAB的理解:所有事务请求是由一个全局唯一的服务器来协调处理,这个的服务器就是Leader服务器, 其它服务器都是Follower服务器或Observer服务器。Leader服务器负责将一个客户端的请求转换成那个一个事务Proposalͧ(提议),将该Proposal分发给集群中所有的Follower服务器。然后Leader服务器需要等待所有Follower服务器的应答,当Leader服务器收到超过半数的Follower服务器进行了明确的应答后,Leader会再次向所有的Follower服务器分发Commit消息,要求其将前一个Proposal进行提交。
涉及到客户端对zk集群数据改变的行为都先由Leader统一响应,然后再把请求转换为事务转发给其他所有的Follower,Follower应答并处理事务,最后再反馈。如果客户端只是读请求,那么zk集群所有的节点都可以响应这个请求
Leader 事务请求的唯一调度和处理者,保证集群事务处理的顺序序性 集群内部各服务器的调度者 Follower 处理客户端非事务请求,转发事务请求给Leader服务器 参与事务请求 Proposal 的投票 参与 Leader 的选举投票 Observer 处理客户端非事务请求,转发事务请求给Leader服务器 不参加任何形式的投票,包括选举和事务投票(超过半数确认) Observer 的存在是为了提高zk集群对外提供读性能的能力
zk服务器状态ServerState 类中定义ZK四种状态。 LOOKING 寻找 Leader 状态 当服务器处于这种状态时,表示当前没有Leader,需要进入选举流程 FOLLOWING 从机状态,表明当前服务器角色是Follower OBSERVING 观察者状态,表明当前服务器角色是Observer LEADING 领导者状态,表明当前服务器角色是Leader
集群机制: zk 集群的tcp连接顺序是1向2发起 TCP 连接,2向3发起 TCP 连接。
选举机制:
临时节点失效:可以设置 timeout 时期