Quorum NWR算法
假如我们遇到这样一种事情:你开发实现了一套 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算法相关推荐
- 分布式之Quorum NWR算法
写在前面 假设现在我们实现了AP 系统,但是公司突然要对某些业务进行实时的数据计算,并且要求按照强一致性的方式来读取数据,此时作为系统设计这的我们该怎么办呢?单独为这部分业务实时抽出最新数据?还是修改 ...
- 太白金星:我很关心分布式 Quorum NWR
来源 | 悟空聊架构 责编 | 寇雪芹 头图 | 下载于视觉中国 先来看一段神秘的对话: 太白金星:听闻老君最近在练神丹妙药,可否与我一讲? 太上老君:老白啊,我最近在练六颗丹药:两颗延年丹.两颗健步 ...
- Quorum NWR
NWR是一种在分布式存储系统中用于控制一致性级别的一种策略.在Amazon的Dynamo云存储系统中,就应用NWR来控制一致性. 让我们先来看看这三个字母的含义: N:同一份数据的Replica的份数 ...
- 《分布式协议与算法实战》——专栏笔记
拜占庭将军问题--初探 问题描述 下面以"苏秦困境"来了解拜占庭将军问题,便于牢记. 战国时期,齐.楚.燕.韩.赵.魏.秦七雄并立,后来秦国的势力不断强大起来,成了东方六国的共同威 ...
- 架构师之路 — 分布式系统 — 分布式一致性难题
目录 文章目录 目录 分布式一致性难题 分布式一致性算法 Paxos 算法 Raft 算法 Quorum NWR 算法 分布式一致性的实现方式 主动复制 被动复制 同步复制 异步复制 分布式一致性难题 ...
- 用三国杀讲分布式算法,太舒适了吧?
头图 | CSDN 下载自视觉中国 作者 | 悟空聊架构 责编 | 张文 来源 | 悟空聊架构(ID:PassJava666) 前言 <三国杀>是一款热门的卡牌游戏,结合中国三国时期 ...
- 分布式系统的 38 个知识点
天天说分布式分布式,那么我们是否知道什么是分布式,分布式会遇到什么问题,有哪些理论支撑,有哪些经典的应对方案,业界是如何设计并保证分布式系统的高可用呢? 1. 架构设计 这一节将从一些经典的开源系统架 ...
- 的协议是加密+拜占庭将军_分布式协议之拜占庭问题
分布式协议笔记 常用的分布式算法 分布式算法的四度空间 为了更好地理解最常用的分布式算法的特点,作者从拜占庭容错.一致性.性能和可用性四个纬度整理了一张表 拜占庭容错 拜占庭错误是莱斯利·兰伯特在&l ...
- 分布式技术与实战第一课 分布式理论与一致性算法
开篇词:搭建分布式知识体系,挑战高薪 Offer 你好,我是邴越,在一线互联网公司从事分布式开发工作多年,一直关注分布式理论和新技术的发展. 互联网发展到今天,用户数量越来越多,产生的数据规模也越来越 ...
- 03 如何透彻理解 Paxos 算法?
文章目录 03 如何透彻理解 Paxos 算法? Quorum 机制 Quorum 定义 Quorum 的应用 Paxos 节点的角色和交互 Paxos 的节点角色 Proposer 提案者 Acce ...
最新文章
- C# 创建、部署和调用WebService的示例
- spring boot实战(第七篇)内嵌容器tomcat配置
- 详解虚函数的实现过程之菱形继承(5)
- 使用cmake重写live555工程-附源码和视频教程
- C#实现窗口最小化到系统托盘
- django-restframework使用
- aspnet_regsql
- PowerDesigner如何设计表之间的关联
- 用FreeBSD与memcached建立分布式缓存服务器全程记录之memcached使用与安装
- USB 协议整理 八:STM32官方USB库
- 将两个顺序表合并为一个新的顺序表
- Android webview网页截取长图
- 大数据未来7大发展趋势
- 俞灏明深二度灼伤 Selina做清创手术
- 前端每日实战:66# 视频演示如何用纯 CSS 创作一台咖啡机
- 质量免费--读书笔记(上篇)
- 客户旅程分析 Customer Journey Mapping
- Ubuntu 安装shutter
- 7-40 奥运排行榜 (25 分)
- Mysql 数据库执行计划 EXPLAIN SELECT * FROM