【发布时间】:2014-02-19 16:50:33
【问题描述】:
我更习惯于单独使用一个数据库(比如 PostgreSQL 或 ElasticSearch)。 但目前我在原型应用程序中使用混合(PG 和 ES),并且可能会在混合中加入其他类型的数据库(例如:redis)。
假设某些数据需要以不同的方式保存到每个数据库。 如果其中一个组件/数据库发生故障,您如何保持系统一致性?
我面临的示例场景: PostgreSQL 上的数据更新,ElasticSearch 不可用。 此时,系统不一致,因为我应该更新了两个数据库。 由于我使用的是 SQL 数据库,因此我可以简单地中止事务以将系统置于之前的一致状态。
但是保持系统一致的最佳方法是什么?
- 每次检查该值是否已持久保存在所有数据库中?
- 如果失败,恢复之前的状态?但是在一些 NoSQL 数据库中没有事务/ACID 机制,所以我不能轻易恢复到以前的状态。
另外,如果多个数据库必须保持同步,是否有任何好的做法,例如添加某种“版本”元数据(无论是时间戳还是自制递增版本号),以便您可以将数据库放回去同步中 ? (不是说内置的 CouchDB!)
此外,数据库并非全部自动更新,因此某些部分在短时间内不一致。我认为这取决于应用程序的业务,但有人对我发生的问题或解决方法有一些想法吗?我想这一定很困难,并且取决于很多配置(可能很少有真正的好处)。
我猜这可能是一个常见的架构问题,但我很难找到有关该主题的信息。
【问题讨论】:
标签: sql database architecture nosql acid