我经常听到关于NoSQL,数据网格等不同演讲的最终一致性.似乎最终一致性的定义在许多来源中有所不同(甚至可能取决于具体的数据存储).
任何人都可以简单解释一般情况下的最终一致性,与任何具体的数据存储无关吗?
我有一个相当简单的域模型,涉及Facility
聚合根列表.鉴于我正在使用CQRS和事件总线来处理从域引发的事件,您如何处理集合上的验证?例如,假设我有以下要求:
Facility
必须有一个独特的名字.由于我在查询端使用最终一致的数据库,因此在事件处理或处理事件时,其中的数据不能保证准确.
例如,a FacilityCreatedEvent
在查询数据库事件处理队列中等待处理并写入数据库.将新的CreateFacilityCommand
内容发送到要处理的域.域服务查询读取数据库以查看是否Facility
已经注册了具有该名称的任何其他数据库,但返回false,因为CreateNewFacilityEvent
尚未处理并写入存储.新的CreateFacilityCommand
将成功并抛出另一个FacilityCreatedEvent
当事件处理器尝试将其写入数据库并发现另一个Facility
已存在该名称时会爆炸.
为了将Dynamodb用于其中一个项目,我对dynamodb的强一致性模型存在疑问.来自常见问题解答
强大的一致性读取 - 除了最终的一致性之外,如果您的应用程序或应用程序的一个元素需要,Amazon DynamoDB还可以为您提供灵活性和控制权,以请求强一致性读取.强一致性读取返回一个结果,该结果反映了在读取之前收到成功响应的所有写入.
从上面的定义,我得到的是强一致读取将返回最新的写入值.
举个例子:假设Client1在Key K1上发出一个写命令,将值从V0更新为V1.在几毫秒之后,Client2发出Key K1的读命令,然后在强一致性的情况下,将始终返回V1,但是在最终一致性的情况下,可以返回V1或V0.我的理解是否正确?
如果是,如果写入操作返回成功但数据未更新到所有副本并且我们发出强一致性读取怎么办?如何确保在这种情况下返回最新写入值?
以下链接 AWS DynamoDB在写入一致性后读取 - 它在理论上如何工作?试图解释这背后的架构,但不知道这是否真的有效?通过此链接后我想到的下一个问题是:DynamoDb是基于单主机,多从机架构,其中写入和强一致性读取是通过主副本,而正常读取是通过其他.
consistency eventual-consistency amazon-web-services amazon-dynamodb
Elasticsearch没有"读一致性"参数(如Cassandra).但它具有" 写一致性 "和" 读取偏好 ".
文档说明了关于写一致性的以下内容
写入一致性
为了防止写入发生在网络分区的"错误"端,默认情况下,只有当仲裁(> replicas/2 + 1)活动分片可用时,索引操作才会成功.可以使用action.write_consistency设置逐个节点地覆盖此缺省值.要更改此操作的每个操作,可以使用一致性请求参数.有效写入一致性值是一个,仲裁和所有.
注意,对于副本数量为1(总共2个数据副本)的情况,如果1个副本(主要副本)可以执行写入,则默认行为是成功的.
索引操作仅在复制组中的所有活动分片已将文档编入索引(同步复制)后才返回.
我的问题是关于最后一段:
索引操作仅在复制组中的所有活动分片已将文档编入索引(同步复制)后才返回.
如果write_consistency=quorum
(默认)和所有分片都是活动的(没有节点故障,没有网络分区),那么:
1)一旦分片的法定数量完成索引,索引操作是否会立即返回?(即使所有分片都是活动/活动的)
2)或者当所有实时/活动分片完成索引时,索引操作是否会返回?(即仅在出现故障/超时的情况下才考虑仲裁)
在第一种情况下 - 读取可能是最终一致的(可能会得到陈旧的数据),写入更快.
在第二种情况下 - 读取是一致的(只要没有网络分区),写入速度较慢(因为它等待较慢的分片/节点).
有谁知道它是如何工作的?
我想知道的另一件事 - 为什么' preference'param(在get/search请求中)的默认值是,randomized
但是没有 _local
(我想这一定是效率更高)
我正处于设计应用程序的早期阶段,该应用程序必须具有高可用性和可扩展性.出于多种原因,我想为此使用最终的一致性数据模型.我知道并理解为什么这是许多解决方案不受欢迎的架构选择,但在我的案例中这很重要.
我正在寻找真实世界的建议,最佳实践以及在处理分布式/文档式数据库时需要注意的问题.尤其是电子商务(购物车风格)应用程序周围的区域,传统上更容易与关系数据库组合在一起.
我知道使用这些类型的数据库具有挑战性,但是嘿,Google和E-bay使用它们所以它们不能那么难;-)任何建议都会受到赞赏.
亚马逊文档(http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel)声明:
"Amazon S3为所有地区的S3存储桶中的新对象的PUTS提供了写后读写一致性,但有一点需要注意."
忽略警告,这意味着在PUT之后为新对象发出GET的客户端可以保证获得正确的结果.我的问题是,如果GET是从不同的客户端而不是PUT的那个客户端发出的,那么保证是否也适用(当然,假设GET按照时间顺序跟随PUT)?换句话说,读写后一致性只是读写一致性还是适用于所有客户端?
我怀疑答案是它在全球范围内有效,但无法找到明确的答案.
使用分布式和可扩展的体系结构时,通常需要最终的一致性.
从图形上看,如何处理这种最终的一致性?
用户习惯于单击保存,并立即查看结果...最终的一致性是不可能的.
如何处理这种场景的GUI?
请注意,该问题适用于桌面应用程序和Web应用程序.
PS:我正在使用微软平台,但我想这个问题适用于任何技术......
我有一个应用程序:
我注意到,当应用程序启动时,即使它们在应用程序关闭(干净地)上一次运行时没有过时,索引也都会暂时失效.
例如,我运行应用程序,插入10条记录,并等待索引是最新的.我查询它并查看我期望的结果.然后我关闭应用程序,再次启动它,并查询,我没有得到任何结果.一秒钟之后,索引已经更新,我现在可以得到结果.如果我重复这个,有时我会得到10个结果,有时会得到0个结果,有时会得到2个结果
我的假设是,当在时间T查询索引时,我总是会在T + 1看到"至少一致"的结果.但是如果服务器在此期间重新启动,我似乎看到在T + 1处的结果不太一致.这不是最终的一致性,它最终是不一致的!:)
我的问题是:
我们在项目中使用Amazon S3作为客户上传文件的存储空间.
出于技术原因,我们使用临时名称将文件上载到S3,然后处理其内容并在处理完文件后重命名该文件.
虽然重命名404 (key not found)
的文件已成功上传,但"重命名"操作会一次又一次失败并出错.
亚马逊文档提到了这个问题:
Amazon S3通过在亚马逊数据中心内的多个服务器上复制数据来实现高可用性.如果PUT请求成功,则会安全地存储您的数据.但是,有关更改的信息必须在Amazon S3上复制,这可能需要一些时间,因此您可能会观察到以下行为:
我们实现了一种轮询作为解决方法:重试"重命名"操作,直到成功为止.
投票在20秒后停止.
此解决方法适用于大多数情况:文件在几秒钟内复制.
但有时 - 很少 - 20秒是不够的; S3中的复制需要更多时间.
在Amazon S3上成功进行PUT操作和完全复制之间观察到的最长时间是多少?
Amazon S3是否提供了"绕过"复制的方法?(直接查询'master'?)
replication amazon-s3 eventual-consistency amazon-web-services
我正在考虑针对当前项目的noSQL解决方案,但我对许多这些数据库中的"最终一致性"条款犹豫不决.最终的一致性是否与处理复制滞后的mySQL数据库不同?我过去使用的一种解决方案是使用滞后复制,即在需要立即数据一致性时从主机读取.
但是,我很困惑为什么关系数据库声称具有强大的数据一致性.我想我应该使用交易,这将给我强烈的一致性.假设mySQL复制可能滞后,那么编写应用程序是一个好习惯吗?
amazon-s3 ×2
cqrs ×2
replication ×2
consistency ×1
couchdb ×1
data-storage ×1
database ×1
distributed ×1
mysql ×1
nosql ×1
ravendb ×1
validation ×1