我必须用 php 编写一个网络服务来为三个不同的区域/(城市或国家)提供服务。每个区域都有自己的机器来运行此 Web 服务实例,每个 Web 服务背后都是一个数据库,该数据库是每个区域中的精确克隆/复制,Web 服务为客户端提供数据库中的数据。 Web 服务多个实例的主要原因是为了分散客户端负载。
客户端可以通过 Web 服务 API 进行读取和写入调用。 写入调用将修改该实例的数据库,但此更改必须尽快应用于其他区域中的所有数据库,而且每个区域中的所有数据库都是克隆和精确副本,因此一个数据库中的更改必须在所有数据库中同步其他可用区的数据库。
我认为写入调用必须发送到某种主服务器,该服务器在所有 Web 服务等之间进行协调。但我确信这种模式非常常见,并且已经存在一些解决方案。
请告知是否有任何数据库或应用程序级技术可以在有写入调用时保持数据库同步,以便修改或添加反射(reflect)在 db 的所有实例中?我可以选择自己选择的数据库,但主要选择是 mysql 服务器或 postgres,但可以更改为其他可以解决此问题的数据库。
最佳答案
你是对的,这种模式很常见,而且有一个名字——同步主主复制。大多数现代 RDBMS 支持它:
- PosgreSQL 通过 pg_cluster 支持它 https://wiki.postgresql.org/wiki/PgCluster
- MySQL https://www.howtoforge.com/mysql_master_master_replication
但在立即实现之前,我建议您阅读更多有关不同类型的复制及其优缺点的信息:
- https://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling
- https://dev.mysql.com/doc/refman/8.0/en/replication.html
同步主主复制会非常慢,尤其是在多可用区场景中,因此您可能会考虑其他技术:
- 异步复制
- 分片/分区
- 分片和复制的混合
有一本关于不同分布式技术(包括分片和复制)的非常好的书 - Martin Kleppmann 的《设计数据密集型应用程序》。
关于database - 跨区域/区域保持数据库同步(写入/更新后),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58399450/