ZooKeeper集群解析。sql
这篇文章中来介绍一下 ZooKeeper 相关的集群角色,还有 ZAB协议,集群的安装在 ZooKeeper入门 中有介绍。服务器
server.0=192.168.182.130:2888:3888:Observer
。ZAB协议的实现借鉴于 Paxos,是为了解决分布式系统的数据一致性问题。markdown
zookeeper 就是根据 zab 协议创建了主备模型完成集群的数据同步(保证数据的一致性),前面介绍了集群的各类角色,这说所说的主备架构模型指的是,在 zookeeper 集群中,只有一台 leader(主节点)负责处理外部客户端的事务请求(写操做),leader 节点负责将客户端的写操做数据同步到全部的 follower 节点中,大概流程以下:网络
为何要有限比较ZXID呢?架构
由于ZXID为事务id,值越大,证实它的数据最新。分布式
在这个选举过程当中每一个 Server 有三种状态:oop
状况一的出现场景:post
当 leader 收到合法数量 follower 的 ACK 后,就向各个 follower 广播 commit 命令,同时也会在本地执行 commit 并向链接的客户端返回 成功,可是若是在各个 follower 在收到 commit 命令前 leader 就挂了,致使剩下的服务器并无执行都这条消息。spa
那么这种状况要怎么处理呢?日志
一、选举 ZXID 最大的节点做为新的 leader:因为全部提案被 commit 以前必须有合法数量的 follower ACK,即必须有合法数量的服务器的事务日志上有该 proposal,所以,ZXID 最大也就是数据最新的节点保存了全部被 commit 消息的 proposal 状态。 二、新的 leader 将本身事务日志中 proposal 但未 COMMIT 的消息处理。 三、新的 leader 与 follower 创建先进先出的队列, 先将自身有而 follower 没有的 proposal 发送给 follower,再将这些 proposal 的 COMMIT 命令发送给 follower,以保证全部的 follower 都保存了全部的 proposal、全部的 follower 都处理了全部的消息,经过以上策略,能保证已经被处理的消息不会丢。
状况二的出现场景
当 leader 接收到消息请求生成 proposal 后就挂了,其余 follower 并无收到此 proposal,所以通过恢复模式从新选了 leader 后,这条消息是被跳过的,此时,以前挂了的 leader 从新启动并注册成了 follower,他保留了被跳过消息的 proposal 状态,与整个系统的状态是不一致的,因此须要将其删除。
在 zookeeper 集群中数据副本的传递策略就是采用的广播模式,Zab 协议中的 leader 等待 follower 的 ack 反馈,只要半数以上的 follower 成功反馈就好,不须要收到所有的 follower 反馈。
具体步骤以下:
都读到这里了,来个 点赞、评论、关注、收藏 吧!
文章做者:IT王小二
首发地址:www.itwxe.com/posts/2c8e1…
版权声明:文章内容遵循 署名-非商业性使用-禁止演绎 4.0 国际 进行许可,转载请在文章页面明显位置给出做者与原文连接。