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