分布式协议与算法实战
韩健
腾讯资深工程师
立即订阅
4631 人已学习
课程目录
已更新 19 讲 / 共 22 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 想成为分布式高手?那就先把协议和算法烂熟于心吧
免费
理论篇 (4讲)
01 | 拜占庭将军问题:有叛徒的情况下,如何才能达成共识?
02 | CAP理论:分布式系统的PH试纸,用它来测酸碱度
03 | ACID理论:CAP的酸,追求一致性
04 | BASE理论:CAP的碱,追求可用性
协议和算法篇 (11讲)
05 | Paxos算法(一):如何在多个节点间确定某变量的值?
06 | Paxos算法(二):Multi-Paxos不是一个算法,而是统称
07 | Raft算法(一):如何选举领导者?
08 | Raft算法(二):如何复制日志?
09 | Raft算法(三):如何解决成员变更的问题?
10 | 一致哈希算法:如何分群,突破集群的“领导者”限制?
11 | Gossip协议:流言蜚语,原来也可以实现一致性
12 | Quorum NWR算法:想要灵活地自定义一致性,没问题!
13 | PBFT算法:有人作恶,如何达成共识?
14 | PoW算法:有办法黑比特币吗?
15 | ZAB协议:如何实现操作的顺序性?
实战篇 (3讲)
16 | InfluxDB企业版一致性实现剖析:他山之石,可以攻玉
17 | Hashicorp Raft(一):如何跨过理论和代码之间的鸿沟?
18 | Hashicorp Raft(二):如何以“集群节点”为中心使用API?
分布式协议与算法实战
登录|注册

12 | Quorum NWR算法:想要灵活地自定义一致性,没问题!

韩健 2020-03-09
你好,我是韩健。
不知道你在工作中有没有遇到这样的事儿:你开发实现了一套 AP 型的分布式系统(我在04 讲提到了 AP 型系统的特点,你可以回顾一下),实现了最终一致性。业务也接入了,运行正常,一起看起来都那么美好。
可是,突然有同事说,我们要拉这几个业务的数据做实时分析,希望数据写入成功后,就能立即读取到新数据,也就是要实现强一致性(Werner Vogels 提出的客户端侧一致性模型,不是指线性一致性),数据更改后,要保证用户能立即查询到。这时你该怎么办呢?首先你要明确最终一致性和强一致性有什么区别。
强一致性能保证写操作完成后,任何后续访问都能读到更新后的值;
最终一致性只能保证如果对某个对象没有新的写操作了,最终所有后续访问都能读到相同的最近更新的值。也就是说,写操作完成后,后续访问可能会读到旧数据。
其实,在我看来,为了一个临时的需求,我们重新开发一套系统,或者迁移数据到新系统,肯定是不合适的。因为工作量比较大,而且耗时也长,而我建议你通过 Quorum NWR 解决这个问题。
也就是说,在原有系统上开发实现一个新功能,就可以满足业务同学的需求了。因为通过 Quorum NWR,你可以自定义一致性级别,通过临时调整写入或者查询的方式,当 W + R > N 时,就可以实现强一致性了。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《分布式协议与算法实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(12)

  • 右耳听海
    老师能讲下为什么w+r>n时是强一致性的吗

    作者回复: 本质上是因为这是不管怎么读,都能读取到已更新的那个副本,比如你这么想,三节点集群(n为3),写一致性级别(w)为3,读一致性级别(r)为1,也就是说,只要写成功了,所有的副本都是成功更新过的,这时不管读取哪个节点,都能读取到最新的数据。

    2020-03-14
    1
  • 小晏子
    我理解课后思考的问题是”为什么只需要备份数据到部分节点,不需要备份到所有节点“,因为是AP系统,所以为了提升效率,备份数据到N个副本就可以认为是数据写入成功了,整个系统因为是最终一致性,系统内部会异步同步节点之间的数据,所以最终所有节点上的数据肯定会一致的,另外工程实践里N>=3, 是因为冗余数据是保证可靠性的手段,如果N=2,那么损失一个节点就退化为单节点了。
    2020-03-09
    1
  • 月迷津渡
    这篇核心写的很清晰,我有个小问题,关于W和R的平衡当中提到要写优化就要R=N,W=1 这样就满足W+R>N,对于这个W=1是会变吗就是不同数据可以写到不同节点 但是还是满足W=1,因为我在考虑当这个持有数据的唯一节点挂了,那节点所持有数据就不可修复了吧。所以后面提到读大多数和写大多数节点是一种满足容错的配置。
    另外我想到如果集群中某个节点挂了的话N会动态变化吗?因为节点挂了就意味着数据不可用在机器网络或硬件坏掉的情况下数据也无法恢复到其他新启动节点?我记得mongo里就是配置readConcern和WriteConcern就是用的majortiy 这种感觉就是应对节点变化的一种策略(动态大多数而并非指定指定一个固定的值)吧。
    2020-03-23
  • 唔多志
    按需求配置,再好不过了
    2020-03-19
  • 进行R操作时,R>2,读出的数据怎么知道哪个数据是最新的呢?时序数据库里面本来带了时间戳,可以靠这个判断,但还是需要保障整个系统时序一致,其他非时序系统怎么办?
    2020-03-18
  • 一步
    influxdb 不是国产的开源时序数据库吗? 为什么没有找中文文档呢?

    作者回复: 美国的,可考虑科学上网,培养阅读英文文档的习惯:),坚持下来,会收获很大。

    2020-03-15
  • iron_man
    any:任何一个节点写入成功后,或者接收节点已将数据写入 Hinted-handoff 缓存(也就是写其他节点失败后,本地节点上缓存写失败数据的队列)后,就会返回成功给客户端。
    这里“本地节点上缓存写失败数据的队列“是什么意思,不太明白,是指缓存备份吗?本地缓存写失败了再写到这个缓存里面?
    2020-03-10
    1
  • longyi
    老师,你在文中提到”读取指定数据时,要读 R 副本,然后返回 R 个副本中最新的那份数据”
    ,问题是我们怎么去判断那个副本是最新的呢?
    2020-03-09
    2
  • qinsi
    W+R=N时应该也是最终一致吧

    作者回复: 是的

    2020-03-09
    1
  • 约书亚
    每次写入数据都要产生对应版本号是吧
    2020-03-09
  • 每天晒白牙
    关于思考题,老师在文中提到的资料有一些参考点:
    在需要提供高性能和高可用性的分布式存储系统中,副本的数量即 n 通常超过 2 个。
    只关注容错的系统通常使用 n=3 (W=2和R=2配置)。
    需要提供非常高读取负载的系统通常会复制超出容错要求的数据
    2020-03-09
  • 艾瑞克小霸王
    这里的一个节点的意思是不是一个raft集群? 采用多个raft集群做数据分片和多副本?
    2020-03-09
收起评论
12
返回
顶部