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. 【python+mysql】在python中调用mysql出问题 ImportError: No module named MySQLdb.constants

    遇到如下异常: File "C:\Users\Neil\PycharmProjects\ScrapyDouban\book\book\database.py", line 4, i ...

  2. 【iCore3应用开发平台】发布 iCore3 应用开发平台使用说明

    PDF下载地址:http://pan.baidu.com/s/1c2ca2lU

  3. php 删除目录及子文件

    function del_dir($dir) { if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { $str = "rmdir /s/q &q ...

  4. Unity内存理解(转)

    Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBu ...

  5. 总结-php

    strtr('li.a-o_lo.n_g-jun', '-_.', '+/=')  好高级啊 在tomcat里使用php用quercus PHP in java  http://quercus.cau ...

  6. Yii2中数据过滤方案

    1. 将数据赋值给model对象再通过model保存数据到数据库时有两种方法. 1) load()再save(). 这种可以通过$model->setScenario('test_scenari ...

  7. 【转】如何把Json格式字符写进text文件中

    http://www.cnblogs.com/insus/p/4306640.html http://json2csharp.chahuo.com/ 本篇一步一步学习怎样把显示于网页的json格式的字 ...

  8. 【转】C# GET 和 SET作用

    http://www.cnblogs.com/yinxiangpei/articles/2357091.html C#中get和SET,看来看去还是看不懂,通俗一点解释一下,用了有什么好处,不用会怎么 ...

  9. js事件代理(委托)

    JavaScript事件代理(委托)一般用于以下情况: 1. 事件注册在祖先级元素上,代理其子级元素.可以减少事件注册数量,节约内存开销,提高性能. 2. 对js动态添加的子元素可自动绑定事件. 之前 ...

  10. sort a Python dictionary by value

    首先要明确一点,Python的dict本身是不能被sort的,更明确地表达应该是"将一个dict通过操作转化为value有序的列表" 有以下几种方法: 1. import oper ...