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

来源 | 悟空聊架构

责编 | 寇雪芹

头图 | 下载于视觉中国

先来看一段神秘的对话:

太白金星:听闻老君最近在练神丹妙药,可否与我一讲?

太上老君:老白啊,我最近在练六颗丹药:两颗延年丹、两颗健步丹、两颗恢复丹。

太白金星:那这三个八卦炉定是练这三件法宝的?

太上老君:正是正是。而且对于相同的丹药,功效和大小还得完全一样。

  

三个炼丹炉怎么分配的

让我们揭开老君的炼丹炉,看看六颗丹药是怎么分配的。首先我们是很容易猜到丹炉是怎么分配炼丹的:

  • 一号丹炉炼两颗延年丹。

  • 二号丹炉炼两颗健步丹。

  • 三号丹炉炼两颗恢复丹。

那如此分配会有什么问题呢?

我们试想一下,如果一号丹炉因为炉火太高炸裂了,那么两颗延年丹定会失败。这和把鸡蛋放到一个篮子里面是一个道理。假如篮子不慎被打翻,里面的鸡蛋都掉出来,就都碎了。

  • 一号丹炉炼一颗延年丹和一颗健步丹。

  • 二号丹炉炼一颗延年丹和一颗恢复丹。

  • 三号丹炉炼一颗健步丹和一颗恢复丹。

太白金星:老君,为何要如此分配,每个丹药的火候可不那么好把控啊?

太上老君:老白,我可是炼丹大师,火候难不倒我。

太白金星:不愧是老君啊,这样即使有一个丹炉有问题,至少能保证一颗能炼成,而不是两颗都毁了。

映射到我们互联网系统中:丹炉类似于服务器节点或数据库节点,通过多个节点来相互备份数据来保证系统的高可用性(High Availability)。


如何保证丹药品质一样


2.1 一致性

太白金星:老君,你刚提到,两颗延年丹需要保证功效一样,大小一样?

太上老君:确实如此,丹药品质必须保持一致,我炼的都是九品丹药,药效差一点则是千差万别。

太上老君说的品质保持一致到底怎么回事?

一号丹炉里面的延年丹和二号丹炉的延年丹如何保证品质一致呢?

这不就是我们常常说的分布式一致性吗?两颗丹药分布在不同的丹炉中,需要保证品质一致。

如下图所示,这两颗延年丹的一大一小,颜色也有不同,这就是品质不一样。

而在架构设计中,比如请求访问到不同的数据库,查到的数据都是一样的,这就是一致性。如下图所示:浏览器访问数据库 1 和数据库 2 中的数据 A,结果返回的都是 A = 1。

分布式系统中的一致性

2.2 最终一致性和强一致性

分布式中的一致性又分为最终一致性和强一致性。

所谓强一致性就是写操作完成后,任何后续访问都能读到更新后的值。这就是CP系统所要求的一致性和分区容错性。。

那放到炼丹中怎么理解?

比如老君给一号丹炉的延年丹加入了莲花这种药材,给二号丹炉的延年丹也这么操作,那么老白揭开炉盖看到的两颗延年丹的成分是一样的。

而最终一致性就是不保证后续访问都能读到更新后的值,但是经过一段时间后,再去读,就能得到相同的值。也就是说,在这段时间内,可能读到旧的数据。这就是AP系统所要求的可用性和分区容错性。

放到炼丹中怎么理解?

比如老君给一号丹炉的延年丹加入了莲花,而经过了一个时辰后,才给二号丹炉加雪莲,那么在这个时辰内,看到的两颗延年丹的成分就不一样了。但经过一个时辰后,最终成分一样。

可控的品质:Quorum NWR 协议

假如延年丹必须保证品质的强一致性,而健步丹只需要保证品质的最终一致性,这个该怎么控制呢?

这个可没有难倒老君,因为老君懂得分布式协议:Quorum NWR。

Quorum 这个单词的意思:(会议的)法定人数。主要是看后面三个大写字母:N、W、R。由 NWR 来控制一致性。

3.1 参数 N

我们还是来看下丹炉中的情况,两颗延年丹是互为备份的,相当于有两个副本。

N 称作副本数,又叫做复制因子(Replication Factor)。表示同一份数据有多少个副本,所以:延年丹的 N = 2。依次类推:健步丹的 N = 2,恢复丹的 N = 2。如下图所示:

丹药的副本数一样

那 N 可以变吗?

如下图所示:比如我想炼 3 颗延年丹,也就是每个丹炉都有延年丹,那就把 N 改成 3 就可以了。而健步丹只需要炼一颗足以,那一号丹炉炼就可以了,所以N = 1。

多个丹药的副本数不一样

3.2 参数 W

指定了副本数 N 之后,就可以对副本数据进行读写操作。

  • 读操作:查看所在丹炉内丹药的情况。

  • 写操作:给丹药添加药材、提高温度。

那多个丹药该如何执行读写操作呢?对于写操作,我们有 W 参数,对于读操作,我们有 R 参数。

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

比如设置延年丹的 W = 2,表示对延年丹执行写操作时,完成了 2 个副本的更新时,才完成写操作。

如下图所示:一号丹炉和二号丹炉中的延年丹都加入了莲花,而三号丹炉中的延年丹未加入莲花。也就是只完成了两个副本的更新,符合 W = 2 这个条件,即写操作完成。

两个延年丹加入了莲花

但是大家发现问题没,三号丹炉的延年丹未加入莲花,那怎么保证太上老君查看丹药情况时,得知是已加入莲花呢?也就是如何保证读写的强一致性,这就要用到第三个参数了:R。

3.3 参数 R

R 称为读一致性级别(Read Consistency Level),表示读取一个数据对象时,需要读 R 个副本,然后返回 R 个副本中最新的那份数据。

回到炼丹的问题中,设置延年丹的 R = 2,也就是查看延年丹的情况时,只需要查看两个丹炉内的延年丹的情况,然后返回最新的延年丹的情况就可以了。

  • 假设查看的是一号和二号丹炉内的延年丹,返回的情况都是:已加入莲花。这种场景是一致性的。

  • 假设查看的是一号和三号丹炉内的延年丹,一号丹炉的延年丹是已加入莲花,三号丹炉是未加入莲花,但是三号丹炉内的延年丹最后一次操作时间是早于一号丹炉的,所以返回一号丹炉内延年丹的情况:已加入莲花。这种场景也是一致性的。

通过上面的两种场景,我们知道,通过设置 R = 2,即使读到第三份未更新的数据,也能返回更新后的数据,实现强一致性。

3.4 参数组合

参数 N、W、R 的不同组合将会带来不同的一致性效果。

  • 比如上面的例子,N = 3,W = 2,R = 2,W + R > N,对于客户端来讲,整个系统能保证强一致性,一定能返回更新后的那份数据。

  • 当 W + R <= N 时,对于客户端来讲,整个系统只能保证最终一致性,访问数据期间可能会返回旧数据。

参数不同,效果不同,分布式系统需要根据不同场景来配置。

应用

InfluxDB 企业版是时序数据库,它有四种写一致性级别:

  • any:W + R < N,W = 1,任何一个节点写入成功后,或者写入 Hinted-handoff 缓存(等下次重传),返回成功给客户端。

  • one:W + R < N,W = 1,任何一个节点写入成功后,立即返回成功给客户端,不包括写入 Hinted-handoff 缓存

  • quorum:W + R > N,大多数节点写入成功后,就返回成功给客户端。(要求 N 大于2)

  • all:W = N,所有节点都写入成功后,返回成功。

另外对于 时序数据库 InfluxDB 来说,读操作需要读取大量数据,为了保证读取的高效,它不支持读一致性级别(R = N),但是可以通过设置写一致性级别为 all,来实现强一致性。

InfluxDb 实现了 Quorum NWR,当线上业务需要临时做些一致性调整时,设置不同的写一致性级别即可完成快速切换。


总结

本文通过太上老君和太白金星关于炼丹的对话,引申出自定义一致性的分布式协议:Quorum NWR 协议。

  • 丹炉比喻节点,丹药比作数据,多个丹药称作副本

  • N 代表副本数,W 代表写多少个副本数,R 代表读多少个副本数。

  • 当 N 大于节点数时,就会出现一个节点存在多个副本的情况,这个节点故障时,多个副本会受到影响。

  • W + R > N 时,代表强一致性。

  • W = N 时,读性能好。R = N,写性能好。

  • W = R = (N+1)/2,容错能力好,能容忍 少数节点(也就是(N-1)/2) 个节点故障。

  • 如何设置 N、W、R 值,取决于我们的系统该往哪方面优化。

  • Quorum NWR 分布式算法给业务提供了按需选择一致性级别的灵活度,弥补了 AP 型系统缺乏强一致性的缺点。

太白金星:预祝你炼丹成功!

点击关注我们,记得标星哦~~~

更多阅读推荐

  • 一张魔力象限图,一眼看尽5G江湖

  • SRE 是如何保障稳定性的

  • 如何写出让 CPU 跑得更快的代码?

  • 俯瞰云原生,这便是供应层

  • 13种重要的云原生工具,让交付过程更快

  • 一目了然的 Docker 环境配置指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mPaaS小程序技术架构深度解析

⚅ 点击观看《mPaaS 小程序新品发布会》回放 > > 随着小程序技术的愈发成熟&#xff0c;不同平台的优势和典型使用场景各有侧重&#xff0c;同时越来越多的开发者可以结合自身的业务特色&#xff0c;通过小程序作为业务载体&#xff0c;形成单一平台或多平台的协同关系。…

从javaScript数据类型开始了解垃圾回收机制

一、 javaScript数据类型 javaScript 数据类型分为&#xff1a;基本数据类型、引用数据类型 基本数据类型 分类&#xff1a;Number、String、Boolean、Null、Undefined、Symbol。 存储地址&#xff1a;栈。 引用数据类型 分类&#xff1a;Object、Array、Function。 存储地…

直播中那几秒延时到底来自哪?

7月16日&#xff0c;亚太内容分发大会上&#xff0c;阿里云高级产品运营专家俞翔受邀出席&#xff0c;并分享了基于CDN网络构建超低延时直播的场景实践。以下为演讲原文。 近几年&#xff0c;直播带货已经逐渐走进大众视野。在今年上半年受疫情原因影响&#xff0c;直播营销市…

三探云原生全景图,这次聊聊运行时层

在《俯瞰云原生&#xff0c;这便是供应层》我们介绍了云原生全景图的最底层&#xff1a;供应层&#xff0c;本文将带大家了解运行时层&#xff0c;这一层包含了容器在云原生环境中运行所需的一切。作者 | Catherine Paganini&#xff0c;Jason Morgan来源 | K8sMeetup社区头图 …

SpringCloud应用在Kubernetes上的最佳实践—开发部署

作者 | 孤弋 阿里云高级技术专家&#xff0c;负责 EDAS 的开发和用户体验优化工作。 导读&#xff1a;在上一篇文章《SpringCloud 应用在 Kubernetes 上的云上实践 - 开发篇》中讲到可以通过两个工具&#xff0c;轻松地将一个 SpringCloud 应用从初始化到本地运行。本篇文章&a…

解决谷歌浏览器 google chrome 安装插件报错:Download interrupted,不支持 .crx 文件下载

最近给 新的 macBook Pro 2020 笔记本的 chrome 浏览器安装 react developer tools 时&#xff08;翻墙情况下&#xff09;&#xff0c;安装总是不成功&#xff0c;有一个弹框提示&#xff1a;Download interrupted。 一开始我以为是第三方插件出了问题&#xff0c;于是我去安…

低代码,让人人都可以是开发者

作者&#xff1a;流水不争先 来源| 技术领导力(ID&#xff1a;jishulingdaoli)头图 | 下载于视觉中国今年2月23日&#xff0c;外国低代码平台提供商Creatio宣布获得6800万美元融资&#xff1b;2月22日&#xff0c;国内SaaS软件厂商黑湖智造宣布完成C轮近5亿元人民币融资。国内外…

秒懂云通信:选云通信到底哪家强?

原文链接 本文为云栖社区原创内容&#xff0c;未经允许不得转载。

H5 中 IOS 系统如何获取浏览器真正的内核

当我们使用 navigator.userAgent 获取 当前浏览器的用户代理&#xff0c;一般通过正则表达式 就可获取到对应的浏览器内核。但是 问题&#xff1a;在ios系统下&#xff0c;无论我们下载什么浏览器&#xff08;chrome、火狐…&#xff09;&#xff0c;其内核都是safari。 原因…

有效的云安全态势始于三个步骤

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 公共云的采用如今持续增长&#xff0c;到今年年底&#xff0c;预计将有83%的企业工作负载都在云平台中。云计算增加的灵活性和…

妥了!微服务治理的困难,用 Serverless 来解决

作者 | 王科怀&#xff08;行松&#xff09;来源 | Serverless头图 | 下载于视觉中国微服务治理面临的挑战在业务初期&#xff0c;因人手有限&#xff0c;想要快速开发并上线产品&#xff0c;很多团队使用单体的架构来开发。但是随着公司的发展&#xff0c;会不断往系统里面添加…

建网站应该选择自己建站还是在线建站?

一、什么是网站&#xff1f; 网上关于网站的定义很多&#xff0c;在此就不想重复了&#xff0c;简而言之网站就是创建者使用技术手段搭建&#xff0c;从而让访客可以通过域名访问并进行互动的互联网页面组合。 通常网站由四个部分组成&#xff1a; 1、域名&#xff1a; 也就…

SVG图片以 https 链接的方式展示在页面上,并且可继承父类的颜色大小(类似阿里巴巴iconfont)

一、背景与问题 1. 背景 在前端的项目开发过程中&#xff0c;我们经常使用到 字体图标库&#xff08;iconfont&#xff09;&#xff0c;以 ant dezign 为例。 如果在遇到图标库不存在的图标时&#xff0c;我们往往采用自定义图标的方式&#xff1a; 引入自定义的svg图&…

云原生高可用技术体系构建

伴随着互联网业务的高速发展&#xff0c;越来越多的线下场景需要转移到线上&#xff0c;而线上业务的量级也在飞速增长&#xff0c;给互联网业务的技术架构带来了严峻的挑战&#xff0c;原来的“一体机数据库”的方式已经不适用于当前的主流业务&#xff0c;越来越来的业务开始…

容器技术在企业落地的最佳实践

作者 | 易立 阿里云资深技术专家 导读&#xff1a;近年来&#xff0c;容器技术及相关应用得到了国内外越来越多的关注度。在国外&#xff0c;容器技术已经形成了较成熟的生态圈&#xff1b;而在国内&#xff0c;金融企业、互联网企业、IT 企业积极投入容器技术的应用。本文将重…

上手 Docker 容器,不应该是个问题

来源 | 无敌码农责编 | 寇雪芹头图 | 下载于视觉中国在微服务时代&#xff0c;服务数量及规模越来越大&#xff0c;服务的部署及运维的模式如果仍然采用传统方式就会大大增加运维成本。所以微服务时代的运维方式一定是Devops模式&#xff0c;通过构建自动化运维发布平台来打通产…

vue+node前后端分离接口调用(初学者)

一、node编写接口 &#xff08;设定你已使用Nodeexpress搭建好了项目&#xff0c;可参照我的上一篇博客&#xff09; 我们就在users.js下进行接口编写 router.get(/getUserInfo,function(req,res,next){var user new User();//解析路由参数var params URL.parse(req.url, tr…

一款App基于mPaaS小程序如何进行改造?

这篇故事围绕着一款 App 基于 mPaaS 小程序进行改造娓娓展开。 作为国内校园服务场景最丰富的平台&#xff0c;笑联 App 已覆盖国内 130 所高校&#xff0c;服务近百万高校学生。 截止目前&#xff0c;笑联 App 内的 12 个业务模块目前已顺利实现小程序化。不仅获得媲美原生应用…

隐秘的角落里数亿场AI战争正在发生

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; "科技领域不做安全风控&#xff0c;就等于造汽车的时候没有做刹车。”蚂蚁集团首席AI科学家漆远这样形容安全风控的地位…

锐捷发布极简以太全光解决方案 打造“不一样”的全光网

3月9日&#xff0c;锐捷网络举办以“不一样的全光网”为主题的媒体发布会&#xff0c;正式对外发布新一代全光网络解决方案——极简以太全光解决方案&#xff08;以下简称极简光方案&#xff09;。这个方案正是面向不断升温的全光网络市场需求&#xff0c;针对教育、制造、医疗…