要在 Windows(内网) 和 Ubuntu(外网) 的两个 MongoDB 实例之间建立 副本集(Replica Set),并实现数据同步,可以按照以下步骤进行操作:
总体思路
- 在 Windows 和 Ubuntu 上分别安装 MongoDB:
- 使用 Docker 容器部署 MongoDB 实例。
- Windows 中的 MongoDB 为主节点(Primary)。
-
Ubuntu 中的 MongoDB 为副节点(Secondary)。
-
配置副本集(Replica Set):
- 在两台服务器上启用副本集模式。
-
确保 Windows 可以通过内网访问外网的 Ubuntu 实例。
-
配置网络通信:
- 为 Windows 提供到 Ubuntu 的网络访问(NAT 或 VPN)。
-
开放 Ubuntu 服务器的 MongoDB 端口。
-
同步副本集数据:
- 启动副本集后,数据会自动从主节点同步到副节点。
详细步骤
1. 安装 MongoDB
Windows 上安装 Docker 并运行 MongoDB
- 安装 Docker:
- 下载并安装 Docker Desktop(确保 Windows 上启用了 Hyper-V 或 WSL2)。
-
启动 Docker Desktop。
-
运行 MongoDB 容器:
bash docker run -d \ --name mongodb-primary \ -p 27017:27017 \ -v mongodb_data:/data/db \ mongo:latest --replSet rs0
Ubuntu 上安装 Docker 并运行 MongoDB
-
安装 Docker:
bash sudo apt update sudo apt install -y docker.io
-
运行 MongoDB 容器:
bash docker run -d \ --name mongodb-secondary \ -p 27017:27017 \ -v mongodb_data:/data/db \ mongo:latest --replSet rs0
2. 启用副本集模式
Windows 主节点(Primary)配置
-
进入容器:
bash docker exec -it mongodb-primary mongosh
-
初始化副本集:
javascript rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "windows_internal_ip:27017" } // 替换为 Windows 内网 IP ] });
-
查看副本集状态:
javascript rs.status();
Ubuntu 副节点(Secondary)配置
- 确保 Ubuntu 能访问 Windows 的 MongoDB:
- 在 Windows 中确认 Docker 容器的 IP 地址和 27017 端口已开放。
-
在 Ubuntu 上通过以下命令检查连通性:
bash telnet windows_internal_ip 27017
-
进入容器:
bash docker exec -it mongodb-secondary mongosh
-
将副节点添加到副本集中:
javascript rs.add("ubuntu_public_ip:27017"); // 替换为 Ubuntu 外网 IP
-
查看副本集状态:
javascript rs.status();
3. 配置网络通信
- Windows 到 Ubuntu 的网络访问:
-
如果 Windows 和 Ubuntu 之间没有直接连通性,可以通过以下方法:
- VPN:设置 VPN,将 Ubuntu 外网映射到 Windows 内网中。
- NAT 转发:配置 Ubuntu 的公共 IP 或通过路由器设置端口转发,将 27017 暴露到外网。
-
Ubuntu 上防火墙配置: 确保 MongoDB 的 27017 端口对 Windows 开放:
bash sudo ufw allow 27017
-
Docker 网络配置:
- 如果 Docker 容器没有绑定到主机网络,请确保 MongoDB 容器的 27017 端口已经通过
-p
参数正确映射。
4. 验证副本集同步
- 登录主节点(Windows)检查副本集成员状态:
javascript rs.status();
PRIMARY
应为 Windows MongoDB。-
SECONDARY
应为 Ubuntu MongoDB。 -
在主节点插入数据:
javascript use testdb; db.test.insert({ name: "MongoDB Replication Test" });
-
登录副节点(Ubuntu),验证同步:
javascript use testdb; db.test.find();
故障排查
- 网络不通:
- 检查 Windows 和 Ubuntu 是否能互相 ping 通。
-
确保 MongoDB 的 27017 端口没有被防火墙阻止。
-
副本集状态异常:
- 使用
rs.status()
查看详细日志。 -
检查主节点和副节点的日志文件,确认是否有权限或网络问题。
-
同步延迟:
- 检查副本集的同步状态:
javascript rs.printSlaveReplicationInfo();
示例结果
成功配置后,MongoDB 的数据将自动从主节点(Windows)同步到副节点(Ubuntu)。如需拓展,可在 Ubuntu 上再添加多个副节点,形成多副本的高可用架构。