分布式系统设计(5)

再回忆一下我们前面介绍的几节:

第一节介绍数据分布方式:http://www.cnblogs.com/jacksu-tencent/p/3405680.html

第二节介绍副本控制协议:http://www.cnblogs.com/jacksu-tencent/p/3407712.html

第三节介绍基于Lease的分布式cache系统:http://www.cnblogs.com/jacksu-tencent/p/3409646.html

第四节介绍Lease机制本质以及判断节点状态:http://www.cnblogs.com/jacksu-tencent/p/3415529.html

本节主要介绍基于quorum机制选择primary,确保数据一致性,quorum机制的相关理论可以参考别的文档,在此就不再赘述。

基本 primary-secondary 协议中, primary 负责进行更新操作的同步工作。现在基本 primary-secondary 协议中引入 quorum 机制,即 primary 成功更新 W 个副本(含 primary 本身)后向用户返回成功。读取数据时依照一致性要求的不同可以有不同的做法:如果需要强一致性的立刻读取到最新的成功提交的数据,则可以简单的只读取 primary 副本上的数据即可,也可以通过最多读取R(R>N-W)个数据的方式读取;如果需要会话一致性,则可以根据之前已经读到的数据版本号在各个副本上进行选择性读取;如果只需要弱一致性,则可以选择任意副本读取。

在 primary-secondary 协议中,当 primary 异常时,需要选择出一个新的 primary,之后 secondary副本与 primary 同步数据。 通常情况下,选择新的 primary 的工作是由某一中心节点完成的,在引入quorum 机制后,常用的 primary 选择方式与读取数据的方式类似,即中心节点读取 R 个副本,选择R 个副本中版本号最高的副本作为新的 primary。新 primary 与至少 W 个副本完成数据同步后作为新的 primary 提供读写服务。首先, R 个副本中版本号最高的副本一定蕴含了最新的成功提交的数据。再者,虽然不能确定最高版本号的数是一个成功提交的数据,但新的 primary 在随后与 secondary 同步数据,使得该版本的副本个数达到 W,从而使得该版本的数据成为成功提交的数据。

在 N=5,W=3,R=3 的系统中,某时刻副本最大版本号为(v2 v2 v1 v1 v1),此时 v1 是

系统的最新的成功提交的数据,v2 是一个处于中间状态的未成功提交的数据。假设此刻原 primary副本异常,中心节点进行 primary 切换工作。这类“中间态”数据究竟作为“脏数据”被删除,还是作为新的数据被同步后成为生效的数据,完全取决于这个数据能否参与新 primary 的选举。下面分别分析这两种情况。

wps_clip_image-26277

第一、如图  2-12,若中心节点与其中 3 个副本通信成功,读取到的版本号为(v1 v1 v1),则任选一个副本作为 primary,新 primary 以 v1 作为最新的成功提交的版本并与其他副本同步,当与第 1、第 2 个副本同步数据时,由于第 1、第 2 个副本版本号大于 primary,属于脏数据,实践中,新 primary 也有可能与后两个副本完成同步后就提供数据服务,随后自身版本号也更新到 v2,如果系统不能保证之后的 v2 与之前的 v2 完全一样,则新

primary 在与第 1、2 个副本同步数据时不但要比较数据版本号还需要比较更新操作的具体内容是否一样。

wps_clip_image-1849

第二、若中心节点与其他 3 个副本通信成功,读取到的版本号为(v2 v1 v1),则选取版本号为v2 的副本作为新的 primary,之后,一旦新 primary 与其他 2 个副本完成数据同步,则符合 v2  的副本个数达到 W 个,成为最新的成功提交的副本,新 primary 可以提供正常的读写服务。

Zookeeper 中的 Quorum

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

下节介绍日志技术

posted @ 2013-11-10 23:29  TheBug  阅读(1560)  评论(2编辑  收藏  举报