Azure CosmosDB (2) CosmosDB中的数据一致性
《Windows Azure Platform 系列文章目录》
为了保证分布式数据库的高可用性和低延迟性,我们需要在可用性、延迟和吞吐量之间进行权衡。
绝大部分的商业分布式数据库,要求开发人员选择两个极端的数据库一致性:强一致性(Strong Consistency)和最终一致性(Eventual Consistency)
强一致性(Strong Consistency)是数据库编程的黄金标准。但是却需要更高的延迟,且在故障期间可用性较低。
另一方面,最终一致性(Eventual Consistency)提供更高的可用性,和更好的性能,但是应用编程的难度很大。
Azure Cosmos DB 通过某种选择范围来实现数据一致性,而不会走两种极端。
虽然强一致性和最终一致性处于极端,但在整个范围中有许多一致性选择。 开发人员可以使用这些选项在高可用性或性能方面做出精确的选择和细致的取舍。
借助 Azure Cosmos DB,开发人员可以在一致性范围内从五个明确定义的一致性模型中进行选择。
从最强到最弱,这些模型为“Strong”、“Bounded Staleness”、“Session”、“Consistent Prefix”和“Eventual Consistency”。
模型定义明确且直观。 它们可用于特定的真实场景。 每个模型均提供可用性和性能权衡,并由综合 SLA 提供支持。 下图以范围区间形式显示了不同的一致性级别。
一致性级别与区域无关。 无论从哪个区域提供读取和写入、与 Azure Cosmos 帐户关联的区域数量是多少或帐户是配置了单个还是多个写入区域,所有读取操作都保证 Azure Cosmos DB 帐户的一致性级别。
与一致性级别关联的保证
Azure Cosmos DB 提供的综合 SLA 可保证 100% 的读取请求满足所选任何一致性级别的一致性保证。 如果满足与一致性级别关联的所有一致性保证,则读取请求满足一致性 SLA。
下面描述了5种一致性级别的描述:
Strong (强一致性): 强一致性保证读取操作,总是返回最新提交的版本。客户端永远不会看到未提交或者不完整的写入。始终保证用户读取最新提交的写入操作
Bounded Staleness: 读取操作(Read)可以晚于写入操作(Write) 最多K个版本,或者T个时间。如果我们选择Bounded Staleness,Staleness可以通过两种方式设置:
- 版本号K
- 读取操作可以滞后于写入操作的时间间隔 (T)
强一致性(Strong)的场景,和Bounded Staleness的概念类似,但是过期窗口(Staleness Windows)为0
当客户端在接受写入的区域中执行读取操作时,Bounded Staleness的一致性提供的保证与强一致性的保证相同。
Session(会话一致性):会话一致性的范围限制在客户端会话。
举个例子,假设我们支持多会话(Multi Session)的场景。其中一个客户端A对CosmosDB执行增删改查操作,那该客户端仅能看到自己提交的内容。
其他客户端B、C等,不能看到客户端A执行的操作结果
Consistent prefix(一致性前缀):返回的更新包含所有更新的一些前缀,不带间隔。 一致前缀保证读取永远不会看到无序写入
最终一致性(Eventual Consistency):不保证读取的顺序。 如果缺少任何进一步的写入,则副本最终会收敛。
接下来我们举个例子:
我们以棒球比赛为例。这场比赛目前处于第七局的中段。这是第七局的比赛。目前客队以2比5的比分落后。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 比分 | |
客队 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 2 | ||
主队 | 1 | 0 | 1 | 1 | 0 | 2 | 5 |
Azure CosmosDB保存主队和客队的比分。下表列出了使用五种不同的一致性情况下,读取主队和客队比分的情况。
一致性级别 | 说明 | 分数 |
Strong (强一致性) | 返回最新提交的版本 | 2-5 |
Bounded Staleness | 最多一个已过期的回合比分 | 2-3、2-4、2-5 |
Session(会话一致性) | 会话一致性的范围限制在客户端会话 |
|
Consistent prefix(一致性前缀) | 所有过去的写入操作 | 0-0、0-1、1-1、1-2、1-3、2-3、2-4、2-5 |
最终一致性(Eventual Consistency) | 不保证读取的顺序 | 0-0、0-1、0-2、0-3、0-4、0-5、1-0、1-1、1-2、1-3、1-4、1-5、2-0、2-1、2-2、2-3、2-4、2-5 |
如果大家有兴趣,可以参考这篇文章:https://www.microsoft.com/en-us/research/wp-content/uploads/2011/10/ConsistencyAndBaseballReport.pdf
Azure CosmosDB (2) CosmosDB中的数据一致性的更多相关文章
- Windows Azure 上 Linux VM 中的交换空间 – 第 2 部分
本文章由 Azure CAT 团队的 Piyush Ranjan (MSFT) 撰写. 在前一篇文章 Windows Azure 上Linux VM 中的交换空间第 1 部分中,我介绍了在默认情况下, ...
- 【Azure Developer - 密钥保管库 】使用 Python Azure SDK 实现从 Azure Key Vault Certificate 中下载证书(PEM文件)
问题描述 在Azure Key Vault中,我们可以从Azure门户中下载证书PEM文件到本地. 可以通过OpenSSL把PFX文件转换到PEM文件.然后用TXT方式查看内容,操作步骤如下图: Op ...
- 【Azure 环境】Azure Resource Graph Explorer 中实现动态数组数据转换成多行记录模式 - mv-expand
问题描述 想对Azure中全部VM的NSG资源进行收集,如果只是查看一个VM的NSG设定,可以在门户页面中查看表格模式,但是如果想把导出成表格,可以在Azure Resource Graph Expl ...
- Azure CosmosDB (13) CosmosDB数据建模
<Windows Azure Platform 系列文章目录> 我们在使用NoSQL的时候,如Azure Cosmos DB,可以非常快速的查询非结构化,或半结构化的数据.我们需要花一些时 ...
- 跟我学Windows Azure 四 Cloud Service中的WebRole与WorkRole,及他们之间的通信
Cloud Service 中WebRole就相当与我们的WebSite,而WorkRole相当与我们在服务器上写了个Windows Service,站在高可用的角度上来讲,Cloud Service ...
- Cassandra中的数据一致性
Cassandra中数据一致性指的是数据行在各个复制节点(replicas)上的更新和同步程度.通过提供tunable consistency,Cassandra扩展了eventual cons ...
- Azure开发者任务之四:在Azure SDK 1.3中挂载调试器的错误
我安装了Windows Azure SDK的1.3版本.我试着创建了一个Azure的“Hello World”应用程序. 我按了“F5”,然后我得到了下面这个错误: 我尝试了“Ctrl+F5”:不使用 ...
- 还原Azure DevOps Server (TFS)中误删除的生成流水线
流水线历史记录 DevOps Server流水线的历史记录有完善的版本日志,用户可以随时回退到修改过程中的任何一个版本,还能比较差异.这个历史记录功能可以和代码库中的版本控制媲美. 图一:生成历史记录 ...
- 在 Azure Resource Manager 模板中使用托管磁盘
本文介绍使用 Azure Resource Manager 模板预配虚拟机时托管与非托管磁盘之间的差异. 这有助于将现有模板从使用非托管磁盘更新为使用托管磁盘. 我们将使用 101-vm-simple ...
随机推荐
- Gerapy的简单使用
1. Scrapy:是一个基于Twisted的异步IO框架,有了这个框架,我们就不需要等待当前URL抓取完毕之后在进行下一个URL的抓取,抓取效率可以提高很多. 2. Scrapy-redis:虽然S ...
- Python — 字典dict 和 集合set
字典dict : dict和set的key都是不可变对象 对于不变对象来说,调用对象自身的任意方法,也不会改变对象自身的内容.相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可 ...
- SWUST OJ(957)
逆置单链表 #include <stdio.h> #include <stdlib.h> typedef struct LNode { char data; struct LN ...
- elinks快捷方式
突然有兴趣看看Linux下的字符模式的浏览器,搜了下有好几个,在Ubuntu里“添加/删除”里找到一个,叫Elinks,安装,然后在终端运行elinks,试用了一下,不错,使用方法也挺简单的,支持多标 ...
- <文档学习>AirSim/using_car.md Choosing Your Vehicle: Car or Multirotor
如何在AirSim中使用汽车 默认情况下,AirSim中使用的车型为多转子multirotor. 如果你想使用汽车,那么只需在你的settings.json(https://github.com/Mi ...
- python ----列表、字符串、元组之间转换小结
字符串转换列表 li =list("adfadfsf") #内部使用for循环 print(li) #输出结果:['a', 'd', 'f', 'a', 'd', 'f', 's' ...
- PHP有关守护进程,以及流程控制和信号处理函数
守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程.PHP也可以实现守护进程的功能. 1.基本概念 进程 ...
- Learn how to use git
Git配置 $ git config --global user.name "Your Name" $ git config --global user.email "e ...
- spring boot 添加客户端负载均衡
1.pom.xml文件中,添加依赖包 <dependency> <groupId>org.springframework.cloud</groupId> <a ...
- JavaWeb基础-servlet
Servlet简介 Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤: 1.编写一个Java类,实现s ...