mongodb 内网与外网mongodb 实例数据同步


要在 Windows(内网)Ubuntu(外网) 的两个 MongoDB 实例之间建立 副本集(Replica Set),并实现数据同步,可以按照以下步骤进行操作:


总体思路

  1. 在 Windows 和 Ubuntu 上分别安装 MongoDB
  2. 使用 Docker 容器部署 MongoDB 实例。
  3. Windows 中的 MongoDB 为主节点(Primary)。
  4. Ubuntu 中的 MongoDB 为副节点(Secondary)。

  5. 配置副本集(Replica Set)

  6. 在两台服务器上启用副本集模式。
  7. 确保 Windows 可以通过内网访问外网的 Ubuntu 实例。

  8. 配置网络通信

  9. 为 Windows 提供到 Ubuntu 的网络访问(NAT 或 VPN)。
  10. 开放 Ubuntu 服务器的 MongoDB 端口。

  11. 同步副本集数据

  12. 启动副本集后,数据会自动从主节点同步到副节点。

详细步骤

1. 安装 MongoDB

Windows 上安装 Docker 并运行 MongoDB

  1. 安装 Docker
  2. 下载并安装 Docker Desktop(确保 Windows 上启用了 Hyper-V 或 WSL2)。
  3. 启动 Docker Desktop。

  4. 运行 MongoDB 容器bash docker run -d \ --name mongodb-primary \ -p 27017:27017 \ -v mongodb_data:/data/db \ mongo:latest --replSet rs0

Ubuntu 上安装 Docker 并运行 MongoDB

  1. 安装 Dockerbash sudo apt update sudo apt install -y docker.io

  2. 运行 MongoDB 容器bash docker run -d \ --name mongodb-secondary \ -p 27017:27017 \ -v mongodb_data:/data/db \ mongo:latest --replSet rs0


2. 启用副本集模式

Windows 主节点(Primary)配置

  1. 进入容器: bash docker exec -it mongodb-primary mongosh

  2. 初始化副本集: javascript rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "windows_internal_ip:27017" } // 替换为 Windows 内网 IP ] });

  3. 查看副本集状态: javascript rs.status();

Ubuntu 副节点(Secondary)配置

  1. 确保 Ubuntu 能访问 Windows 的 MongoDB:
  2. 在 Windows 中确认 Docker 容器的 IP 地址和 27017 端口已开放。
  3. 在 Ubuntu 上通过以下命令检查连通性: bash telnet windows_internal_ip 27017

  4. 进入容器: bash docker exec -it mongodb-secondary mongosh

  5. 将副节点添加到副本集中: javascript rs.add("ubuntu_public_ip:27017"); // 替换为 Ubuntu 外网 IP

  6. 查看副本集状态: javascript rs.status();


3. 配置网络通信

  1. Windows 到 Ubuntu 的网络访问
  2. 如果 Windows 和 Ubuntu 之间没有直接连通性,可以通过以下方法:

    • VPN:设置 VPN,将 Ubuntu 外网映射到 Windows 内网中。
    • NAT 转发:配置 Ubuntu 的公共 IP 或通过路由器设置端口转发,将 27017 暴露到外网。
  3. Ubuntu 上防火墙配置: 确保 MongoDB 的 27017 端口对 Windows 开放: bash sudo ufw allow 27017

  4. Docker 网络配置

  5. 如果 Docker 容器没有绑定到主机网络,请确保 MongoDB 容器的 27017 端口已经通过 -p 参数正确映射。

4. 验证副本集同步

  1. 登录主节点(Windows)检查副本集成员状态: javascript rs.status();
  2. PRIMARY 应为 Windows MongoDB。
  3. SECONDARY 应为 Ubuntu MongoDB。

  4. 在主节点插入数据: javascript use testdb; db.test.insert({ name: "MongoDB Replication Test" });

  5. 登录副节点(Ubuntu),验证同步: javascript use testdb; db.test.find();


故障排查

  1. 网络不通
  2. 检查 Windows 和 Ubuntu 是否能互相 ping 通。
  3. 确保 MongoDB 的 27017 端口没有被防火墙阻止。

  4. 副本集状态异常

  5. 使用 rs.status() 查看详细日志。
  6. 检查主节点和副节点的日志文件,确认是否有权限或网络问题。

  7. 同步延迟

  8. 检查副本集的同步状态: javascript rs.printSlaveReplicationInfo();

示例结果

成功配置后,MongoDB 的数据将自动从主节点(Windows)同步到副节点(Ubuntu)。如需拓展,可在 Ubuntu 上再添加多个副节点,形成多副本的高可用架构。