database - 跨区域/区域保持数据库同步(写入/更新后)
问题描述
我必须在 php 中编写一个 web 服务来服务于三个不同的区域/(城市或国家)。每个区域都有自己的机器来运行这个 Web 服务实例,每个 Web 服务后面都是一个数据库,在每个区域中都是精确克隆/复制的,Web 服务使用来自 db 的数据为客户端提供服务。多个 Web 服务实例的主要原因是分配客户端负载。
客户端可以通过 Web 服务 API 进行读写调用。写入调用将修改该实例的数据库,但必须尽快将此更改应用于其他区域中的所有数据库,因为每个区域中的所有数据库都是克隆和精确副本,因此必须同步一个数据库中的所有更改其他区域的数据库。
我认为写调用必须转到某种主服务器,该服务器在所有 Web 服务等之间进行协调。但我确信这种模式很常见,并且已经有一些解决方案。
请告知是否有任何数据库或应用程序级别的技术可以在有写入调用时保持数据库同步,以便修改或添加反映在 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
同步 Master-Master 复制会很慢,尤其是在多区域场景中,因此您可以考虑其他技术:
- 异步复制
- 分片/分区
- 分片和复制的混合
有一本关于不同分布式技术(包括分片和复制)的非常好的书 - Martin Kleppmann 的“设计数据密集型应用程序”。
推荐阅读
- javascript - 承诺不提供堆栈跟踪
- docker - 将 Docker 容器部署到 Cloud Foundry 时,MQTT 端口连接被拒绝
- java - 当片段中的recyclerview滚动时CollapsingToolbarLayout不折叠
- iis - http2 请求返回 - http 错误 400。请求动词无效
- pytorch - pytorch中张量torch.Size([])和torch.Size([1])的形状差异
- javascript - 当添加或删除子/孙组件时,如何在 React 中判断?
- c# - 如何从另一个线程更改当前显示的窗口?WPF
- python - 如何在按下按钮之前不断更新 tkinter 标签?
- javascript - 使用 Reducer 从数组中删除所有项目 - React
- wordpress - 在手动更新产品之前,产品数据更新无效 - woocommerce