我习惯于单独使用一个数据库(比如PostgreSQL或ElasticSearch)。但是目前我在原型应用程序中混合使用(PG和ES),并且可能会在混合中加入其他类型的数据库(例如:redis)。
假设某些数据需要以不同的方式持久化到每个数据库中。如果其中一个组件/数据库发生故障,您如何保持系统一致?
我面临的示例场景:PostgreSQL上的数据更新,ElasticSearch不可用。此时,系统不一致,因为我应该更新两个数据库。由于我使用的是SQL数据库,我可以简单地中止事务以使系统处于先前的一致状态。
但是保持系统一致性的最好方法是什么?
另外,如果多个数据库必须保持同步,有没有什么好的做法,比如添加某种版本元数据(无论是时间戳还是自制的递增版本号),这样你就可以让你的数据库恢复同步?(不是在谈论内置的CouchDB!)
此外,数据库并不都是原子更新的,所以有些部分在短时间内是不一致的。我认为这取决于应用程序的业务,但是有人想过我发生的问题或者解决这个问题的方法吗?我想这一定很难,并且取决于很多配置(可能只有很少的真正好处)。
我想这可能是一个常见的架构问题,但是我很难找到关于这个主题的信息。
在一个产品中使用多种数据库技术是一个不应该轻率做出的决定。你使用的技术越多,你的项目在开发、部署、维护和管理方面就会变得越复杂。此外,每一种数据库技术都将成为一个单独的故障点。这意味着坚持一种技术通常要明智得多,即使这意味着你需要做出一些妥协。
但是当您有充分的理由使用多个DBMS时,您应该尽量将它们分开。避免将相关数据跨多个数据库放置。如果可能,任何功能都不应该需要多个DBMS才能工作(最好DBMS的故障只会影响使用它的那些功能)。还应该避免在两个不同的DBMS中存储冗余数据。
当您无法避免跨多个DBMS的冗余和关系时,您应该决定将一个系统作为可信单一数据源(最好是您在一致性方面最信任的系统)。当系统之间存在不一致时,应该通过将数据与SSOT同步来解决。