分布式系统Quorum机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/manongxiaomei/article/details/86081700

Write-all-read-one

Write-all-read-one(简称 WARO)是一种最简单的副本控制规则,顾名思义即在更新时写所有的副本,只有在所有的副本上更新成功,才认为更新成功,从而保证所有的副本一致,这样在读取数据时可以读任一副本上的数据。
缺点:读服务的可用性较高,但更新服务的可用性不高

Quorum 定义

Quorum 机制只需成功更新 N 个副本中的 W 个,在读取 R 个副本时,一定可以读到最新的成功提交的数据。R>N-W
注:仅仅依赖 quorum 机制是无法保证强一致性的。因为仅有 quorum 机制时无法确定最新已成功提交的版本号,除非将最新已提交的版本号作为元数据由特定的元数据服务器或元数据集群管理,否则很难确定最新成功提交的版本号。

如何读取最新成功提交的数据

1. 限制提交的更新操作必须严格递增,即只有在前一个更新操作成功提交后才可以提交后一个更新操作,从而成功提交的数据版本号必须是连续增加的。

2. 读取 R 个副本,对于 R 个副本中版本号最高的数据,若已存在 W 个,则该数据为最新的成功提交的数据;若存在个数据少于 W 个,则继续读取其他副本,直若成功读取到 W 个该版本的副本,则该数据为最新的成功提交的数据;如果在所有副本中该数据的个数肯定不满足 W 个,则 R 中版本号第二大的为最新的成功提交的副本。

注:在单纯使用 Quorum 机制时,若要确定最新的成功提交的版本,最多N 个副本,当出现任一副本异常时,读最新的成功提交的版本这一功能都有可能不可用。

基于 Quorum 机制选择 primary

在基本 primary-secondary 协议中引入 quorum 机制,即 primary 成功更新 W 个副本(含 primary 本身)后向用户返回成功。

读取数据:

①如果需要强一致性的立刻读取到最新的成功提交的数据,则可以只读 primary 副本上的数据

②如果需要会话一致性,则可以根据之前已经读到的数据版本号在各个副本上进行选择性读取

③如果只需要弱一致性,则可以选择任意副本读取。

选择primary更新数据:

①以新primary的版本为准,其他版本认为是脏数据

②以最高版本为准,新primary同步到最新版本

实例:

Zookeeper 使用的 paxos 协议本身就是利用了 Quorum机制,后面介绍。
当利用 paxos 协议外选出 primary 后,Zookeeper 的更新就由 primary 节点控制,每次更新操作,primary 节点只需更新超过半数(含自身)的节点后就返回用户成功。每次更新操作都会递增各个节点的版本号(xzid)。当 primary 节点异常,利用 paxos 协议选举新的 primary 时,每个节点都会以自己的版本号发起 paxos 提议,从而保证了选出的新 primary 是某个超过半数副本集合中版本号最大的副本。但是新 primary 的版本号未必是一个最新已提交的版本,可能是一个只更新了少于半数副本的中间态的更新版本,此时新primary 完成与超过半数的副本同步后,这个版本的数据自动满足 quorum 的半数要求;另一方面,新 primary 的版本可能是一个最新已提交的版本,但可能会存在其他副本没有参与选举但持有一个大于新 primary 的版本号的数据(中间态版本),此时这样的中间态版本数据将被认为是脏数据,在与新 primary 进行数据同步时被 zookeeper 丢弃。

猜你喜欢

转载自blog.csdn.net/manongxiaomei/article/details/86081700