大数据基础理论—一致性协议

0. 前言

一致性协议的出现主要是为了保证大规模分布式系统的数据一致性,对分布式系统设计具有很重要的作用。
一致性协议说白了就是,制定一个大家都公认的规则,在进行数据更新的时候都按照这个规则进行,既然这个规则这么重要,那么在设计规则的时候就需要考虑到方方面面的问题,下面将详细介绍。

1. 两阶段提交

  • 基本原则:要么所有备份数据都同时更改某个值,要么都不更改,保证数据强一致性。
  • 包含实体:协调者(用于进行分布式事务的管理协调作用)和参与者(参与表决和更新过程)
  • 详细过程:两阶段主要是表决阶段和提交阶段
    • 表决阶段:协调者向所有参与者发送一个表决请求。参与者收到请求之后,如果自己已经准备好则发送VOTE_COMMIT,否则发送VOTE_ABORT表示目前自己不能进行事务提交。
    • 提交阶段:协调者收集所有参与者的表决信息,如果所有参与者都可以提交事务,那么协调者向所有参与者发送一个GLOBAL_COMMIT消息,通知参与者进行本地提交;如果有任意一位或者多位参与者发送VOTE_ABORT,那么协调者发送GLOBAL_ABORT消息通知参与者取消事务提交。
  • 2PC中的阻塞状态:协调者广播完之后需要等待参与者的响应,此时其处于阻塞状态;参与者在等待协调者第一次广播时候和等待第二次广播时候也处于阻塞状态。包含阻塞状态的系统比较脆弱,因为很可能因有进程陷入崩溃而导致处于阻塞态的对象长时间等待,使得系统无法进行。
  • 解决2PC中进程崩溃导致严重后果问题方法:超时判断和参与者互询机制。超时机制可以解决协调者的WAIT状态和参与者的INIT状态,互询机制可以解决大部分情况下参与者READY状态长时间阻塞可能。但是如果在互询的过程中,互询对象都处于READY状态,那么将无法决定最终的决策。
  • 协议改进:三阶段提交,增加了预提交阶段。将提交阶段分为预提交阶段和提交阶段,这种方法可以解决2PC中的问题,但是应用很少,因为实际中长时间阻塞的情况很少发生,并且3PC效率较低。

2. 向量时钟

向量时钟是在分布式环境下生成事件之间偏序关系的算法,偏序关系代表事件发生先后顺序导致的事件间因果依赖关系语义,通过将时间戳和事件绑定可以用来判定事件之间的因果相关性。
每个进程都会维护一个向量时钟,当发生消息传递的时候向量时钟会按照一定的规则进行改变,根据向量时钟的值判断需要作出什么操作。因为向量时钟在实际中使用的并不多,所以此处不做详细介绍。

3. RWN协议

RWN协议是亚马孙公司在实现Dynamo KV存储系统时提出的,一种通过对分布式环境下多备份数据如何读写成功进行配置来保证达到数据一致性的简明分析和约束设置。

N表示存在多少个备份;
W表示一次成功的更新操作要求至少有W份数据写入成功
R表示一次成功的读数据操作要求至少有R份读取成功
如果能够满足 R+W >N 则表示满足数据一致性协议。这是因为满足上述等式,说明成功写入的备份集合和成功读取的备份集合一定会存在交集,这就可以保证数据一致性。

但是在实际使用中,仅仅使用这个协议是不够的,因为当读取到R份数据后,还需要判断哪些数据是新的哪些数据是旧的,这其中还需要时钟向量进行辅助。

4. Paxos协议

Paxos的提出者Leslie Lamport因为其对分布式系统的杰出理论贡献而获得2013年图灵奖。

  • 副本状态机模型:集群中的服务器保存这一个log副本和状态机,所有客户端发来的指令保存在log中并依次执行log中的指令体现到状态机上,因此只要保证log一致就可以保证操作一致。那么log就需要通过一致性模块进行维护,这时需要追求几个特性:安全性,状态机从不返回错误结果,多个提议中只会有一个被选中;可用性,对于2F+1台副本状态机只要保证F台可用即可;一般情况下,大多数状态机维护log一致即可快速通知客户端操作成功。
  • Paxos基本概念:倡议者:其可提出提议以供投票表决;接受者,对倡议者的提议进行投票并从众多个提议中选出唯一确定的一个;学习者,没有倡议投票权,可以从接受者那里获知是哪个提议最终被选中。非拜占庭模型:并发进程的行为可以以任意速度执行,允许运行失败,在失败后也许会重启再次运行;并发进程之间通过异步方式发送信息通信,通信时间可以任意长,信息可能丢失,允许重复发送信息,信息不允许篡改。
  • Paxos一致性协议:
    • 阶段一:倡议者选择倡议编号n,然后向大多数接受者发送prepare请求,请求中附带倡议编号n。对于接受者如果收到编号为n的请求,如果这个n比之前响应过的其他的编号都大那么会响应,并承诺不会接受比n小的请求,如果接受者响应过accept请求,那么将所有accept中最大的编号发给倡议者。如果n不比之前响应的编号大则不响应。
    • 阶段二:倡议者:如果收到了大多数接受者关于编号n的响应,那么倡议者会给这些接受者发送accept请求,请求附带两个信息:倡议编号n以及倡议值v。v根据下面方式选择:如果接受者返回了自己曾经接受的具有最高倡议编号accept请求的内容,那么从中选择一个编号最大的倡议值作为v,如果没有收到这样的响应,那么可以将任意值赋值给v。接受者:如果接受到了编号为n的accept请求,那么接受这个请求。
    • 通过上面两个阶段即可选择出唯一的倡议者。当接受者接受了accept请求后先通知一些学习者代表,然后由这些代表通知其他所有学习者其所接受的倡议。

5. Raft协议

Raft主要有两个目标:首先是可理解性,其次是实际系统的确定性;其通过将一致性协议划分为3个子问题:领导者选举、log复制和安全性3个子问题以及将P2P模式改为Master-Slave模式来实现前面目标。

  • 基本概念:服务器的三种状态:leader(领导者,负责客户端消息响应)、follower(跟从者)、candidate(候选人)。系统执行时间划分为若干个间隔不等的term,以递增的数字标示。
  • 领导者选举:采用心跳机制触发领导者选举过程。follower如果在一定时间内没有接收到心跳信息,则触发选举,开始选举前增加term编号并转入候选者状态。除非发生下面情况:
    • 它赢得了本次选举。如果其得到了大多数其他具有相同term服务器的投票那么赢得选举。每个服务器只能投票一次。
    • 其他服务器赢得选举。如果接受到的RPC中的term编号大于其自身的编号,那么其承认领导者有效,自己转为follower状态。
    • 经过一段时间仍然没有新的领导者产生。原因是选票分流,这个时候大家都将其term编号增加以进行下一轮选举。raft通过将每个服务器超时时间设定为随机来降低这种情况出现的概率。
  • log复制。选举结束后,领导者复制响应客户端的请求并写入log,然后给其他follower发送复制消息,并更新内部状态机。
  • 安全性。两个约束条件:只有其log包含所有已经提交的操作命令的那些服务器才有权被选举为新的领导者。对于新领导者来说,只有它自己已经提交过当前term的操作命令才被认为真正提交。

你可能感兴趣的:(一致性协议,paxos,raft,两阶段提交,大数据基础理论)