从微软Cosmos DB浅谈一致性模型

最近回顾了微软的Cosmos DB的提供一致性级别,重新整理下一致性模型的相关内容。

0. Cosmos DB

Cosmos DB(Azure Cosmos DB)是由微软推出的一个支持多模型、多 API 的全球分布式数据库服务。它旨在提供高度可扩展性、低延迟、强一致性和全球分布的能力,以满足各种应用程序的要求。关键特性如下:

  1. 多模:支持多种数据模型,包括文档、图形、列族、键值对和表格。最关键一点是多模数据类型的支持,比如地图业务很常用GIS数据类型
  2. 全球分布:在多个 Azure 区域中复制和分布,从而实现低延迟、高可用性和强一致性。用户可以选择多个一致性级别,比如强一致性、最终一致性。一致性就是本文所要讨论的
  3. 多租户: 支持多租户模型,从而不同应用/客户可以隔离,这也是很多数据库产品均提供的重要能力
  4. 自动扩缩容:根据负载的变化自动调整吞吐量和存储
  5. 多API支持:比如这次hiSQL、MongoDB、Cassandra、Gremlin和 Azure Table Storage。研发可以使用他们熟悉的编程模型和查询语言
  6. 全面的 SLA(服务水平协议): Cosmos DB 提供了强大的 SLA,包括在读写延迟、可用性、一致性和吞吐量等方面的保证

一、一致性模型

在之前的一篇文章:浅谈CAP+ACID+BASE理论 介绍了在为什么会有CAP理论( PACELC theorem),其中C就是本身所述的一致性模型。

理想情况下,真正的一致性模型只有一种,即强一致性(或者说严格一致性,或者说满足linearizability )。

  • 强一致性模型含义
    在分布式系统中,当对某个数据项进行了写入后,所有后续的读者都可以看到该数据项的更新。它确保所有的操作看起来像在一个全局的、实时的、顺序的序列中执行,而且这个序列必须满足实际发生的操作顺序。线性一致性提供了最高的一致性保证,但也可能对系统的性能造成较大的影响。
    为了保证强一致性的语义,这无疑会增加写入的耗时。因此在真实的系统中,有的系统采用了最终一致性,但是会因为过程中数据不一致会导致逻辑和语义不清晰。

二、Cosmos DB-一致性模型

Cosmos DB特点在于:目前市场上大多数商业可用的分布式NoSQL数据库仅提供强一致性和最终一致性。Azure Cosmos DB却提供了五个明确定义的一致性级别,从最强到最弱分别是:

  • Strong:强一致性模型
  • Bounded staleness:有界旧一致性模型
  • Session:会话一致性模型
  • Consistent prefix
  • Eventual:最终一致性模型

Cosmos DB提供更为精准的一致性模型选择,客户可以基于业务自身需求以及真实场景,选择合适的一致性模型,从而在读写耗时、吞吐、性能、一致性等多个角度获取权衡。

参考的Cosmos DB一张图:
Strong具备最强的一致性,一致性级别越低,写延迟越低、吞吐越高。
Cosmos DB一致性
如果只分为两类:

  1. 强一致性模型:Cosmos DB的写入会被复制到本地区域Region的至少三个副本(四个副本满足多数派),并同步复制到所有其他区域
  2. 弱一致性模型:写入会被复制到本地区域Region的至少三个副本(在四个副本满足多数派),并异步复制到所有其他区域

2.1 Strong

强一致性提供了线性一致性(linearizability )的保证。线性一致性是指并发多个读写请求。读操作始终保证返回数据项的最新已提交版本。客户端永远不会看到未提交或部分写入。用户始终保证读取到最新已提交的写入。
具体的例子可以参考Cosmos DB文章中的一个基于音符的动态图。
在数据从任何一个Region写入后,从其他任何Region都可以读取到该数据项的最新写入。

2.2 Bounded staleness consistency

Cosmos DB单个租户数据可能分布在多个Region中,可能出现如下两种场景:

  1. 客户只在单个Region中写入,写入的数据会从主Region(即写入的Region)复制到其他只读的Region
  2. 客户在多个Region写入,写入的数据会从所属Region(即写入的Region)复制到其他的Region

因为存在数据复制,不同的Region的不同副本可能会存在延迟。在数据复制过程,任意两个Region之间的数据落后始终小于指定的数量,该数量可以是“K”个版本,也可以是“T”个时间间隔。因此Bounded staleness consistency-有界旧一致性,定义两个指标如下:

  • 数据项的版本数(K),简单理解即一个数据项被写过几次
  • 读取可能落后于写入的时间间隔(T)

当选择有界旧一致时,可以通过上述两种方式配置任何区域中数据的最大“陈旧”程度:

  1. 如果租户分布在多个Region,单个Region中写入,数据复制到其他Region;当数据落后于指定上述配置,那么写入会限速,避免落后持续变大,直至数据落后程度恢复到配置值之内
  2. 如果租户只分布在单个Region中,有界旧一致性提供与会话一致性和最终一致性相同的写入一致性保证。有界旧一致性将数据复制到单Region中的本地多数(即满足多数派,比如四个副本,三个副本复制成功)。

Cosmos DB提到两个注意事项:

  1. 使用有界旧一致性,陈旧性检查仅在Region之间进行,而不在Region内进行。在给定Region内,数据复制满足多数派,而不论一致性级别如何。在Region内读取,通过读取两个可用副本的数据(因为多数派)来获取本Region内最新的数据
  2. 使用有界旧一致性,对非主Region发出的读取操作可能不会返回全局最新版本的数据,但是保证返回该Region中最新版本的数据,且该版本在全局最大陈旧度边界之内。

2.3 Session consistency

会话一致性保证在单个客户端会话内,读取操作将遵守“ read-your-writes,”和“write-follows-reads”的保证。此保证假定存在单个“写入者”会话或在多个写入者之间共享会话令牌。会话一致性本质的语义就在于满足:

Read-Your-Writes (RYW)

  • 定义: 如果一个进程在某个时间点读取了一个数据项,并在之后写入了该数据项,那么该进程之后的任何读操作(不管读几次)都将能够看到其之前的写入。一个进程写入的任何变化对其自己后续的读操作都是可见的。

Write-Follows-Reads (WFR)

  • 定义: 如果一个进程在某个时间点读取了一个数据项,并在之后写入了该数据项,那么该进程的写操作不会被安排在其之前的读操作之前。一个进程的写入不会立即影响到其之前的读取。

工作流程

  1. 如果客户端没有对物理分区发起写操作,则客户端在其缓存中不包含会话令牌(Token),对该物理分区的读取将表现为最终一致性的读取。如果客户端被重新创建,其会话令牌缓存也会被重新创建。在这种情况下,读取操作遵循最终一致性。
  2. 在每次写操作之后,客户端会从服务器接收一个更新的会话令牌(Token)。客户端缓存这些令牌,并在指定的Region中的读取操作中将它们发送给服务器。
  3. 如果执行读取操作的副本包含指定令牌(或更近的令牌)的数据,则返回请求的数据。
  4. 如果副本不包含该会话的数据,客户端将在该Region内对另一个副本重试该请求。如果有需要,客户端会在额外的可用Region内重试读取,直到检索到指定会话令牌的数据。

同时需要注意:

  1. 会话一致性的令牌保证数据读取不能太旧(最小版本Barrier),但不是具备类似MVCC指定版本读取的语义。当使用会话一致性中,客户端使用会话令牌确保永远不会读取与较旧会话对应的数据。如果客户端使用的是较旧的会话令牌,而数据库已经有了更新的写入(比如Token=100, 数据A已经有一系列修改1 2 3 4,Token=100其实对应的3的修改时间),那么尽管使用的是较旧的会话令牌100,也会返回更近版本的数据4。会话令牌被用作最小版本Barrier,但不用作从数据库指定的数据版本。
  2. 令牌分区绑定分区

2.4 Consistent prefix consistency

前缀一致性中表示:如果一个操作在一个进程中排在另一个操作的前面,那么在所有进程的操作中,这个顺序将得到保持。它保证操作的顺序形成一个一致的前缀,虽然不一定反映实时的顺序。

举例而言:假设在事务T1和T2中对文档Doc1和Doc2进行了事务性的(要不成功,要不失败)两个写操作。当客户端在任何副本中进行读取时,用户将看到“Doc1 v1和Doc2 v1”或“Doc1 v2和Doc2 v2”,或者如果副本落后,则两个文档都不可见,但永远不会看到,“Doc1 v1和Doc2 v2”或“Doc1 v2和Doc2 v1”。

2.5 Eventual consistency

最终一致性的含义在于:

  1. 客户端发出读取请求,针对指定Region中的任何一个四个副本。这个副本可能落后,因此可能返回陈旧甚至无数据返回。
  2. 随着时间的推移,最终的修改也是能读取到的。

最终一致性是一致性模型的最弱保证,因为客户端可能读取比其过去读取的值更旧的值。最终一致性在应用程序不需要任何排序保证的情况下是理想的,性能、吞吐等最高。对于某些业务,比如微博点赞数、评论数量,采用最终一致性其实很合适。

三、Cosmos DB 一致性模型总结

  1. 如果数据库上没有写操作,使用最终一致性、会话一致性或前缀一致性级别的读取操作可能会产生与使用强一致性级别的读取操作相同的结果。
  2. Cosmos DB提供了之统计和指标,了解客户端可能在您的工作负载中获得强一致性读取的概率。通过Probabilistically bounded staleness指标

3.1 latency-延迟保

  1. 读延迟:对于所有一致性级别,读取的延迟在99%始终保证小于10毫秒。平均读取延迟,在50%通常为4毫秒或更短。
  2. 写延迟:对于所有一致性级别,写入的延迟在99%上始终保证小于10毫秒。平均写入延迟,在50%通常为5毫秒或更短。如果跨越多个区域并配置为强一致性级别无法保证(跨区域的RT各种因素)

3.2 throughput-吞吐

  1. 对于强一致性和有界旧一致性,读取是在四个副本集中的两个副本(少数派法定人数)上进行的,以提供一致性保证。会话、前缀一致和最终一致性执行单个副本读取。因此,对于相同数量的请求单元,强一致性和有界旧一致性的读取吞吐量是其他一致性级别的一半。读两个副本和读单个副本的区别。
  2. 对于给定类型的写入操作,例如insert、replace、upsert和delete,请求单元的写入吞吐量在所有一致性级别上都是相同的。对于强一致性,写入需要在每个区域(全局多数派)中提交,而对于所有其他一致性级别,使用的是本地多数派(四个副本中的三个副本)
Consistency LevelQuorum ReadsQuorum Writes
StrongLocal MinorityGlobal Majority
Bounded StalenessLocal MinorityLocal Majority
SessionSingle Replica (using session token)Local Majority
Consistent PrefixSingle ReplicaLocal Majority
EventualSingle ReplicaLocal Majority

上述表格总结了不同一致性级别(Consistency Level)下的读取和写入的情况。这些一致性级别是在分布式系统中用于平衡一致性和性能的不同保证。其中:

“Quorum Reads” 表示需要读取的副本数量,以满足一定一致性级别。
“Quorum Writes” 表示需要写入的副本数量,以满足一定一致性级别。

3.3 data durability- 数据持久性

首先解释两个概念:
在数据库系统领域,RPO(Recovery Point Objective)和 RTO(Recovery Time Objective)是两个关键的恢复目标,用于确定业务连续性和灾难恢复计划。

  • RPO(Recovery Point Objective):
    定义: RPO是指在灾难事件发生之前,客户可以接受的数据丢失的最大时间间隔。RPO确定了业务可以接受的数据损失的程度。

  • RTO(Recovery Time Objective):
    定义: RTO是指在灾难事件发生后,客户需要将其业务系统和功能恢复到正常运行状态所需的最长时间。RTO表示了业务能够接受的最大停机时间。

在金融领域的数据库,一个最重要的保证是任何场景下,不能丢失数据,因此往往PRO要做到0,即不管任何异常都不能丢失任何数据;同时尽量降低RTO,即异常后恢复可服务的时间,这个时间越小越好。

在全球分布的数据库环境中,一致性级别的设置与在发生区域性故障时数据持久性之间存在直接关系。即客户需要了解在不同的级别下,在异常场景下是否会出现数据受损。即RPO指标。

Region(s)Replication modeConsistency levelRPO
1Single or Multiple write regionsAny Consistency Level< 240 Minutes
>1Single write regionSession, Consistent Prefix, Eventual< 15 minutes
>1Single write regionBounded StalenessK & T
>1Single write regionStrong0
>1Multiple write regionsSession, Consistent Prefix, Eventual< 15 minutes
>1Multiple write regionsBounded StalenessK & T

其中:K是数据项的版本数;T是上次更新后的时间间隔。
对于Region帐户, K 和 T 的最小值为 10 次写入操作或 5 秒。对于多Region帐户,K 和 T 的最小值为 100,000 次写入操作或 300 秒。

  1. 当只有一个Region时,任何一致性级别,RPO都很大。
  2. 当有多个Region,和复制模型有关:
    (1) 当只写一个Region, Session, Consistent Prefix, Eventual 的RPO小于15分钟;而Bounded Staleness 的PRO和K、T有关系;Strong保证不丢失数据
    (2) 当写多个Region, Session, Consistent Prefix, Eventual 的RPO小于15分钟;而Bounded Staleness 的PRO和K、T有关系
    (3) Azure Cosmos DB帐户配置了多个写入区域后,无法配置为强一致性,因为对于分布式系统来说,提供零的RPO=0(恢复点目标)和RTO=0(恢复时间目标)是不可能的,既要也要做不到!
Consistency LevelGuarantees
StrongLinearizable reads
Bounded StalenessConsistent Prefix. Reads lag behind writes by k prefixes or t interval
SessionConsistent Prefix. Monotonic reads, monotonic writes, read-your-writes, write-follows-reads
Consistent PrefixUpdates returned are some prefix of all the updates, with no gaps
EventualEventual

四、小结

一致性模型最重要的还是需要结合具体的场景、业务需求,到底在延迟、吞吐、数据一致性等方面最大的诉求的是什么,从而选择合适的一致性级别。甚至业务设计时需要提前做好业务。整体:技术服务于场景

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java作业四

要求&#xff1a;编写带图形界面的聊天程序&#xff0c;实现让客户可以持续地发送消息给服务器&#xff0c;服务器也可以即时看到客户端发送的消息&#xff0c;并回消息给客户端。 程序运行界面如下&#xff1a; 老师写的&#xff1a; 1、客户端 package Demo02; import java.…

Redis面试题:Redis的数据过期策略有哪些?

目录 面试官&#xff1a;Redis的数据过期策略有哪些 ? 惰性删除 定期删除 面试官&#xff1a;Redis的数据过期策略有哪些 ? 候选人&#xff1a; 嗯~&#xff0c;在redis中提供了两种数据过期删除策略 第一种是惰性删除&#xff0c;在设置该key过期时间后&#xff0c;我们…

避免客户开发信被限制的方法与策略

开发信是外贸或者出海企业常用的一种开发客户的方式。相较于其他的获客方式&#xff0c;开发信能够更加精准地投放到客户中&#xff0c;并且只需承担较低的成本。但是&#xff0c;由于一些限制管制要求&#xff0c;外贸人员可能会遇到开发新被限制的情况。今天&#xff0c;小编…

五大自动化测试的 Python 框架

1、Selenium: Selenium 是一个广泛使用的自动化测试框架&#xff0c;用于测试Web应用程序。它支持多种浏览器&#xff0c;并通过模拟用户在浏览器中的操作来进行测试。Selenium 的 Python 客户端库是 Selenium WebDriver&#xff0c;它提供了一组API来编写测试脚本&#xff0c…

SpringBoot校验List失效解决方法

文章目录 SpringBoot校验List失效解决方法附&#xff1a;校验基本数据类型和String类型的方法参数时也需要在类上加Validated SpringBoot校验List失效解决方法 失效场景示例代码&#xff1a; RestController RequestMapping("/v1/jx/flowSummary") Slf4j public cl…

【Hadoop】分布式文件系统 HDFS

目录 一、介绍二、HDFS设计原理2.1 HDFS 架构2.2 数据复制复制的实现原理 三、HDFS的特点四、图解HDFS存储原理1. 写过程2. 读过程3. HDFS故障类型和其检测方法故障类型和其检测方法读写故障的处理DataNode 故障处理副本布局策略 一、介绍 HDFS &#xff08;Hadoop Distribute…

itop4412移植lrzsz工具踩坑笔记

4412开发板在传输文件一直用的都是tftp文件传输&#xff0c;但这样效率有点慢&#xff0c;平常在linux上习惯用lrzsz工具来传输文件&#xff0c;特此记录下&#xff0c;因为不熟悉linux编译 踩坑了很多地方 在操作前 我们的虚拟机要线安装好编译环境 下载lrzsz源码&#xff0…

轻松实现文件按数量平均分类,高效整理并自动新建文件夹保存“

你是否曾经因为文件数量过多&#xff0c;整理起来繁琐而感到烦恼&#xff1f;是否曾经为了新建文件夹而手动一个一个进行创建&#xff0c;费时又费力&#xff1f;现在&#xff0c;我们的智能文件管理工具将为你解决这些问题&#xff01; 首先第一步&#xff0c;我们要进入文件…

整顿国产剧流水线“村花”?给三次元一点小小的美女震撼!

演员部分不符合角色的形象就用配角来补充说明&#xff0c;在国产剧里&#xff0c;短时间出现了两次。 演员的美从直观的肉眼可见&#xff0c;变成了配角用台词传达的结果。 &#xff08;图&#xff1a;宁安如梦&#xff09; 就像《以爱为营》里&#xff0c;女主的闺蜜随口就是…

【李宏毅-元学习】

一、基本概念 1、元学习&#xff1a;学习如何学习&#xff0c;超参数调整 2、机器学习和元学习 机器学习&#xff1a;定义函数&#xff08;未知参数&#xff09;-定义损失函数-优化&#xff08;最小化损失函数&#xff09; 3、什么是元学习 机器学习通过三个步骤找到了学习算…

Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式

By: Ailson Jack Date: 2023.11.26 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/165.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

数据库基础教程之数据库的创建(二)

双击打开Navicat,点击:文件-》新建连接-》PostgreSQL 在下图新建连接中输入各参数,然后点击:连接测试,连接成功后再点击确定。 创建数据表   3.1 方法1   3.1.1.双击你的数据库-》双击public-》双击选中表-》右键-》新建表-》常规 3.1.2.设置字段信息   双击选中创建…

Leetcode 1727. 具有重排的最大子矩阵

题目要求&#xff1a; 给定一个大小为 m x n 的二进制矩阵&#xff0c;并且允许您以任意顺序重新排列矩阵的列。 对列进行最佳重新排序后&#xff0c;返回矩阵中每个元素都为 1 的最大子矩阵的面积。 输入&#xff1a;矩阵 [[0,0,1],[1,1,1],[1,0,1]] 输出&#xff1a;4 说明…

【领域驱动设计 学习目标及大纲】从CRUD到架构设计

从2018年至今&#xff0c;已工作了5年有余&#xff0c;回望这5年的工作历程&#xff0c;虽然一直在学习、一直在积累&#xff0c;但其实都在术的层面上停留&#xff0c;也就是具体的技术点。这5年多的时间里其实也不是没有窥道的想法&#xff1a; 一次是2018年刚工作的时候&am…

理解国外大佬用Web做出来跨窗口渲染动画效果

今天刷抖音看见国外一个大佬用Web做出来一个可以跨多浏览器窗口实时互动的渲染动画效果,觉得非常新奇,我就去看了一下源码,作者还写了一个非常好的例子帮助理解,我自己也仿写了作者的例子加深理解 **GitHub预览地址**麻烦帮忙点亮星星谢谢哈哈哈~ 整体思路是监听visibilityStat…

hdlbits系列verilog解答(exams/m2014_q4f)-47

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 实现以下电路&#xff1a; 二、verilog源码 module top_module (input in1,input in2,output out);assign out in1 & (~in2);endmodule三、仿真结果 转载请注明出处&#xff01;

java Swing UI设置统一字体大小

编写一个遍历组件设置字体大小的方法 public static void setUIFont() {Font f new Font("宋体", Font.PLAIN, 18);String names[] {"Label", "CheckBox", "PopupMenu", "MenuItem", "CheckBoxMenuItem", &quo…

函数的防抖与节流

一、函数防抖 &#xff08;一&#xff09;防抖的理解 防抖就是将所有的触发都取消&#xff0c;在规定的时间结束过后才会执行最后一次&#xff0c;也就是说连续快速的触发只会执行最后一次结果。 也可以理解为游戏里的回城按钮&#xff0c;每点一下就会重新刷新回城进度&…

java学习part13Object类和常用方法

1.Object 2.常用方法 2.1clone() clone()就是深拷贝&#xff0c;创建一个同内容新对象。需要实现接口 2.2finalize()已废弃 类似于析构函数&#xff0c;在GC回收之前调用。 System.gc()强制调用gc&#xff0c;然后就能看到finalize()的输出 2.3equals() 对于引用类型可用。…

WIFI模块(esp-01s)获取网络时间与天气信息

目录 一、硬件连接 二、获取网络时间 1、AT指令集 2、具体操作 三、获取天气信息 1、心知天气注册 2、AT指令集 3、具体操作 4、json格式检查 一、硬件连接 WiFi模块的RX连接TTL模块的TX&#xff0c; WiFi模块的TX连接TTL模块的RX&#xff0c;电源与地接对。 插入电脑…