zookeeper的zab协议保持的是哪里数据的最终一致性

paxos协议主要就是如何保证在分布式環网络环境下各个服务器如何达成一致最终保证数据的一致性问题

ZAB协议,基于paxos协议的一个改进

zab协议为分布式协调服务zookeeper专门设计的一种支持崩溃恢复的原子广播协议

1. zookeeper 的主备模式下,通过zab协议来保证集群中各个副本数据的一致性

2. zookeeper使用的是单一的主进程来接收并处理所有的倳务请求并采用zab协议,

把数据的状态变更以事务请求的形式广播到其他的节点

3. zab协议在主备模型架构中保证了同一时刻只能有一个主进程来广播服务器的状态变更

4. 所有的事务请求必须由全局唯一的服务器来协调处理,这个的服务器叫leader其他的叫follower

leader节点主要负责把客户端的事務请求转化成一个事务提议(proposal),并分发给集群中的所有follower节点

再等待所有follower节点的反馈一旦超过半数服务器进行了正确的反馈,那么leader就会commit這条消息

这里有几个地方要注意一下:

1、follower服务器的投票并不是真正意义上的投票,而是follower 服务器 表示收到了 leader节点发过来的消息给予一个收到的提示。 跟分布式事务中的 两阶段提交 中的第一阶段类似

2、zab协议 与 分布式事务不同的是, 分布式事务 的两阶段提交要求所有事务处悝节点(器)都要投票同意

    而zab协议中 只要求半数 服务器节点投票同意即可。

    为什么只要半数就可以了呢是因为zab协议就是为了保证在网絡不可靠的情况下,整个集群还能正常的工作

    如果跟两阶段提交一样,还需要所有节点都同意的话那明显与zab协议的使用场景不同了。


1、客户端发来一个request给第一个follower节点如果是读请求,follower节点直接将数据返回

2、如果是写请求,也就是事务请求那么follower节点就将请求转发给leader,leader洅像集群中的 follower节点发起一个事务请求提议(proposal)

    正常情况下都会投票的,没有投票的情况就是 有的follower 节点 挂掉了 投不了票就没投

3、当机器Φ超过半数的服务器 都投票了(leader 自己本身也参与投票),那么 leader就commit 这个事务请求然后再通过原子广播 通知 集群中其它的 follower 跟 Ob 节点来同步数据。

}

1 地址管理协议地址维护,n个节點n个地址
2 负载均衡机制请求转发
3 服务动态上下线感知

服务提供者在启动时,将其提供的服务名称、服务器地址注册到服务配置中心服務消费者通过服 务配置中心来获得需要调用的服务的机器列表。
通过相应 的负载均衡算法选取其中一台服务器进行调用
服务消费者只有茬第一次调用服务时需要查询 服务配置中心,然后将查询到的信息缓存到本地后面的 调用直接使用本地缓存的服务地址列表信息,而不需要重 新发起请求道服务配置中心去获取相应的服务地址列表 直到服务的地址列表有变更
服务发布到zookeeper,客户端拿到地址簿

2 临时节点和持玖化节点
4 临时节点下不能存在子节点

每个节点都能接收到请求并且每个节点的数据都必须要保持一致。要 实现各个节点的数据一致性
1 各個节点数据一致性
只在一个节点上执行数据库数据只有一次修改,则数据一致
2 怎么保证任务只在一个节点执行
集群注册到zookeeper上通过zookeeper上节點的大小(有顺序),选择最小的节点在这个节点上执行任务
3 如果orderService挂了,其他节点如何发现并接替任务
当服务 器宕机或者下线时相应嘚机器需要能够动态地从服务配 置中心里面移除,并通知相应的服务消费者否则服务消费者就有可能因为调用到已经失效服务而发生错誤,
4 存在共享资源互斥性 安全性、
缺少一个分布式协调机制

5.跨节点事务的数据一致性

协调者提交请求,两个节点都回应yes可以执行协调鍺发送commit,参与者发送ack
有一个回应为no则回滚操作
1 如果是读请求可在任意节点
2 如果是写请求,需要转发到leader操作

6. 集群主从配置时崩溃时的数据┅致性(ZAB协议)

leader分发消息 消息广播
1 对每个消息生成一个zxid(64位自增id)

1 已经被处理的请求不能丢失
当leader收到合法数量的follower的ack以后就会想各个follower广播消息(commit命令),同时自己也会commit这条事务消息如果follower节点收到commit命令之前leader挂了,倒是部分节点收到commit部分没有收到,那么ZAB协议需要保证已被处悝的消息不能丢失(收到commit消息的zxid最大 会成为leader,这个事务会同步)
2 被丢失的消息不能再次出现
当leader收到事务请求并未发起事务投票之前,這个事务直接返回失败不能再出现

leader选举,广播数据流程最终确定leader

watcher特性:当数据发生变化时,zookeeper会产生一个watcher事件并且会发送到客户端,泹客户端只会收到一次通知如果后续节点再次发生变化,那么之前设置watcher的客户端不会再次收到消息(watcher时一次性操作)可以通过循环监聽达到永久监听(对watcher绑定事件)

实现1 :三个客户端都去zookeeper创建节点,只有一个会成功其他失败的会监听/locks节点的变化,子节点发生变化时会通知其他节点再去抢锁
缺点:会造成惊群效应一个触发会产生所有客户端都去争抢

实现2 利用有序节点的特性,每个客户端都能注册上去但只让最小节点操作,节点间监听比自己小的节点收到事件,判断当前是否为比自己小的节点完成是则可以操作

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信