假如我们遇到这样一种事情:你开发实现了一套 AP 型的分布式系统,实现了最终一致性。业务也接入了,运行正常,一起看起来都那么美好。可是,突然有同事说,我们要拉这几个业务的数据做实时分析,希望数据写入成功后,就能立即读取到新数据,也就是要实现强一致性,数据更改后,要保证用户能立即查询到。这时你该怎么办呢?首先你要明确最终一致性强一致性有什么区别。

强一致性能保证写操作完成后,任何后续访问都能读到更新后的值;最终一致性只能保证如果对某个对象没有新的写操作了,最终所有后续访问都能读到相同的最近更新的值。也就是说,写操作完成后,后续访问可能会读到旧数据。

其实,为了一个临时的需求,我们重新开发一套系统,或者迁移数据到新系统,肯定是不合适的。因为工作量比较大,而且耗时也长,而我建议你通过 Quorum NWR 解决这个问题。

也就是说,在原有系统上开发实现一个新功能,就可以满足业务同学的需求了。因为通过Quorum NWR,你可以自定义一致性级别,通过临时调整写入或者查询的方式,当 W +R > N 时,就可以实现强一致性了。

其实,在 AP 型分布式系统中(比如 Dynamo、Cassandra、InfluxDB 企业版的 DATA 节点集群),Quorum NWR 是通常都会实现的一个功能,很常用。对你来说,掌握Quorum NWR,不仅是掌握一种常用的实现一致性的方法,更重要的是,后续用户可以根据业务的特点,灵活地指定一致性级别。

为了掌握 Quorum NWR,除了了解它的原理外,我们还会以 InfluxDB 企业版的实现为例,带你看一下它在实际场景中的实现,这样你可以在理解原理的基础上,掌握Quorum NWR 的实战技巧。

首先,需要了解 Quorum NWR 中的三个要素,N、W、R。因为它们是 Quorum NWR的核心内容,我们就是通过组合这三个要素,实现自定义一致性级别的。

Quorum NWR 的三要素

N 表示副本数,又叫做复制因子(Replication Factor)。也就是说,N 表示集群中同一份数据有多少个副本,就像下图的样子:

从图中你可以看到,在这个三节点的集群中,DATA-1 有 2 个副本,DATA-2 有 3 个副本,DATA-3 有 1 个副本。也就是说,副本数可以不等于节点数,不同的数据可以有不同的副本数。

需要你注意的是,在实现 Quorum NWR 的时候,你需要实现自定义副本的功能。也就是说,用户可以自定义指定数据的副本数,比如,用户可以指定 DATA-1 具有 2 个副本,DATA-2 具有 3 个副本,就像图中的样子。

当我们指定了副本后,就可以对副本数据进行读写操作了。那么这么多副本,你要如何执行读写操作呢?先来看一看写操作,也就是 W。

W,又称写一致性级别(Write Consistency Level),表示成功完成 W 个副本更新,才完成写操作:

从图中你可以看到,DATA-2 的写副本数为 2,也就说,对 DATA-2 执行写操作时,完成了 2 个副本的更新(比如节点 A、C),才完成写操作。那么有的同学会问了,DATA-2 有 3 个数据副本,完成了 2 副本的更新,就完成了写操作,那么如何实现强一致性呢?如果读到了第三个数据副本(比如节点 B),不就可能无法读到更新后的值了吗?别急,我讲完如何执行读操作后,你就明白了。

R,又称读一致性级别(Read Consistency Level),表示读取一个数据对象时需要读 R个副本。你可以这么理解,读取指定数据时,要读 R 副本,然后返回 R 个副本中最新的那份数据:

从图中你可以看到,DATA-2 的读副本数为 2。也就是说,客户端读取 DATA-2 的数据时,需要读取 2 个副本中的数据,然后返回最新的那份数据。

这里需要注意的是,无论客户端如何执行读操作,哪怕它访问的是写操作未强制更新副本数据的节点(比如节点 B),但因为 W(2) + R(2) > N(3),也就是说,访问节点 B,执行读操作时,因为要读 2 份数据副本,所以除了节点 B 上的 DATA-2,还会读取节点 A 或节点 C 上的 DATA-2,就像上图的样子(比如节点 C 上的 DATA-2),而节点 A 和节点 C的 DATA-2 数据副本是强制更新成功的。这个时候,返回给客户端肯定是最新的那份数据。

你看,通过设置 R 为 2,即使读到前面问题中的第三份副本数据(比如节点 B),也能返回更新后的那份数据,实现强一致性了。

除此之外,关于 NWR 需要你注意的是,N、W、R 值的不同组合,会产生不同的一致性效果,具体来说,有这么两种效果:

  • 当 W + R > N 的时候,对于客户端来讲,整个系统能保证强一致性,一定能返回更新后的那份数据。
  • 当 W + R < N 的时候,对于客户端来讲,整个系统只能保证最终一致性,可能会返回旧数据。

你可以看到,Quorum NWR 的原理并不复杂,也相对比较容易理解,但在这里,我想强调一下,掌握它的关键在于如何根据不同的场景特点灵活地实现 Quorum NWR,所以接下来,我带你具体问题具体分析,以 InfluxDB 企业版为例讲解一下。

如何实现 Quorum NWR?

在 InfluxDB 企业版中,可以在创建保留策略时,设置指定数据库(Database)对应的副本数,具体的命令,就像下面的样子:

create retention policy “rp_one_day” on “telegraf” duration 1d replication 3

通过 replication 参数,指定了数据库 telegraf 对应的副本数为 3。

需要你注意的,在 InfluxDB 企业版中,副本数不能超过节点数据。你可以这么理解,多副本的意义在于冗余备份,如果副本数超过节点数,就意味着在一个节点上会存在多个副本,那么这时冗余备份的意义就不大了。比如机器故障时,节点上的多个副本是同时被影响的。InfluxDB 企业版,支持“any、one、quorum、all”4 种写一致性级别,具体的含义是这样的。

  • any:任何一个节点写入成功后,或者接收节点已将数据写入 Hinted-handoff 缓存(也就是写其他节点失败后,本地节点上缓存写失败数据的队列)后,就会返回成功给客户端。
  • one:任何一个节点写入成功后,立即返回成功给客户端,不包括成功写入到 Hinted-handoff 缓存。
  • quorum:当大多数节点写入成功后,就会返回成功给客户端。此选项仅在副本数大于 2 时才有意义,否则等效于 all。
  • all:仅在所有节点都写入成功后,返回成功。

我想强调一下,对时序数据库而言,读操作常会拉取大量数据,查询性能是挑战,是必须要考虑优化的,因此,在 InfluxDB 企业版中,不支持读一致性级别,只支持写一致性级别。另外,我们可以通过设置写一致性级别为 all,来实现强一致性。

你看,如果我们像 InfluxDB 企业版这样,实现了 Quorum NWR,那么在业务临时需要实现强一致性时,就可以通过设置写一致性级别为 all,来实现了。

小结

一般而言,不推荐副本数超过当前的节点数,因为当副本数据超过节点数时,就会出现
同一个节点存在多个副本的情况。当这个节点故障时,上面的多个副本就都受到影响
了。

  • 当 W + R > N 时,可以实现强一致性。另外,如何设置 N、W、R 值,取决于我们想化哪方面的性能。比如,N 决定了副本的冗余备份能力;
  • 如果设置 W = N,读性能比较好;如果设置 R = N,写性能比较好;
  • 如果设置 W = (N + 1) / 2、R = (N + 1) / 2,容错能力比较好,能容忍少数节点(也就是 (N - 1) / 2)的故障。

最后,我想说的是,Quorum NWR 是非常实用的一个算法,能有效弥补 AP 型系统缺乏强
一致性的痛点,给业务提供了按需选择一致性级别的灵活度,建议你的开发实现 AP 型系统
时,也实现 Quorum NWR。

Quorum NWR算法相关推荐

  1. 分布式之Quorum NWR算法

    写在前面 假设现在我们实现了AP 系统,但是公司突然要对某些业务进行实时的数据计算,并且要求按照强一致性的方式来读取数据,此时作为系统设计这的我们该怎么办呢?单独为这部分业务实时抽出最新数据?还是修改 ...

  2. 太白金星:我很关心分布式 Quorum NWR

    来源 | 悟空聊架构 责编 | 寇雪芹 头图 | 下载于视觉中国 先来看一段神秘的对话: 太白金星:听闻老君最近在练神丹妙药,可否与我一讲? 太上老君:老白啊,我最近在练六颗丹药:两颗延年丹.两颗健步 ...

  3. Quorum NWR

    NWR是一种在分布式存储系统中用于控制一致性级别的一种策略.在Amazon的Dynamo云存储系统中,就应用NWR来控制一致性. 让我们先来看看这三个字母的含义: N:同一份数据的Replica的份数 ...

  4. 《分布式协议与算法实战》——专栏笔记

    拜占庭将军问题--初探 问题描述 下面以"苏秦困境"来了解拜占庭将军问题,便于牢记. 战国时期,齐.楚.燕.韩.赵.魏.秦七雄并立,后来秦国的势力不断强大起来,成了东方六国的共同威 ...

  5. 架构师之路 — 分布式系统 — 分布式一致性难题

    目录 文章目录 目录 分布式一致性难题 分布式一致性算法 Paxos 算法 Raft 算法 Quorum NWR 算法 分布式一致性的实现方式 主动复制 被动复制 同步复制 异步复制 分布式一致性难题 ...

  6. 用三国杀讲分布式算法,太舒适了吧?

    头图 | CSDN 下载自视觉中国 作者 |  悟空聊架构  责编 | 张文 来源 |  悟空聊架构(ID:PassJava666) 前言 <三国杀>是一款热门的卡牌游戏,结合中国三国时期 ...

  7. 分布式系统的 38 个知识点

    天天说分布式分布式,那么我们是否知道什么是分布式,分布式会遇到什么问题,有哪些理论支撑,有哪些经典的应对方案,业界是如何设计并保证分布式系统的高可用呢? 1. 架构设计 这一节将从一些经典的开源系统架 ...

  8. 的协议是加密+拜占庭将军_分布式协议之拜占庭问题

    分布式协议笔记 常用的分布式算法 分布式算法的四度空间 为了更好地理解最常用的分布式算法的特点,作者从拜占庭容错.一致性.性能和可用性四个纬度整理了一张表 拜占庭容错 拜占庭错误是莱斯利·兰伯特在&l ...

  9. 分布式技术与实战第一课 分布式理论与一致性算法

    开篇词:搭建分布式知识体系,挑战高薪 Offer 你好,我是邴越,在一线互联网公司从事分布式开发工作多年,一直关注分布式理论和新技术的发展. 互联网发展到今天,用户数量越来越多,产生的数据规模也越来越 ...

  10. 03 如何透彻理解 Paxos 算法?

    文章目录 03 如何透彻理解 Paxos 算法? Quorum 机制 Quorum 定义 Quorum 的应用 Paxos 节点的角色和交互 Paxos 的节点角色 Proposer 提案者 Acce ...

最新文章

  1. C# 创建、部署和调用WebService的示例
  2. spring boot实战(第七篇)内嵌容器tomcat配置
  3. 详解虚函数的实现过程之菱形继承(5)
  4. 使用cmake重写live555工程-附源码和视频教程
  5. C#实现窗口最小化到系统托盘
  6. django-restframework使用
  7. aspnet_regsql
  8. PowerDesigner如何设计表之间的关联
  9. 用FreeBSD与memcached建立分布式缓存服务器全程记录之memcached使用与安装
  10. USB 协议整理 八:STM32官方USB库
  11. 将两个顺序表合并为一个新的顺序表
  12. Android webview网页截取长图
  13. 大数据未来7大发展趋势
  14. 俞灏明深二度灼伤 Selina做清创手术
  15. 前端每日实战:66# 视频演示如何用纯 CSS 创作一台咖啡机
  16. 质量免费--读书笔记(上篇)
  17. 客户旅程分析 Customer Journey Mapping
  18. Ubuntu 安装shutter
  19. 7-40 奥运排行榜 (25 分)
  20. Mysql 数据库执行计划 EXPLAIN SELECT * FROM

热门文章

  1. 美团一面:说说前、后端分离权限控制设计和实现思路?
  2. 七大江河水系--海河
  3. 基于Python的股票红利预测
  4. 【排序算法】Java版十大经典排序算法实现以及测试结果
  5. 解密七种html网页加密解密法
  6. 深空时代来临,探日究竟有何魔力?
  7. PgAdmin导入导出单表数据---解决PgAdmin导入单表数据报错乱码问题
  8. 修改串口服务器,串口虚拟化 | 串口服务器Nport 5630 设置
  9. CS相关经典书籍的书评
  10. 【论文阅读】【三维目标检测】Pseudo-LiDAR from Visual Depth Estimation