假设中间层服务器是 3 路复制的,后端数据库(MySQL、PostgreSQL 等)是 3 路复制的。用户请求最终会在中间层服务器中创建一些用户数据,我想以一种对故障有弹性的方式将其提交给后端数据库。
一个候选尝试解决方案,例如,如果我将数据发送到一个 SQL 数据库并让它将数据复制到其他数据库,那么如果一个 SQL 数据库在它可以复制数据之前发生硬盘崩溃,则数据将丢失。
在实际现实世界中使用的容错的最佳实践解决方案是什么。
假设中间层服务器是 3 路复制的,后端数据库(MySQL、PostgreSQL 等)是 3 路复制的。用户请求最终会在中间层服务器中创建一些用户数据,我想以一种对故障有弹性的方式将其提交给后端数据库。
一个候选尝试解决方案,例如,如果我将数据发送到一个 SQL 数据库并让它将数据复制到其他数据库,那么如果一个 SQL 数据库在它可以复制数据之前发生硬盘崩溃,则数据将丢失。
在实际现实世界中使用的容错的最佳实践解决方案是什么。
许多数据库都可以选择集群,作为您所描绘的需求的开箱即用解决方案。我强烈建议使用开箱即用的解决方案,而不是自己动手——这种解决方案存在一些你不想自己解决的讨厌的问题。
一个典型的例子是主键——如果你有 3 个后端服务器可以从中间件服务器接收“在表 x 中创建新记录”指令,并且你想要复制数据,你必须确保没有冲突主键。如果您使用整数作为主键数据类型,则必须确保 db server 1 不会创建 ID 为 1 的客户记录(如果该 ID 已用于服务器 2 上的记录)。这不是一个不可能的挑战 - 但您很容易花费几周时间来构建和测试解决方案。
您需要考虑的另一件事是在数据库中断的情况下您的应用程序可以离线多长时间 - 完全没有中断,几分钟、几小时或几天。中断窗口越短,集群解决方案需要的成本和复杂度就越高。