分布式协议与算法实战
韩健
腾讯资深工程师
23193 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
分布式协议与算法实战
15
15
1.0x
00:00/00:00
登录|注册

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

课堂思考
内容小结
实现Quorum NWR
Quorum NWR的三要素
介绍
Quorum NWR算法

该思维导图由 AI 生成,仅供参考

你好,我是韩健。
不知道你在工作中有没有遇到这样的事儿:你开发实现了一套 AP 型的分布式系统(我在04 讲提到了 AP 型系统的特点,你可以回顾一下),实现了最终一致性。业务也接入了,运行正常,一起看起来都那么美好。
可是,突然有同事说,我们要拉这几个业务的数据做实时分析,希望数据写入成功后,就能立即读取到新数据,也就是要实现强一致性(Werner Vogels 提出的客户端侧一致性模型,不是指线性一致性),数据更改后,要保证用户能立即查询到。这时你该怎么办呢?首先你要明确最终一致性和强一致性有什么区别。
强一致性能保证写操作完成后,任何后续访问都能读到更新后的值;
最终一致性只能保证如果对某个对象没有新的写操作了,最终所有后续访问都能读到相同的最近更新的值。也就是说,写操作完成后,后续访问可能会读到旧数据。
其实,在我看来,为了一个临时的需求,我们重新开发一套系统,或者迁移数据到新系统,肯定是不合适的。因为工作量比较大,而且耗时也长,而我建议你通过 Quorum NWR 解决这个问题。
也就是说,在原有系统上开发实现一个新功能,就可以满足业务同学的需求了。因为通过 Quorum NWR,你可以自定义一致性级别,通过临时调整写入或者查询的方式,当 W + R > N 时,就可以实现强一致性了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Quorum NWR算法是一种灵活自定义一致性级别的技术,适用于AP型分布式系统。通过设置副本数(N)、写一致性级别(W)、读一致性级别(R),可以实现强一致性或最终一致性。在实际应用中,Quorum NWR可以通过灵活调整这三个要素,满足不同业务需求的一致性级别。文章以InfluxDB企业版为例,详细介绍了Quorum NWR的原理和实现方式。在InfluxDB中,通过设置副本数和写一致性级别,可以实现强一致性。此外,文章还强调了副本数不宜超过节点数,以及不同N、W、R值组合对一致性效果的影响。总的来说,Quorum NWR算法是一种实用的技术,能够弥补AP型系统缺乏强一致性的痛点,为业务提供了按需选择一致性级别的灵活度。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《分布式协议与算法实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(39)

  • 最新
  • 精选
  • 沈伟敏
    AP系统之上通过Quorum NWR实现了强一致性,这个是不是违背了“CAP不可能三角”。这个要怎么理解呢?

    作者回复: 加一颗星:),不违背,这么理解,尽管通过N、W、R组合,可以实现不同的一致性级别,但对于同一份数据而言,CP和AP是不可兼得。

    2020-04-03
    7
    20
  • 姜川
    如果我们用raft协议的最终一致性来做整个系统的核心协议,这时出现了要强一致的需求,我们就可以不改变raft协议的前提下,引入NWR,raft协议已经保证了W是超过半数以上的,那我们就让R也超过半数以上,就能保证基于raft协议还能做出强一致性的需求了,或者改动raft协议,让其可以拥有配置写ALL的能力也可以

    作者回复: 加一颗星:),理论上是可以的,但在实际中,没必要,因为我们在领导者节点上执行读操作,就能实现强一致性了。

    2020-03-26
    2
    15
  • 竹马彦四郎的好朋友影法師
    "当 W + R > N 的时候,对于客户端来讲,整个系统能保证强一致性,一定能返回更新后的那份数据。" 顿时明白了韩老师在本文开头说的 "Werner Vogels 提出的客户端侧一致性模型,不是指线性一致性" 确实,图1中的AP系统其实并没有实现线性一致性,但是该AP系统实现了客户端侧一致性模型。

    作者回复: 加一颗星:),最最大部分场景,都不需要“eactly once”的线性一致性,只要能保证写操作完成后,就能一直和持续读取到新数据,就可以了。

    2020-05-05
    9
  • Michael Tesla
    老师,写入 W 个节点失败,有可能有脏数据残留,是不是需要使用分布式事务呢?

    作者回复: 加一颗星:),不需要的,实现操作的冥等性和状态机,就可以了,比如,“SET X = 1”,因为重试,最终提交了2次,那么,经过状态机的运算后,最终的X值还是1。

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

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

    2020-03-14
    5
    8
  • kylexy_0817
    联想起另一门视频课程,MongoDB,好像也是采取Quorum NWR算法实现数据强一致性^_^

    作者回复: 加一颗星:),writeConcern/readConcern原理与这个类似。

    2020-04-26
    6
  • 每天晒白牙
    关于思考题,老师在文中提到的资料有一些参考点: 在需要提供高性能和高可用性的分布式存储系统中,副本的数量即 n 通常超过 2 个。 只关注容错的系统通常使用 n=3 (W=2和R=2配置)。 需要提供非常高读取负载的系统通常会复制超出容错要求的数据

    作者回复: 加一颗星:)

    2020-03-09
    5
  • fy
    问个问题,假设322配置,第一次写入只成功了一个节点,返回客户端错误,这时候有个读取操作,刚好获取到了上一次写入成功的那一个副本,然后返回了这份数据,那不是和之前的操作结果矛盾了么

    作者回复: 加一颗星:),是存在这个现象,此时能保证“写成功后,一定能读取到更新后的值”,但不能保证“写失败,只能读取到之前的值”,如果需要实现这一点,咱们需要实现事务,也就是说,当咱们在实现系统时,需要根据场景特点选择适合的技术。

    2020-09-03
    3
    4
  • 小晏子
    我理解课后思考的问题是”为什么只需要备份数据到部分节点,不需要备份到所有节点“,因为是AP系统,所以为了提升效率,备份数据到N个副本就可以认为是数据写入成功了,整个系统因为是最终一致性,系统内部会异步同步节点之间的数据,所以最终所有节点上的数据肯定会一致的,另外工程实践里N>=3, 是因为冗余数据是保证可靠性的手段,如果N=2,那么损失一个节点就退化为单节点了。

    作者回复: 加一颗星:),一般2副本或3副本,就可以了。

    2020-03-09
    4
  • 约书亚
    每次写入数据都要产生对应版本号是吧

    作者回复: 加一颗星:),取决于场景,比如,KV数据就需要,而时序数据不需要,因为一条时序数据记录是没有“新旧”之说的。

    2020-03-09
    4
收起评论
显示
设置
留言
39
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部