Quorom 机制,是一种分布式系统中常用的,用来保证数据冗余和最终一致性的投票算法,其主要数学思想来源于鸽巢原理。
什么是鸽巢原理?
其中一种简单的表述法为:
若有n个笼子和n+1只鸽子,所有的鸽子都被关在鸽笼里,那么至少有一个笼子有至少2只鸽子。
另一种为:
若有n个笼子和kn+1只鸽子,所有的鸽子都被关在鸽笼里,那么至少有一个笼子有至少k+1只鸽子。
恩,很熟悉吧。
分布式系统通常支持多副本,副本存放在不同节点上,读写时需要对多个副本进行操作。考虑到一致性问题,可以在写操作更新所有副本,而读取时只要读其中一个副本。但是,这样写负载太重了,读很轻松,读写负载明显不平衡。
采用Quorum机制后,写操作需要即刻完成的副本数减少,读操作需要成功读取的副本数增加,一定程度上平衡了读写两种操作,系统整体性能会得到提升。比如,有5个副本,可以让写操作只要写完3个就返回。剩下的由系统内部缓慢同步完成。而读操作,则需要至少读3台,就可保证至少可以读到一个最新的数据。(鸽巢原理)
这个协议有三个关键值N、R和W:
N表示数据所具有的副本数。
R表示完成读操作所需要读取的最小副本数。
W表示完成写操作所需要写入的最小副本数。
该策略中,只需要保证R + W > N,就会提供强一致性的保证,因为读取数据的节点和被同步写入的节点是有重叠的(鸽巢原理)。
例如:N=3,W=2,R=2,那么表示系统中数据有3个不同的副本,当进行写操作时,需要等待至少有2个副本完成了该写操作系统才会返回执行成功的状态,对于读操作,系统有同样的特性。由于R + W > N,因此该系统是可以保证强一致性的。
NWR模型中的读(写)延迟由最慢的R(W)副本决定,有时为了获得较高的性能和较小的延迟,R和W的和可能小于N,这时系统不能保证读操作能获取最新的数据。
如果R + W ≤ N,这时读取和写入操作是不重叠的,系统只能保证最终一致性,而副本达到一致的时间则依赖于系统异步更新的实现方式,不一致性的时间段也就等于从更新开始到所有的节点都异步完成更新之间的时间。
下面为不同设置的几种特殊情况。
当W = 1,R = N时,系统对写操作有较高的要求,但读操作会比较慢,若N个节点中有节点发生故障,那么读操作将不能完成。
当R = 1,W = N时,系统要求读操作高性能、高可用,但写操作性能较低,用于需要大量读操作的系统,若N个节点中有节点发生故障,那么写操作将无法完成。
当R = W = N / 2 + 1时,系统在读写性能之间取得了平衡,兼顾了性能和可用性,Dynamo系统的默认设置就是这种,即N=3,W=2,R=2。
对于NWR模型来说,存在着版本冲突的问题,为此,Amazon的Dynamo引入了Vector Clock,这个,下次再讨论。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/kzq_qmi/article/details/47362689