1.  全写读1(write all, read one)
全写读1是最直观的副本控制规则。写时,只有全部副本写成功,才算是写成功。这样,读取时只需要从其中一个副本上读数据,就能保证正确性。
这种规则需要解决一个问题:如果是一个kv系统,对某个key的第i次写如果只有部分成功,那么系统中既存在次i次写的结果,又存在着第i-1次写的结果。而根据规则,生效的仅仅是第i-1个版本。因此,需要全局性地记录某个key对应的数据目前的版本号i-1。这个元数据可能为是系统的瓶颈。
可用性:对于写操作,虽然有N个副本,但其实是不能容忍任意一个副本的异常,可用性不高。而读服务则是高可用的。
 
2. quorum机制则是上述内容的一个升级版,也很好理解。
对于可用性来说,可以适当作如下折衷。对于N副本的系统,如果写操作只成功了W个副本,那么如果读N-W+1个副本,那么读结果的集合中,一定包含着最新版本的数据。
 
用于读写:
这里隐含的关键问题是,如何判断读到的R个副本中,哪个是成功提交的数据?比如提交3次,只有第2次成功。那么,依quorum读时,一定会读到成功提交的第2版本的副本,同时可能会读到1,3版本的未最终成功提交的数据。
 
第一种思路,直接用某个元数据服务将成功提交的版本号记录下来,如果有版本号,则可以直接确定哪个版本的数据是应该读的。这方法不是很好。但实际上quorum本身并没有什么手段解决这个问题。读操作一定会读到已经提交成功的数据。这是强一致性。quorum为解决强一制性,还需要引入额外的限制:
限制quorum机制的提交,只有在前一版本成功的基础上,才能进行下一版本的提交。言下之义就是,提交不成功的版本,只可能是最后一个版本。
 
这样就好处理了。如果读R个副本中,最高版本号的副本数不足W个,则继续读第R+1个副本,判断最高版本的副本个数有没有达到W个。如果直到读完全部N个都没有达到,那说明这个最高版本不是成功提交的纪录,只能取次高版本的版本号作为最终成功提交记录(由限制条件保证)。
可以看出, 这方法虽然能解决问题,但读可能过多。而且,如果有副本异常时,可能出现没法判断当前最终提交成功的到底是哪个版本的问题。
一般来说,应该回避这种思路,而将quorum与主从机制结合在一起,读主。
 
用于选主:
在主从控制中,如果主节点失效,需要从其余的从节点中选一个主。quorum机制的选主分三步:第一,读R个节点,取其中的最高版本号的数据,这个数据一定时序上大于等于最新成功提交的数据(要么是最新提交成功,要么是最新提交尚未成功);第二,将数据同步至W份,使系统满足写W份的要求,确保数据成为最新提交数据;第三,作为新主节点。
 
 
 
应用:
GFS:GFS中,使用的是quorum的退化方式,即写全读一。为了解决写时副本损坏引起不可用,GFS在append副本失败时,会在没有异常的机器上新创建chunk, 在此chunk上append,提高可用性。
dynamo:去中心化的结构上,quorum的写每次可能由不同的副本引发,这会引起数据的不一致与冲突。dynamo没有处理这种情况,而是引用了一个clock vector,记录每次操作由谁发起,什么版本号。将clock vector一起返回给用户,由用户去处理。
如: N=3, W=R=2。初始为(1,1,1)。
1. 以A引发操作+1,A同步给C:
数据(2,1,2),clock vector记录[1,A][][1,A];
2. 以B引发操作+2,同步给C:
数据(2,3,3),clock vector记录[1,A][1,B][1,B];
3. 以A引发操作+3,同步给C:
数据(5,3,5),clock vector为[(1,A)(2,A)][1,B][(1,A)(2,A)];
此时,可见B上的记录与A、C有冲突,需要用户依据不同策略解决这冲突。可以合并,得到结果7。
 
Big Pipe:与GFS一样是WARO,解决写失败的副本不一致的方法是,所有副本将最后一条记录更新到zookeeper,作为标准。同样与GFS一样,更新失败后会新创建chunk用于后续写,提高可用性。

分布式入门之2:Quorum机制的更多相关文章

  1. 分布式系统理论之Quorum机制

    一,Quorum机制介绍 在分布式系统中有个CAP理论,对于P(分区容忍性)而言,是实际存在 从而无法避免的.因为,分布系统中的处理不是在本机,而是网络中的许多机器相互通信,故网络分区.网络通信故障问 ...

  2. Quorum机制与NRW算法总结

    Quorum机制与NRW算法总结 1.Quorum机制 Quorum,原指为了处理事务.拥有做出决定的权力而必须出席的众议员或参议员的数量(一般指半数以上). 2.NRW算法 NRW算法是基于Quor ...

  3. 分布式系统读写模型中的Quorum机制

    分布式系统的设计中会涉及到许多的协议.机制用来解决可靠性问题.数据一致性问题等,Quorum 机制就是其中的一种.我们通过分布式系统中的读写模型来简单介绍它. 分布式系统中的读写模型 分布式系统是由多 ...

  4. P2P结构与Quorum机制------《Designing Data-Intensive Applications》读书笔记8

    前文涉及到了很多与Leader相关的算法,大家有木有想过,王侯将相,宁有种乎,既然Leader这么麻烦,干脆还是采用P2P模型吧,来个大家平等的架构.本篇需要和大家探讨的就是多副本下实现民主政治的Qu ...

  5. 写一致性原理以及quorum机制

    (1)consistency,one(primary shard),all(all shard),quorum(default)我们在发送任何一个增删改操作的时候,比如 PUT /index/type ...

  6. Spring入门5.事务管理机制

    Spring入门5.事务管理机制 20131126 代码下载 : 链接: http://pan.baidu.com/s/1kYc6c 密码: 233t 回顾之前的知识,Spring 最为核心的两个部分 ...

  7. erlang分布式入门(一)-ping pong

    erlang分布式入门(一)-ping pong 测试环境和http://willvvv.iteye.com/blog/1523918 一样,192.168.0.182(centos-182)和192 ...

  8. ETCD分布式锁实现选主机制(Golang实现)

    ETCD分布式锁实现选主机制(Golang) 为什么要写这篇文章 做架构的时候,涉及到系统的一个功能,有一个服务必须在指定的节点执行,并且需要有个节点来做任务分发,想了半天,那就搞个主节点做这事呗,所 ...

  9. [源码解析] 并行分布式框架 Celery 之 容错机制

    [源码解析] 并行分布式框架 Celery 之 容错机制 目录 [源码解析] 并行分布式框架 Celery 之 容错机制 0x00 摘要 0x01 概述 1.1 错误种类 1.2 失败维度 1.3 应 ...

随机推荐

  1. HDU1541 树状数组

    Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  2. 动态调用WebService(C#) (非常实用)

    通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...

  3. 对拍老是忘记的看这里:bat代码

    需要写三个程序,makedata.exe 产生测试数据, program1.exe 是你要检测的程序,program2.exe 往往是一个正确但效率不高(暴力的居多)的程序. 代码很简单,稍作解释:l ...

  4. 【6集iCore3_ADP触摸屏驱动讲解视频】6-1 工程及程序构架介绍

    视频简介: 该视频由银杏科技有限公司基于iCore3应用开发平台推出,包含 触摸屏驱动工程文件的介绍与程序构架的介绍等.   源视频包下载地址: http://pan.baidu.com/s/1dFz ...

  5. Spring mvc example

    Spring mvc example 1.下载spring源包 spring地址:http://www.springsource.org/download 我下的是spring-framework-3 ...

  6. 多线程编程-工具篇-BlockingQueue

    在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全"传输"数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序 ...

  7. smarty中使用truncate出现乱码,用mb_substr解决

  8. 2.Linux如何学习

    Linux的应用: 企业应用 个人应用 平行运算:所谓的平行运算指的是将原本的工作分成多份然后交给多台主机去运算,最终再将结果收集起来的一种方式.由于通过高速网络使用到多台主机(集群),将原本需要很长 ...

  9. dsview

    http://blog.csdn.net/gzshun/article/details/7495488 http://blog.csdn.net/hjl_1991/article/details/50 ...

  10. Datatable常用系列一

    Datatable常用系列一 一.用作集合存储数据: DataTable dt = new DataTable("action"); for (int i = 0; i < ...