database - 分布式 (NoSQL) 数据库中的一致性效应

标签 database consistency acid eventual-consistency nosql

每当我阅读有关 NoSQL 分布式数据库的内容时,他们都会提到 CAP 定理,这意味着在分区系统中,您可以拥有完全一致性、完全可用性或两者兼而有之,但绝不能完全兼顾。

我不太清楚他们在谈论什么类型的一致性:

  1. 是否是数据新鲜度的一致性,一些客户可能获得比其他客户更旧的数据?
  2. 或者从事务可能仅部分完成并且这可能使数据处于不一致状态的意义上来说,它是一致性吗?

第二种解释对我来说听起来很危险,而且不太能接受。第一种解释听起来可以接受,但您如何才能防止请求一组数据的客户端没有得到部分过时的数据和部分新鲜的数据?

只提供部分一致性有多危险?可能的负面影响是什么?

最佳答案

分布式数据库中的一致性是一个巨大的问题,它意味着您的两种选择:某些地方的陈旧数据和部分完成的事务。我不打算写一篇关于它的文章,因为它一个大问题,而且解决方案并不容易。但是,这里有一些关键短语。

Eventual Consistency 是解决此问题的方法,但实现它听起来像是一项艰巨的任务。实现的关键是幂等消息。假设一个完整的事务涉及更新机器 A、B 和 C 上的数据。您实际上是如何做到的?您开始四处发送消息,并一直发送,直到收到确认接收和成功处理为止。您可以将消息发送给 B 两次,因为 B 从未收到消息,或者因为 B 的 ack 从未收到。如果你发送了两次因为你没有收到 ack,那么 B 最好在它再次收到它时做正确的事情(这可能是忽略它),并向你发送一个 ack 这样你就不再打扰它了。

This is a pretty good article ,它看起来像,而且从 NoSQL 的角度来看也是如此。任何搜索引擎中都隐藏着大量关于幂等消息的链接,所以我会让你四处寻找。

最后说明:在分布式数据库领域工作多年的 Pat Helland(在 Microsoft 和 Google 等公司)最终得出结论,分布式数据库的一致性是不可能的,你最好通过幂等来满足最终一致性消息。

关于database - 分布式 (NoSQL) 数据库中的一致性效应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26889813/

相关文章:

java - Cassandra 写入后读取与 LOCAL_QUORUM 不一致

iphone - 在 xcode 中计算并存储一个值

database - 快速只读嵌入式 "database"?

java - Hibernate:没有 SQL 字符串的查询?

java - Java中的弧线一致性,实现问题

azure - 具有 session 一致性的 Cosmos DB 能否保证排序

mysql数据按地域分片

php - 在同一 MySQL 事务中删除后数据仍然可见

transactions - ArangoDB 事务 - 如何防止抛出异常

sql - 在具有不同名称的列上连接表但在结果中产生单列