【问题标题】:Consistency/Atomicity (or even ACID) properties in multiple SQL/NoSQL databases architecture多个 SQL/NoSQL 数据库架构中的一致性/原子性(甚至 ACID)属性
【发布时间】:2014-02-19 16:50:33
【问题描述】:

我更习惯于单独使用一个数据库(比如 PostgreSQL 或 ElasticSearch)。 但目前我在原型应用程序中使用混合(PG 和 ES),并且可能会在混合中加入其他类型的数据库(例如:redis)。

假设某些数据需要以不同的方式保存到每个数据库。 如果其中一个组件/数据库发生故障,您如何保持系统一致性?

我面临的示例场景: PostgreSQL 上的数据更新,ElasticSearch 不可用。 此时,系统不一致,因为我应该更新了两个数据库。 由于我使用的是 SQL 数据库,因此我可以简单地中止事务以将系统置于之前的一致状态。

但是保持系统一致的最佳方法是什么?

  • 每次检查该值是否已持久保存在所有数据库中?
  • 如果失败,恢复之前的状态?但是在一些 NoSQL 数据库中没有事务/ACID 机制,所以我不能轻易恢复到以前的状态。

另外,如果多个数据库必须保持同步,是否有任何好的做法,例如添加某种“版本”元数据(无论是时间戳还是自制递增版本号),以便您可以将数据库放回去同步中 ? (不是说内置的 CouchDB!)

此外,数据库并非全部自动更新,因此某些部分在短时间内不一致。我认为这取决于应用程序的业务,但有人对我发生的问题或解决方法有一些想法吗?我想这一定很困难,并且取决于很多配置(可能很少有真正的好处)。

我猜这可能是一个常见的架构问题,但我很难找到有关该主题的信息。

【问题讨论】:

    标签: sql database architecture nosql acid


    【解决方案1】:
    1. 保持简单。
    2. 搜索引擎有时会落后。你可能会与之抗争。你可以拥抱它。没关系,而且大多数时候都可以接受。
    3. 不要混合数据。如果您使用 Redis 进行会话 - 很好。不要将数据库 A 中的内容存储在 B 中,反之亦然。
    4. 为您的 Super Important Business Data™® 选择具有 ACID 和强一致性的适当数据库。
    5. 同样,不要混合数据。

    【讨论】:

      【解决方案2】:

      在一种产品中使用多种数据库技术是一个不应该轻易做出的决定。您使用的技术越多,您的项目在开发、部署、维护和管理中就会变得越复杂。此外,每种数据库技术都将成为一个单独的故障点。这意味着坚持一种技术通常更明智,即使这意味着您需要做出一些妥协。

      但是当您有充分的(!)理由使用多个 DBMS 时,您应该尽量将它们分开。避免将相关数据放置在多个数据库中。如果可能,任何功能都不应需要多个 DBMS 才能工作(最好 DBMS 的故障只会影响使用它的那些功能)。还应避免在两个不同的 DBMS 中存储冗余数据。

      当您无法避免跨越多个 DBMS 的冗余和关系时,您应该选择一个系统作为 single source of truth(最好是您最信任的系统)。当系统之间存在不一致时,应通过与SSOT同步数据来解决。

      【讨论】:

      • 就我而言,需要 SQL 数据库,因为这是我用于强一致性保证 + 现有框架的主要数据库。但是,作为 ElasticSearch 的 NoSQL 解决方案为搜索提供了强大的功能。你碰巧知道关于这个主题的任何文献吗?感谢您的回答! (我希望我可以投票,但我什至没有 15 个声望!)
      • 在这里我可以投票给你!我希望在将问题标记为已回答之前会有其他答案,因为我认为这是一个可以说很多让恐惧有点可怕的话题!
      猜你喜欢
      • 2017-11-30
      • 2012-09-21
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      相关资源
      最近更新 更多