分布式与一致性协议之Quorum NWR算法

2024-05-10 07:20

本文主要是介绍分布式与一致性协议之Quorum NWR算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Quorum NWR算法

概述

不知道你在工作中有没有遇到过这样的事情:你开发实现了一套AP型分布式系统,实现了最终一致性,且业务接入后运行正常,一切看起来都那么美好。
可是突然有同事说,我们要拉这几个业务的数据做实时分析,希望数据写入成功后,就能立即读取到新数据,也就是要实现强一致性(Werner Vogels提出的客户端侧一致性模型,不是指线性一致性),即数据更改后,要保证用户能立即查询到,这时你该怎么办呢?首先你要明确最终一致性和强一致性有什么区别.

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

其实,为了一个临时的需求而重新开发一套系统或者迁移数据到新系统肯定是不合适的。因为工作量比较大,而且耗时也长,所以建议通过Quorum NWR算法解决这个问题。
通过Quorum NWR算法,我们可以自定义一致性级别,通过临时调整写入或者查询的方式满足新需求,当W+R>N时,就可以实现强一致性了。也就是说,在原有系统上开发并实现一个新功能,即可满足业务同事的需求。
其实,在AP型分布式系统中(如Dynamo、Cassandra、InfluxDB企业版的DATA节点集群),Quorum NWR算法时通常都会实现的一个功能,很常用。掌握了Quorum NWR算法,不仅可以掌握一种常用的、实现一致性的方法,而且可以在后续的实际场景中根据业务的特点,灵活地指定一致性级别。

Quorum NWR的三要素

在这里插入图片描述

N表示副本数,又叫作复制因子(Replication Factor)。也就是说,N表示集群中同一份数据有多少个副本,如图所示,从图中可以看到,在这个3节点集群中,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个副本的更新就表示完成了写操作,那么如何实现强一致性呢?如果客户端读到第3个数据副本(比如节点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,即是读到前面问题中的第3份副本数据(比如节点B),也能返回更新后的那份数据,实现强一致性。

除此之外,关于Quorum NWR算法,我们还需要注意的是,N、W、R的值的不同组合会产生不同的一致性效果,具体来说,不同组合会产生如下两种效果。

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

如何实现Quorum NWR

在InfluxDB企业版中,我们可以在创建保留策略时设置指定数据库对应的副本数,如代码所示

create retention policy "rp_one_day" on "telegraf" duration 1d replication 3

在上述代码中,我们通过replication参数指定了数据库telegraf对应的副本数为3。需要注意的时,在InfluxDB企业版中,副本数不能超过节点数据。你可以这样理解,多副本的意义在于冗余备份,如果副本数超过节点数,就意味着一个节点上会存在多个副本,那么这时冗余备份的意义就不大了。比如机器故障时,节点上的多个副本是同时被影响的。

InfluxDB企业版支持"Any、One、Quorum、All"4种写一致性级别,具体含义分析如下:

  • 1.Any:任何一个节点写入成功后,或者接收节点已将数据写入Hinted-handoff缓存(也就是写其他节点失败后,本地节点上缓存写失败数据的队列)后,就会返回成功给客户端
  • 2.One:任何一个节点写入成功后,就会立即返回成功给客户端,不包括成功写入Hinted-handoff缓存
  • 3.Quorum:当大多数节点写入成功后,就会返回给客户端。此选项仅在副本数大于2时才有意义,否则等效于All
  • 4.All:仅在所有节点都写入成功后,返回成功
    强调一下,对时序数据库而言,读操作会拉取大量数据,其查询性能是挑战,是必须要考虑优化的。因此,InfluxDB企业版不支持读一致性级别,只支持写一致性级别。另外,我们还可以设置写一致性级别为All,来实现强一致性。
    如果我们像InfluxDB企业版这样实现了Quorum NWR算法,那么在业务临时需要实现强一致性时,就可以通过设置写一致性级别为All来实现了

重点总结

  • 1.一般而言,不推荐副本数超过当前的节点数,因为当副本数超过节点数时,就会出现同一个节点存在多个副本的情况。当这个节点有故障时,上面的多个副本就都会收到影响
  • 2.当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算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975801

相关文章

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Redis分布式锁使用及说明

《Redis分布式锁使用及说明》本文总结了Redis和Zookeeper在高可用性和高一致性场景下的应用,并详细介绍了Redis的分布式锁实现方式,包括使用Lua脚本和续期机制,最后,提到了RedLo... 目录Redis分布式锁加锁方式怎么会解错锁?举个小案例吧解锁方式续期总结Redis分布式锁如果追求

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig