提问者:小点点

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


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

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

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

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

  • 每次检查该值是否已保存在所有数据库中?
  • 如果失败,恢复以前的状态?但是在一些非关系型数据库中没有事务/ACID机制,所以我不能很容易地恢复以前的状态。

另外,如果多个数据库必须保持同步,有没有什么好的做法,比如添加某种版本元数据(无论是时间戳还是自制的递增版本号),这样你就可以让你的数据库恢复同步?(不是在谈论内置的CouchDB!)

此外,数据库并不都是原子更新的,所以有些部分在短时间内是不一致的。我认为这取决于应用程序的业务,但是有人想过我发生的问题或者解决这个问题的方法吗?我想这一定很难,并且取决于很多配置(可能只有很少的真正好处)。

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


共2个答案

匿名用户

  1. 保持简单。
  2. 搜索引擎有时会落后。你可以与之抗争。你可以拥抱它。没关系,大多数时候是可以接受的。
  3. 不要混合数据。如果您将Redis用于会话-很好。不要将数据库A中的内容存储在B中,反之亦然。
  4. 为您的超级重要业务数据™®选择具有ACID和强一致性的适当数据库。
  5. 同样,不要混合数据。

匿名用户

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

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

当您无法避免跨多个DBMS的冗余和关系时,您应该决定将一个系统作为可信单一数据源(最好是您在一致性方面最信任的系统)。当系统之间存在不一致时,应该通过将数据与SSOT同步来解决。