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. 安装 Docker: bash 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 上再添加多个副节点,形成多副本的高可用架构。