从微软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

四、小结

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

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

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

相关文章

Vite -构建优化 - 分包策略 + 打包压缩

什么是分包策略 分包策略 就是把不会常规更新的文件&#xff0c;单独打包处理。问 &#xff1a;什么是不会常规更新的文件&#xff1f; 答 &#xff1a; 就是基本上不会改的文件&#xff0c;比如我们引入的第三方的依赖包&#xff0c;例如 lodash工具包&#xff0c;这些工具包…

AI算法中的模型量化岗是做什么的

今天介绍一个在 AI 算法领域比较常见而且很重要的岗位——模型量化岗。 按惯例&#xff0c;先从某聘上截图一个量化工程师的招聘信息。 只看与量化相关的词&#xff0c;基本涉及到了量化精度、模型结构、算法这些关键词&#xff0c;下面来介绍一下这个岗位。 1、先看下什么是模…

An example of a function uniformly continuous on R but not Lipschitz continuous

See https://math.stackexchange.com/questions/69457/an-example-of-a-function-uniformly-continuous-on-mathbbr-but-not-lipschitz?noredirect1

五大自动化测试的 Python 框架

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

ElasticSearch02

ElasticSearch客户端操作 ElasticSearch 版本&#xff1a;7.8 学习视频&#xff1a;尚硅谷 笔记&#xff1a;https://zgtsky.top/ 实际开发中&#xff0c;主要有三种方式可以作为elasticsearch服务的客户端&#xff1a; 第一种&#xff0c;使用elasticsearch提供的Restful接口…

前端学习--React(4)路由

一、认识ReactRouter 一个路径path对应一个组件component&#xff0c;当我们在浏览器中访问一个path&#xff0c;对应的组件会在页面进行渲染 创建路由项目 // 创建项目 npx create router-demo// 安装路由依赖包 npm i react-router-dom// 启动项目 npm run start 简单的路…

小程序项目:springboot+vue基本微信小程序的电子书阅读器小程序

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

ArcGIS制作广场游客聚集状态及密度图

文章目录 一、加载实验数据二、平均最近邻法介绍1. 平均最近邻工具2. 广场游客聚集状态3. 结果分析三、游客密度制图一、加载实验数据 二、平均最近邻法介绍 1. 平均最近邻工具 “平均最近邻”工具将返回五个值:“平均观测距离”、“预期平均距离”、“最近邻指数”、z 得分和…

黑马点评Redis笔记

黑马点评Redis笔记 Redis基础篇&#xff1a;https://cyborg2077.github.io/2022/10/21/RedisBasic/ Redis实战篇&#xff1a;https://cyborg2077.github.io/2022/10/22/RedisPractice/ 一、手机号验证码注册登录 RandomUtil 生成定长随机数列 String code RandomUtil.ran…

4.一维数组——用数组处理求Fibonacci数列前20项

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 四、结果显示 前言 本系列为一维数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 用数组处理求Fibonacci数列前20项 二、题目分析 前两项&#xff1a;f[20]{1,1} 后18项&#xff1a;for(…

2022年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2022 年全国硕士研究生入学统一考试管理类专业学位联考数学试题一、问题求解&#xff1a;第 1∼15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分。下列每题给出的 A、B、C、D、E 五个选项中&#xff0c;只有一项是符合试题要求的&#xff0c;请在答&#xff0e;题…

1panel在应用商店里面安装jenkins

文章目录 目录 文章目录 前言 一、使用步骤 1.1 填写安装参数 1.2 在界面中进入容器拿到自动生成的jenkins密码 前言 一、使用步骤 1.1 填写安装参数 在应用商店里面搜索jenkins,然后点击安装 填写参数 1.2 在界面中进入容器拿到自动生成的jenkins密码 命令 cat /var/jenki…

Go 本地搭建playground

搭建go playground 的步骤 1、安装docker 如果你使用的Ubuntu&#xff0c;docker的安装步骤可以参见这里&#xff0c;这是我之前写的在Ubuntu18.04下安装fabric&#xff0c;其中有docker的安装步骤&#xff0c;这里就不再赘述了。 CentOS下安装docker的&#xff0c;可以参见…

《数据结构、算法与应用C++语言描述》-二叉树与其他树-二叉树的C++实现-设置信号放大器与并查集问题

二叉树和其他树 可编译运行程序见&#xff1a;Github::Jasmine-up/Data-Structures-Algorithms-and-Applications/_23BinaryTree 定义 树 定义 11-1 一棵树 t是一个非空的有限元素的集合&#xff0c;其中一个元素为根&#xff08;root&#xff09;&#xff0c;其余的元素&a…

04_MySQL备份与恢复

任务背景 一、真实案例 某天&#xff0c;公司领导安排刚入职不久的小冯同学将生产环境中的数据(MySQL数据库)全部导入到测试环境给测试人员使用。当小冯去拿备份数据时发现&#xff0c;备份数据是1个礼拜之前的。原因是之前运维同事通过脚本每天对数据库进行备份&#xff0c;…

51单片机蜂鸣器发出悦耳的声音

51单片机蜂鸣器发出悦耳的声音 1.概述 这篇文章介绍单片机控制蜂鸣器入门小实验&#xff0c;通过该实验掌握蜂鸣器发声的原理&#xff0c;控制声音发出我们想听的音乐。 2.蜂鸣器发声 2.1.硬件原理 1.蜂鸣器正极接单片机20号引脚VCC&#xff0c;负极接19号引脚P1.7 2.20MH…

【数据处理】 -- 【两分钟】了解【最好】的方式 -- 【正则表达式】

直接匹配&#xff1b; 普通字符 元匹配&#xff1a; . 任意单字符 r’表示单引号里字符为其特殊含义&#xff0c;比如.不是句号是匹配符的意思 *任意次数&#xff08;换行结束&#xff09; 一次及以上 {3,4}指定次数,至少3次&#xff0c;最多4次|{3}固定4次 [\d.]单个任意…

Kotlin学习——kt里的作用域函数scope function,let,run,with,apply,also

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

什么是分布式锁?Redis实现分布式锁详解

目录 前言&#xff1a; 分布式系统买票示例 引入redis做分布式锁 引入过期时间 引入校验id 引入lua脚本 过期时间续约问题 redlock算法 小结&#xff1a; 前言&#xff1a; 在分布式系统中&#xff0c;涉及多个主机访问同一块资源&#xff0c;此时就需要锁来做互斥控制…

【Java】线程池的简单实用

1、什么是线程池 Java当中&#xff0c;为了规避频繁创建调度进程的开销&#xff0c;我们引入了线程。但是如果进一步提高创建销毁频率&#xff0c;线程的开销也不容忽视。 对此我们有两个解决方案 协程&#xff08;轻量级线程&#xff09;&#xff1a;相比线程&#xff0c;把…