当我尝试理解CAP中的"可用性"(A)和"分区容差"(P)时,我发现很难理解各篇文章中的解释.
我觉得A和P可以在一起(我知道事实并非如此,这就是我无法理解的原因!).
用简单的术语解释,A和P是什么以及它们之间的区别?
为了将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
在Python,find和index非常相似的方法,用于查找值序列类型.find用于字符串,而index用于列表和元组.它们都返回找到所提供参数的最低索引(最左边的索引).
例如,以下两个都将返回1:
"abc".find("b")
[1,2,3].index(2)
Run Code Online (Sandbox Code Playgroud)
然而,我有点困惑的一点是,即使这两种方法非常相似,并且几乎完全相同的角色,只是针对不同的数据类型,它们对于尝试查找不在序列中的某些内容有非常不同的反应.
"abc".find("d")
Run Code Online (Sandbox Code Playgroud)
返回-1,表示"未找到",而
[1,2,3].index(4)
Run Code Online (Sandbox Code Playgroud)
提出异常.
基本上,为什么他们有不同的行为?有没有特别的原因,或者只是一个奇怪的不一致而没有特别的原因?
现在,我不是在问这个问题 - 很明显,try/ exceptblock或条件in语句都可行.我只想问一下,在这种特殊情况下使行为不同的理由是什么.对我来说,为了保持一致性,有一个特定的行为说没有找到会更有意义.
另外,我不是在问这个理由是否是一个好理由的意见 - 我只是好奇原因是什么.
编辑:有些人已经指出字符串也有一个index方法,就像index列表的方法一样,我承认我不知道,但这只是让我想知道为什么,如果字符串都有,列表只有index.
阅读Nathan Hurst的NoSQL系统视觉指南,他包括CAP三角形:
ConsistencyAvailibilityPartition Tolerance
SQL Server是一个AC系统,而MongoDB是一个CP系统.
这些定义来自加州大学伯克利分校教授埃里克·布鲁尔,以及他在PODC 2000(分布式计算原理)上的讲话:
可用性
可用性意味着 - 服务可用(完全运行或不运行).当您购买该书时,您希望获得回复,而不是某些关于该网站的浏览器消息是无法通信的.吉尔伯特和林奇在他们的CAP定理证明中提出了一个很好的观点,即当你最需要的时候,可用性最常让你失望 - 网站往往在繁忙的时期因为他们忙碌而瘫痪.可用但未被访问的服务对任何人都没有好处.
在MongoDB或BigTable的上下文中,系统不"可用"是什么意思?
你去连接(例如通过TCP/IP),服务器没有响应?您是否尝试执行查询,但查询永远不会返回 - 或返回错误?
不可用是什么意思?
我正在将我的应用程序从App Engine数据存储区移植到MongoDB后端,并对"文档更新"的一致性提出疑问.我知道一个文档的更新都是原子的和隔离的,但有没有办法保证它们在不同的副本集中"一致"?
在我们的应用程序中,许多用户可以(并且将会)在一次更新期间通过向其中插入一些嵌入文档(对象)来同时尝试更新一个文档.我们必须确保这些更新发生在所有副本逻辑一致的方式,即当一个用户"把"几嵌入文档到主文件,其他用户可以把自己嵌入文档的父文档中,直到我们确保他们已经阅读并收到第一个用户的更新.
所以我的意思是一致的是,我们需要一种方法来确保如果两个用户试图在一个文档进行更新恰好在同一时间,MongoDB中只允许这些更新要经过的一个,并丢弃另一个(或至少可以防止两者发生.我们不能在这里使用标准的"分片"解决方案,因为单个更新不仅仅包含增量或减量.
保证一个特定文档一致性的最佳方法是什么?
我工作的公司似乎总是在努力应对客户的服务器环境.
具体来说,我们几乎总是遇到测试服务器和生产服务器的问题,以及它们似乎总是以不同方式配置的事实.当我们测试我们开发的应用程序时,测试服务器以一种方式运行,因此我们调整和配置我们的应用程序以适应该特定行为.但是当我们在生产服务器上安装相同的应用程序时,我们会发现另一种与测试服务器不一致的行为,从而导致我们的调整和配置无效.最令人沮丧的是,这种情况一直在发生,似乎没有人知道如何处理它.
当然,我们大致了解为什么会发生这种情况.每个克隆环境都是以相同的方式开始,并且在前几天工作相同,但迟早有人只在一个服务器环境中重新配置某些东西(无论是数据库更新,组件库更新,Web文件更新,或其他配置),从而导致差异.随着时间的推移,越来越多的差异逐渐增大.但问题是:我们能做些什么呢?
我试过在网上搜索但是找不到任何关于该做什么的好答案.我也试图自己找出一些解决方案,但我的大部分想法在某些方面似乎都有问题.无论多么严谨,都可以规避新的惯例.定期克隆生产服务器以创建测试服务器是一个繁琐且通常非常缓慢的过程.自动复制并不总是可靠的甚至是可能的.那么我们应该对这个问题做些什么呢?我们如何保证测试时的体验与上线时的体验相匹配?
我想其他人也有这个问题.或者他们呢?也许只是我的特定公司不称职?有没有人遇到过这个问题?如果是这样,你做了什么?
此致
Linus,瑞典系统开发人员
synchronization consistency production-environment test-environments
这里有一个很好的讨论,关于使用Kingsby的Jesper库模拟Cassandra中的分区问题.
我的问题是 - 在Cassandra你主要关注CAP定理的分区部分,还是一致性是你需要管理的一个因素?
partitioning high-availability consistency cassandra cap-theorem
我正在阅读有关数据库的ACID属性.原子性和一致性似乎非常密切相关.我想知道是否有任何情况我们需要支持Atomicity但不支持Consistency,反之亦然.一个例子真的会有所帮助!
以前,DynamoDB仅提供"最终一致性",遵循CAP定理的"可用性"和"分区容差"部分.
但是现在,除了"最终一致性"之外,DynamoDB提供了"强一致性"选项.这是否意味着DynamoDB不遵循CAP定理?
consistency ×10
availability ×2
database ×2
mongodb ×2
nosql ×2
amazon ×1
atomicity ×1
bigtable ×1
cap-theorem ×1
cassandra ×1
concurrency ×1
find ×1
indexing ×1
key-value ×1
methods ×1
partitioning ×1
python ×1
sequential ×1