zdq0394.github.com

Tech study and research.

Follow me on GitHub

quorum机制

分布式系统的设计中会涉及到许多的协议、机制用来解决可靠性、数据一致性问题等。 Quorum机制就是其中的一种。 Quorum机制来解决读写模型中读写的负载均衡

分布式系统中的读写模型

分布式系统是由多个节点(一个节点指一台服务器、存储设备等)构成。 由于网络异常、宕机等使得节点并不能保证正常工作,特别是在节点数量很大的时候,出现异常状况的节点几乎是肯定的。 为了保证系统的正常运行,能够提供可靠的服务,分布式系统中对于数据的存储采用多副本来保证可靠性,也就是其中一个节点上读取数据失败了那么可以转向另外一个存有相同数据副本的节点读取返回给用户。 这个过程对于用户来说是透明的。

那么随之而来的就是副本数据的不一致性,例如:用户提交一次修改后,那么原先保存的副本显然就与当前数据不一致了。 解决这个问题最简单的方法Read Only Write All,就是在用户提交修改操作后,系统确保存储的数据所有的副本全部完成更新后,再告诉用户操作成功;而读取数据的时候只需要查询其中的一个副本数据返回给用户就行了。在很少对存储的数据进行修改的情形下(例如存档历史数据供以后分析),这种解决方案很好。如遇到经常需要修改的情形,写操作时延时现象就很明显,加上并发或者连续的执行效率就可想而知了。

这是由于Write和Read负载不均衡所致,Read很轻松,Write压力很大。

这种导致写服务的可用性很差,任何一个节点宕机都会导致写服务不可用。 当然,读服务的可用性很高。只要一个节点活着,就可以提供读服务。

Quorum机制

Quorum是一种集合l,l中任意取集合S和R,S和R都存在交集。

怎么运用Quorum机制来解决读写模型中读写的负载均衡?

读取模型

关键的是读取多少个数据副本后,使得读取时总能读到有效数据? 假设总共有N个数据副本,其中k个已经更新,N-k个未更新的,那么我们任意读取N-k+1个数据的时候就必定至少有1个是属于更新了的k个里面的,也就是Quorum的交集,我们只需比较读取的N-k+1中版本最高的那个数据返回给用户就可以得到最新更新的数据。

写模型

那么对于写模型呢?也只需要完成k个副本的更新后,就可以告诉用户操作完成而不需要Write All了,当然告诉完用户完成操作后,系统内部还是会慢慢的把剩余的副本更新,这对于用户是透明的。

可以看到,我们把Write身上的部分负载转移到了Read上,Read读取多个副本,使得Write不会过于劳累,不好的是弱化了分布式系统中的数据一致性

至于转移多少负载比较合适,这个需要根据分布式系统的具体需求中对数据一致性的要求。

不过,CAP 理论告诉我们没有完美的方案。 一般情况下,r, w, N满足如下关系:

  • r + w > N
  • w > N/2