来聊聊Quorum NWR如何自定义一致性

2024-01-20 23:32

本文主要是介绍来聊聊Quorum NWR如何自定义一致性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 强一致性和最终一致性
  • 什么是Quorum NWR
  • Quorum NWR的三要素
  • Dynamo的NWR模型
  • 如何发现不一致副本

强一致性和最终一致性

 如果部门想做一个业务数据的实时分析系统,希望数据写入成功后就能马上读取到最新的数据,其实就是要求实现一个强一致性系统,数据更新后能立即查询到。
 那么,在这里面首先要搞清楚强一致性和最终一致性有什么区别。

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

什么是Quorum NWR

 如果为了这么一个临时需求重新开发一套系统肯定不合适,因为数据量大,耗时长。可以考虑在原有系统上开始实现新功能,通过Quorum NWR自定义一致性级别,通过临时调整写入或者查询的方式,当W+R>N时就可以实现强一致性了。
  在AP型分布式系统中(比如Dynamo、cassandra、InfluxDB的集群),Quorum NWR通常都是会实现的一个功能。这样,用户可以根据业务的特点,灵活地指定一致性级别。
  下面我们首先来了解下NWR的原理。
  Quorum NWR的核心内容就是N,W,R。一般就是通过组合这三个要素来实现自定义一致性级别的。

Quorum NWR的三要素

  • N表示副本数,又叫做复制因子。所以N用来描述同一份数据有多少个副本。

  • W表示一次写操作入至少写入W份数据才算写入成功。

  • R表示一次读操作至少读到R份数据才算读取成功。
     配置的时候要求W+R>N,因为W+R>N,所以R>N-W表示读取的副本份数一定要比总份数减去确保写成功的份数要大。也就是说,每次读取都能至少读取到一份最新的数据。
      下面举个例子,如下图所示
    在这里插入图片描述
     从图中你可以看到,DATA-3的读副本数为2。也就是说,客户端读取DATA-3的数据时,需要读取2个副本的数据,然后返回最新的那份数据。
      无论客户端如何执行读操作,哪怕它读取的是写操作未强制更新副本数据的节点(比如节点N1),但因为W(2)+R(2)>N(3),意思就是访问节点N1执行读操作时,,因为要读2份数据副本,所以除了节点N1上的DATA-3,还会读取节点N2或N3上的DATA-3。而节点N2和N3的DATA-3副本是强制更新成功的。这个时候,返回给客户端肯定是最新的那份数据。
      所以, 通过设置R为2,即使读到前面问题中的未更新副本数据,也能返回更新后的那份数据从而实现强一致性。
      除此之外,N、W、R的不同组合,会产生不同的一致性效果。具体如下:

  • 当W+R>N的时候,整个系统保持强一致性,一定能返回最新的数据

  • 当W+R<=N的时候,对于客户端来讲,整个系统只能保证最终一致性,可能会读取到旧数据。

Dynamo的NWR模型

  Dynamo NWR模型是把CAP选择权交给用户,让用户自己选择CAP。

  • 优化写性能(AP)

 当我们优化写性能(写多读少的场景),可以配置W=1,表示只要写完1个副本就返回,其它副本慢慢自己异步复制。如果N=3,那么根据W+R>N,则R=3,表示需要读取3个副本以判断数据是否冲突。这样的情况只要写任何节点成功就认为成功,但是读取的时候必须从所有节点读出数据。

  • 优化读性能(CP)
      当我们优化读性能(读多写少的场景),可以配置W=N,表示写完所有的副本才算成功,所有只能同步复制。根据公式W+R>N的时候,则R=1,表示只需要读取一个副本即可。这种情况任何一个节点读取成功就成功,但是写的时候必须写所有节点。
  • 平衡读写
     当我们的数据不多,单台机器能搞定的时候,可以配置N=2,根据公式W+R>N,则W=2,R=2

如何发现不一致副本

  当W=1时,用户A更新一个副本,在A的副本还有异步复制到其它节点的时候,如果用户B也在其它节点上更新了数据那么数据处于不一致状态了。Dynamo采用了向量clock(Vector Clock)。每个节点各自记录自己的版本信息。主要包括两个部分1)节点名称2)版本号。举个例子,A、B、C三个节点,W=1,R=N=3。一个写请求被节点A处理,它会增加一个版本信息(A, 1),我们把这个时候的数据记作D1(A,1),另外一个请求同样被A节点处理了,这时候记作D2(A,2),这个时候是不会造成版本冲突的。现在讲D2异步复制到B和C两个节点,此时B和C上的数据还是D2(A,2),三个节点上的数据版本一致。如果新的请求被节点B处理,此时节点B上的数据版本变为D3(A,2 ;B, 1),这样数据的全局版本号为3,节点A更新了2次,B更新了1次。
  如果D3数据还没有异步复制到节点C,C处理了一个新的写请求,此时节点C上的数据D4(A,2;C,1)。
  这个时候,一个收到一个读请求,因为R=N=3,所以要读取3个节点的版本。

  • 节点A:(A,2)
  • 节点B:(A,2;B,1)
  • 节点C:(A,2;C,1)
      这个时候可以看到节点A的版本最老被舍弃,但是节点B和C存在版本冲突得交给用户自己做版本冲突管理。dynamo做版本并发控制类似SVN提交代码冲突的原理类似

这篇关于来聊聊Quorum NWR如何自定义一致性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

MySQL中一致性非锁定读

一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行正在执行DELETE或UPDATE操作,这是读取操作不会因此等待行上锁的释放。相反的,InnoDB会去读取行的一个快照数据 上面展示了InnoDB存储引擎一致性的非锁定读。之所以称为非锁定读,因

InnoDB的多版本一致性读的实现

InnoDB是支持MVCC多版本一致性读的,因此和其他实现了MVCC的系统如Oracle,PostgreSQL一样,读不会阻塞写,写也不会阻塞读。虽然同样是MVCC,各家的实现是不太一样的。Oracle通过在block头部的事务列表,和记录中的锁标志位,加上回滚段,个人认为实现上是最优雅的方式。 而PostgreSQL则更是将多个版本的数据都放在表中,而没有单独的回滚段,导致的一个结果是回滚非

PHP: 深入了解一致性哈希

前言 随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis server来提供服务的话,就需要解决如何将数据分散到redis server,并且在增减redis server时如何最大化的不令数据重新分布,这将是本文讨论的范畴。 取模算法 取模运

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在