如何在两个数据中心设置具有双向写入功能的Mongo集群

35次阅读
没有评论

问题描述

计划将软件扩展到东南亚地区。Mongo集群已在中国的AWS数据中心完全设置好。用户想知道如何设置MongoDB复制集到AWS新加坡,并允许在两个地区进行写入,并依靠MongoDB在后台异步同步数据。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

目前,MongoDB不支持完全实现用户所需的功能。但是,可以通过以下方式实现部分功能:
1. 可以将一个MongoDB实例异步复制到多个只读副本。
2. 可以有两个可写实例,并将数据写入相同的集合,但不能同时在两个服务器上写入相同的文档。可以通过使用分片来实现这一点。但是每个服务器将只有一半的数据。
由于用户在AWS上,可以使用无服务器(serverless)来实现自己的数据同步器。这不是一个很好的解决方案,但可以完成工作。
假设在中国运行的MongoDB为mongo-cn,在新加坡运行的MongoDB为mongo-si,以下是实现步骤:
1. 第一步:在mongo-cn上启用复制集,这不会将数据复制到任何地方,但会创建oplog,允许您使用change streams。
2. 第二步:创建一个Fargate容器,该容器只有一个任务,即读取change stream并将所有写入发布到sqs-si。
3. 第三步:在sqs-si上创建一个lambda触发器,该触发器会为每个sqs消息运行,该lambda将获取sqs消息并将其写入mongo-si。
4. 第四步:停止mongo-cn,从mongo-cn创建一个AMI,清除sqs-si并重新启动mongo-cn。
5. 第五步:将mongo-cn的快照复制到新加坡,并将其作为mongo-si启动。
6. 现在,mongo-cn正在复制到mongo-si,现在需要创建第二个订阅者。
7. 第六步:创建第二个Fargate容器,订阅来自mongo-si的所有更改,并将这些更改发布到sqs-cn。
8. 第七步:在sqs-cn上创建一个lambda触发器,该触发器会为每个sqs消息运行,该lambda将获取消息并将其写入mongo-cn。
现在,您有两个可写的MongoDB实例在不同地区进行异步复制,您可以使用sqs进行缓冲写入,并使用cloudwatch和lambda触发器进行一些控制和日志记录。
请注意,如果两个地区同时决定写入相同的文档,则一致性将为零。
这不是一个很好的解决方案,但某些情况可能需要它。

方案2

使用脚本或工具来管理容器的启动顺序可能会增加复杂性,并且需要确保容器A和容器B之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制容器的运行顺序。您可以使用docker run命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。
以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:

#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用docker run命令启动容器A,并将其命名为container_a。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo命令来测试)。一旦容器A就绪,我们再使用docker run命令启动容器B,并将其命名为container_b

正文完