sql - 多个 SQL/NoSQL 数据库架构中的一致性/原子性(甚至 ACID)属性

标签 sql database architecture nosql acid

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

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

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

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

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

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

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

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

最佳答案

  1. 保持简单。
  2. 搜索引擎有时会落后。你可以对抗它。你可以拥抱它。这很好,而且大多数时候是可以接受的。
  3. 不要混淆数据。如果您将 Redis 用于 session - 很好。不要将数据库 A 中的内容存储在 B 中,反之亦然。
  4. 为您的 Super Important Business Data™® 选择具有 ACID 和强一致性的适当数据库。
  5. 同样,不要混合数据。

关于sql - 多个 SQL/NoSQL 数据库架构中的一致性/原子性(甚至 ACID)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21886982/

相关文章:

java - Java JAR 文件是否类似于 .Net 程序集?

php - 从 URL 中的 $_GET 检索变量时 undefined index

c# - 存储 SSMS 加载项的 SSMS 查询/脚本的输出

mysql - 如何向包含数百万数据的表添加列

architecture - 敏捷和以架构为中心的软件开发有什么区别?

android - 允许在所有 CPU 上安装 apk,应用程序中只有一个 ARM 库

mysql - 使用带有内连接的 group by 时得到错误的总和

java - 如果我通过 phpMyAdmin 执行查询,它可以工作,但在我的 java 程序中却不能

php - 从mysql字符串返回特定数据

mysql - 如何在 web.config 文件的连接字符串中写入服务器名称