You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Node.js实现MongoDB复制,完成AWS EC2与本地数据双向同步

前置准备:先解决本地与EC2 MongoDB的连通问题

同步功能的前提是两端数据库可互相访问,先排查解决之前的连通故障:

  • 确认EC2安全组入站规则开放27017(MongoDB默认端口),仅允许你的本地公网IP访问,不要开放0.0.0.0/0避免安全风险
  • 修改EC2上MongoDB配置文件mongod.conf,将bindIp参数从默认的127.0.0.1调整为0.0.0.0,或者追加你的本地公网IP,修改完成后重启Mongo服务:sudo systemctl restart mongod
  • 本地测试连通性:用Mongo shell执行mongo "mongodb://<EC2公网IP>:27017/<你的数据库名>" -u <数据库用户名> -p <数据库密码>,确认能正常登录后再进行同步配置。
使用mongo-sync实现双向同步的步骤

该工具基于NodeJS开发,需要先在运行同步脚本的环境安装NodeJS运行时。

1. 安装依赖

执行命令安装工具包:
npm install mongo-sync

2. 编写同步脚本

运行脚本的设备只要能同时访问本地Mongo和EC2上的Mongo即可,示例代码模板如下:

const MongoSync = require('mongo-sync');

// 配置两端数据库连接信息
const syncTask = new MongoSync({
  // 本地MongoDB配置
  local: {
    uri: 'mongodb://localhost:27017/本地数据库名',
    options: { useNewUrlParser: true, useUnifiedTopology: true }
  },
  // EC2远程MongoDB配置
  remote: {
    uri: 'mongodb://<EC2公网IP>:27017/远程数据库名',
    options: { useNewUrlParser: true, useUnifiedTopology: true }
  },
  // 指定要同步的集合,留空则同步当前库下所有集合
  collections: ['需要同步的集合1', '需要同步的集合2'],
  // 同步方向设为双向
  direction: 'both',
  // 冲突解决策略:latest代表以更新时间最新的版本为准,可选值还有local(优先本地)、remote(优先远程)
  conflictResolution: 'latest'
});

// 启动同步任务
syncTask.start()
  .then(() => console.log('双向同步已启动'))
  .catch(err => console.error('同步启动失败:', err));

// 监听同步事件和错误
syncTask.on('sync', (syncInfo) => {
  console.log(`集合${syncInfo.collection}同步完成,共同步${syncInfo.documents.length}条数据`);
});

syncTask.on('error', (err) => {
  console.error('同步过程出错:', err);
});

3. 注意事项

  • 如果你的MongoDB开启了身份验证,连接uri需要按照mongodb://用户名:密码@IP地址:端口/数据库名的格式填写
  • 首次启动同步前,建议对两端的数据库做全量备份,避免误操作导致数据丢失:mongodump -d <数据库名> -o <本地备份路径>
  • 工具默认会监听两端数据库的变更做实时增量同步,如果只需要定时同步,可以配合cron任务或者node-schedule库设置定时触发逻辑。

4. 验证同步效果

先往本地Mongo插入一条测试数据,确认EC2端的数据库能同步到对应记录,再往EC2端的数据库插入一条测试数据,确认本地库能同步到对应记录,验证双向同步生效。

内容的提问来源于stack exchange,提问作者user16412923

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:36:05