分布式系统的Quorum策略

来源:互联网 发布:中国核心期刊数据库 编辑:程序博客网 时间:2024/05/22 12:56

分布式系统要做到数据一致性是不同于单点系统的,列入写入数据,客户端需要等待直到写入成功。因此分布式系统的设计中会运用一些“聪明”的协议、机制用以解决数据一致性、可靠性等问题,Quorum 机制就是其中的一种。


1、分布式系统中的读写模型

  分布式系统是由多个节点构成,多个结点意味着服务出现故障结点的概率增大,例如:网络异常、宕机。为了保证系统的正常,分布式系统通过多结点数据备份的方式用以保证服务的可靠性,不同于传统的“一主多从”的读写模式,主负责写读,从负责备份(当然从也可以作用于非一致性数据的读取)。分布式系统的各个结点兼具读的功能,这样如何保证各个结点所读数据的一致性就是个问题。例如:用户提交一次修改后,那么原先保存的副本显然就与当前数据不一致了。解决这个问题最简单的方法是强一致性写,即:就是在用户提交修改操作后,系统确保存储的数据所有的副本全部完成更新后,再返回用户操作成功;而读取数据的时候只需要查询其中的一个副本数据返回给用户就行了。 当然这种方案可以读多写少的场景。但是对于那些写量也很大的场景,写操作时延时现象就很明显,再加上写操作的队列,锁等操作,这个方案就不适用了。那么我们怎么寻找一个更好的方案呢?

Quorum机制便就是一种选择。


 2、Quorum机制

    概括说来就是:Quorum 是一种集合 l, l是全集U的子集,l中任意取集合S,R ,S,R 都存在交集。

    通俗来讲这个理论:假设有2个筐A,B,A放全红球2个,B放全黑球2个,一次要取到所有颜色的球,只需取出3个球即可。

    现在将这个理论用于分布式系统的数据一致性,如上情况,假设红色代表最新数据的版本,黑色代表历史数据的版本,那么取到所有版本再比较,就可以获得最新数据版本,也得到最新数据。这样想对于将所有数据取出的次数4次,操作次数降低啦。

      那么对于写模型,只需要完成 k个副本的更新后,用户写操作就算完成,而不需要等待全写,此后系统内部会继续更新剩余结点,最终达到一致。可以看到,改算法是把写的部分负载转移到了读上,通过延长分布式系统中数据一致性的最终时间来降低写负载。至于转移多少负载比较合适,这个需要根据分布式系统的具体需求中对数据一致性的要求。不过,CAP 理论告诉我们没有完美的方案。

  提高到数学公式:

N表示数据所具有的副本数。

R表示完成读操作所需要读取的最小副本数,即一次读操作所需参与的最小节点数目。

W表示完成写操作所需要写入的最小副本数,即一次写操作所需要参与的最小节点数目。

由Quorum的理论可知,W和R是关联的,W值决定R值,要获取最新数据,R > N - W。

假设N=5, 如果R=1, 那么W必须是5. 所以就是写入所有的节点是全部节点,那么读取任何一个节点就可以最新的数据。 有点就是像读写锁了。

如果R=5, 那么W只要是1就可以了。 那么写的效率就非常高。 读取的效率比较低。 

如果R=N/2+1, W=N/2, 读写之间为达到某个平衡。 是不错的策略。兼顾了性能和可用性,Dynamo系统的默认设置就是这种。

由此可得,只需要保证R + W>N,就可以保证强一致性。

原创粉丝点击