Quorum算法

分布式系统中,一般保存多个数据副本,明显可以提高系统可靠性。并且存储这些数据副本的节点,不仅做容灾用,也可以提供服务,作负载均衡。

这里就涉及到一个数据一致性的问题,也就是各副本间要进行同步,来保持最新的数据。在一些一致性需求不辣么强的场景,比如用户获取某个文章的点赞数,读到未及时同步的脏数据也就无所谓了。

但在一些需要强一致性的场景里,这就比较可怕了。比如你银行卡里笼共就100块钱,第一次取了60元,第二次取的时候,请求路由到了未同步的那个副本数据上,你又可以取60元。银行就赔死了。

在这种需要强一致性的系统中,有一个简单的解决策略叫Read Only Write All。比如我分布式系统中有4个数据的副本,辣么当用户修改这个数据时,只有当系统中4个副本都同步为最新数据,才返回修改成功。这样读的时候,就一定是个好的数据了。

但在这种写操作频繁的系统,Write All对系统带来的负担就比较大了。

简单说就是,读很轻松,但写压力山大。那如何优化呢?Quorum算法就是一种方案。

算法的原理在wiki有介绍:

https://zh.wikipedia.org/wiki/Quorum_(%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F)#cite_note-1

wiki上写了它是基于鸽巢原理的。举个栗子:现在,我们有2绿2红4个球,分别放在不同的盒子里(鸽巢),那么,我们只要任意取3个球,就至少有一个绿球。道理很简单。

在我们的分布式系统中,可以把绿球看作新数据,红球看作未更新的脏数据。辣么!我们只要写了2份数据,也就是放了2个绿球,就可以返回写成功了。而这时候,想取出一个绿球(有效数据)就要费力一些了,至少要取3个球。

现在我们把4写一读,转换成了2写3读。这其实是对读写的一种负载均衡,用于减小写数据操作的压力。

当然,写2次读3次我们是肿么设计出来的呢。又要看wiki上Quorum算法原理了。简单来说,就是满足下面2个公式:

分布式系统中的每一份数据拷贝对象都被赋予一票。每一个操作必须要获得最小的读票数(Vr)或者最小的写票数(Vw)才能读或者写。如果一个系统有V票(意味着一个数据对象有V份冗余拷贝),那么这最小读写票必须满足:

1、Vr + Vw > V

2、Vw > V/2

第一条规则保证了一个数据不会被同时读写。当一个写操作请求过来的时候,它必须要获得Vw个冗余拷贝的许可。而剩下的数量是V-Vw 不够Vr,因此不能再有读请求过来了。同理,当读请求已经获得了Vr个冗余拷贝的许可时,写请求就无法获得许可了。

第二条规则保证了数据的串行化修改。一份数据的冗余拷贝不可能同时被两个写请求修改。

我们惊奇的发现,上面设计的2写3读,并不符合以上第二条规则。也就是只保证一个数据不被同时读写,但仍不能保证这个数据不被两个请求同时写。。。

3写2读就可以解决了。

原文地址:https://www.cnblogs.com/gm-201705/p/9863910.html

时间: 2024-08-26 19:45:42

Quorum算法的相关文章

关于NRW算法(Quorum算法)

在分布式系统中,冗余数据是保证可靠性的手段,因此冗余数据的一致性维护就非常重要.一般而言,一个写操作必须要对所有的冗余数据都更新完成了,才能称为成功结束.比如一份数据在5台设备上有冗余,因为不知道读数据会落在哪一台设备上,那么一次写操作,必须5台设备都更新完成,写操作才能返回. 对于写操作比较频繁的系统,这个操作的瓶颈非常大.Quorum算法可以让写操作只要写完3台就返回.剩下的由系统内部缓慢同步完成.而读操作,则需要也至少读3台,才能保证至少可以读到一个最新的数据. Quorum的读写最小票数

Zookeeper(一)从抽屉算法到Quorum (NRW)算法

一.抽屉算法 抽屉算法,又名鸽巢原理,它是德国数学家狄利克雷首先明确的提出来并用以证明一些数论中的问题,因此,也称为狄利克雷原则.它是组合数学中一个重要的原理. 具体算法讲的是: 第一抽屉算法: 如果n+1个物体被放进n个盒子,那么至少有一个盒子包含两个或更多的物体. 证明(反证法):如果每个抽屉至多只能放进一个物体,那么物体的总数至多是n,而不是题设的n+k(k≥1),故不可能. 第二抽屉算法:把多于mn(m乘以n)个的物体放到n个抽屉里,则至少有一个抽屉里有不少于m+1的物体. 证明(反证法

微信架构演变

从无到有 2011.1.21 微信正式发布.这一天距离微信项目启动日约为2个月.就在这2个月里,微信从无到有,大家可能会好奇这期间微信后台做的最重要的事情是什么? 我想应该是以下三件事: 1. 确定了微信的消息模型 微信起初定位是一个通讯工具,作为通讯工具最核心的功能是收发消息.微信团队源于广硏团队,消息模型跟邮箱的邮件模型也很有渊源,都是存储转发. 图 1 微信消息模型 图1展示了这一消息模型,消息被发出后,会先在后台临时存储:为使接收者能更快接收到消息,会推送消息通知给接收者:最后客户端主动

MogileFS学习小结

大纲: 一.关于MogileFS 二.常见分布式文件系统 三.MogileFS基本原理 四.MogileFS的实现 一.关于MogileFS 当下我们处在一个互联网飞速发展的信息社会,在海量并发连接的驱动下每天所产生的数据量必然以几何方式增长,随着信息连接方式日益多样化,数据存储的结构也随着发生了变化.在这样的压力下使得人们不得不重新审视大量数据的存储所带来的挑战,例如:数据采集.数据存储.数据搜索.数据共享.数据传输.数据分析.数据可视化等一系列问题. 传统存储在面对海量数据存储表现出的力不从

微信与朋友圈后台架构

微信朋友圈技术之道:三个人的后台团队与每日十亿的发布量 视屏讲解 概述 截止到2015年7月,微信每月活跃用户约5.49亿,朋友圈每天的发表量(包括赞和评论)超过10亿,浏览量超过100亿.得益于4G网络的发展,以上数据仍有很快的增长,而且相对于PC互联网时代,移动互联网时代的峰值要来得更加凶猛.比如,2015年元月的流量到了平时的2倍,而峰值则达到了平时峰值的2倍,相当于平时正常流量的5倍,这对整个系统的考验是很残酷的.本次分享将简单介绍微信后台团队的开发模式.微信朋友圈的架构以及在性能上的一

handoff

本篇文章所说的handoff是指分布式系统中的一种提高写高可用的方法,最早在Dynamo的论文中提出,原名叫hinted handoff.cassandra作为Dynamo对应的开源实现,也实现了这个功能(另一个NoSql: Voldemort也有这个功能,个人觉得只要使用Quorum算法来实现数据冗余的都可以使用hinted handoff来提高写的高可用). Quorum 首先介绍下Quorum(NRW)机制.Quorum机制是分布式系统中常用的用来保证数据冗余和最终一致性的投票算法.N代表

hbase官方文档(转)

Apache HBase™ 参考指南  HBase 官方文档中文版 Copyright © 2012 Apache Software Foundation.保留所有权利. Apache Hadoop, Hadoop, MapReduce, HDFS, Zookeeper, HBase 及 HBase项目 logo 是Apache Software Foundation的商标. Revision History Revision 0.95-SNAPSHOT 2012-12-03T13:38 中文版

从无到有:微信后台系统的演进之路

从无到有 2011.1.21 微信正式发布.这一天距离微信项目启动日约为2个月.就在这2个月里,微信从无到有,大家可能会好奇这期间微信后台做的最重要的事情是什么? 我想应该是以下三件事: 1. 确定了微信的消息模型 微信起初定位是一个通讯工具,作为通讯工具最核心的功能是收发消息.微信团队源于广研团队,消息模型跟邮箱的邮件模型也很有渊源,都是存储转发. 消息被发出后,会先在后台临时存储:为使接收者能更快接收到消息,会推送消息通知给接收者:最后客户端主动到服务器收取消息. 2. 制定了数据同步协议

海量图片存储--MogileFS分布式存储集群的实现

分布式存储 当下互联网飞速发展,海量并发所产生的数据量以几何方式增长,随着信息链接方式日益多样化,数据存储的结构也发生了变化,在这样的压力下我们不得不重新审视大量数据的存储所带来的挑战,比如:数据采集.数据存储.数据搜索.数据共享.数据传输.数据分析.数据可视化等一些列问题 传统存储在面对海量数据存储时已经力不从心,比如纵向扩展受阵列空间限制.横向扩展受交换设备限制.节点受文件系统限制 分布式存储的出现在在一定程度上缓解了这一问题 分布式存储基础介绍 (一)多线程与进程的执行模式 #互不通信的多