database - 写入 MongoDB 的多个副本
问题描述
假设我有一个写入数据库的分布式应用程序。为了减少延迟,其中一个实例(应用程序 + 数据库)托管在澳大利亚,另一个实例托管在欧洲。两个数据库实例需要共享相同的数据。
所以我们在这里追求的是数据局部性。原因很明显:我们不希望澳大利亚的用户向我们在欧洲的数据库发送请求,因为这会增加延迟。
自然的选择是将两个数据库实例部署在一个副本集中。但似乎使用 MongoDB,您只能写入副本集中的一个 Mongo 实例。
MongoDB 有什么策略可以让两个数据库实例共享相同的数据,您可以写入这些实例?或者 MongoDB 只是这个要求的错误选择?
解决方案
巨大的主题,但我会尽量给你一个简短的答案:
由于您的两个实例必须共享相同的 sata,因此您不能将分片集群与 zone 一起使用。但是副本集可以成为您的解决方案:
创建至少包含以下内容的副本集:
位于“中立”区域的服务器。它将是主服务器(设置更高的优先级)。这个服务器,只要它仍然是主要的,就会处理你的写操作。
您现有的两个优先级较低的服务器。
在您的应用程序中将读取首选项设置为“最近”。这样,无论服务器的主/从角色如何,您的读取操作都将由具有割草机网络延迟的服务器处理。
但我强烈建议您查看文档,了解如何正确部署此架构。这是一个好的开始
编辑
关于这个解决方案的一些考虑:
此用例是最好从辅助设备中读取的罕见用例之一。一般来说,更喜欢从 MASTER 读取数据,因为副本集是为了高可用性而不是可伸缩性而完成的。
如果您的某些数据可以“定位”以便更快地访问,请考虑将分片集合作为更好的解决方案
推荐阅读
- docker - 如何在部署时运行 docker-compose up
- javascript - Chrome 79 for Windows 中的 Javascript Profiler:自拍时间包括什么?
- amazon-web-services - 如何使用 boto3 创建磁盘利用率 cloudwatch 警报
- c# - 如何使用动作委托来避免 if else
- android - 为什么屏幕方向锁定不起作用
- sql-server - 使用 SQL Server 序列进行计算,即发票编号
- android - 使用 JsonObject 从资源中读取 JSON 文件
- git - 将一组给定的文件提取到存储库
- html - 如何使我的 Bootstrap 4 导航栏下拉全宽?
- javascript - 如何从视图中将数据扔到主 App.vue?