多个SQL / NoSQL数据库体系结构中的一致性/原子性(甚至ACID)属性

时间:2014-02-19 16:50:34

标签: sql database architecture nosql acid

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

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

  1. 保持简单。
  2. 搜索引擎有时可能会落后。你可以打它。你可以接受它。这很好,大部分时间都可以接受。
  3. 不要混合数据。如果您使用Redis进行会话 - 很好。不要将数据库A中的东西存储在B中,反之亦然。
  4. 为您的超级重要商业数据™选择具有ACID和强一致性的适当数据库。
  5. 同样,不要混合数据。

答案 1 :(得分:2)

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

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

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