Windows 环境配置 MongoDB 副本集
在 Windows 环境下配置 MongoDB 副本集需要以下步骤,副本集至少需要 3 个节点(1 主 2 从或 1 主 1 从 1 仲裁),我们可以在单机上通过不同端口模拟多个节点。
一、准备工作
1. 安装 MongoDB
- 确保已安装 MongoDB(推荐 4.4+ 版本)
- 默认安装路径:
C:\Program Files\MongoDB\Server\5.0\bin
(根据实际版本调整) - 将
bin
目录添加到系统环境变量Path
2. 创建数据目录和日志目录
在任意位置(如 D:\mongodb
)创建以下目录结构:
D:\mongodb\
├─ rs0-0\ # 节点 0 数据目录
│ └─ data\
│ └─ db\
├─ rs0-1\ # 节点 1 数据目录
│ └─ data\
│ └─ db\
├─ rs0-2\ # 节点 2 数据目录
│ └─ data\
│ └─ db\
└─ logs\ # 日志目录
├─ rs0-0.log
├─ rs0-1.log
└─ rs0-2.log
二、启动三个 MongoDB 实例
1. 打开三个命令提示符窗口(CMD 或 PowerShell)
分别对应三个节点,按顺序执行以下命令:
节点 0(主节点,端口 27017)
bash
mongod --port 27017 --dbpath "D:\mongodb\rs0-0\data\db" --logpath "D:\mongodb\logs\rs0-0.log" --logappend --replSet rs0 --wiredTigerCacheSizeGB 0.5
节点 1(从节点,端口 27018)
bash
mongod --port 27018 --dbpath "D:\mongodb\rs0-1\data\db" --logpath "D:\mongodb\logs\rs0-1.log" --logappend --replSet rs0 --wiredTigerCacheSizeGB 0.5
节点 2(从节点/仲裁节点,端口 27019)
bash
mongod --port 27019 --dbpath "D:\mongodb\rs0-2\data\db" --logpath "D:\mongodb\logs\rs0-2.log" --logappend --replSet rs0 --wiredTigerCacheSizeGB 0.5
参数说明:
--port
:指定端口号--dbpath
:数据存储目录--logpath
:日志文件路径--logappend
:日志追加模式(防止覆盖)--replSet
:副本集名称(所有节点必须相同)--wiredTigerCacheSizeGB
:限制缓存大小(根据内存情况调整)
2. 检查节点是否启动成功
查看日志文件或进程,确认三个节点均正常启动,无报错信息。
三、配置副本集
1. 连接到主节点
打开第四个命令提示符窗口,连接到端口 27017 的节点:
bash
mongo --port 27017
2. 初始化副本集配置
在 MongoDB Shell 中执行以下命令:
javascript
rs.initiate({
_id: "rs0", // 副本集名称,必须与启动时的 --replSet 参数一致
members: [
{_id: 0, host: "localhost:27017"}, // 节点 0
{_id: 1, host: "localhost:27018"}, // 节点 1
{_id: 2, host: "localhost:27019"} // 节点 2
]
})
3. 验证副本集状态
执行以下命令检查副本集状态:
javascript
rs.status()
成功标志:
ok
字段值为1
members
数组中有 3 个节点- 其中一个节点的
stateStr
为PRIMARY
(主节点) - 其他节点的
stateStr
为SECONDARY
(从节点)
4. (可选)设置仲裁节点
如果只需要 2 个数据节点 + 1 个仲裁节点(节省资源),可以修改配置:
javascript
// 先移除原有节点 2
rs.remove("localhost:27019")
// 重新添加为仲裁节点(arbiterOnly: true)
rs.addArb("localhost:27019")
// 或直接修改成员配置
rs.reconfig({
_id: "rs0",
members: [
{_id: 0, host: "localhost:27017"},
{_id: 1, host: "localhost:27018"},
{_id: 2, host: "localhost:27019", arbiterOnly: true}
]
})
四、设置 Windows 服务(可选,推荐)
为了避免每次手动启动节点,可以将 MongoDB 实例注册为 Windows 服务:
1. 为每个节点创建配置文件
在 D:\mongodb
目录下创建 rs0-0.conf
、rs0-1.conf
、rs0-2.conf
:
rs0-0.conf:
yaml
systemLog:
destination: file
path: "D:\\mongodb\\logs\\rs0-0.log"
logAppend: true
storage:
dbPath: "D:\\mongodb\\rs0-0\\data\\db"
wiredTiger:
engineConfig:
cacheSizeGB: 0.5
net:
port: 27017
replication:
replSetName: "rs0"
(其他两个配置文件类似,只需修改端口、路径和日志文件)
2. 注册 Windows 服务
以管理员身份打开命令提示符,执行以下命令:
bash
# 注册节点 0 服务
mongod --config "D:\mongodb\rs0-0.conf" --install --serviceName "MongoDB-rs0-0"
# 注册节点 1 服务
mongod --config "D:\mongodb\rs0-1.conf" --install --serviceName "MongoDB-rs0-1"
# 注册节点 2 服务
mongod --config "D:\mongodb\rs0-2.conf" --install --serviceName "MongoDB-rs0-2"
3. 启动服务
bash
# 启动服务
net start MongoDB-rs0-0
net start MongoDB-rs0-1
net start MongoDB-rs0-2
# 停止服务(需要时)
# net stop MongoDB-rs0-0
服务注册后,可在 服务 管理界面(services.msc
)中查看和管理。
五、验证副本集功能
1. 连接到主节点写入数据
bash
mongo --port 27017
在主节点插入测试数据:
javascript
use testdb
db.test.insertOne({name: "副本集测试", date: new Date()})
2. 连接到从节点读取数据
bash
mongo --port 27018
在从节点查询数据(默认从节点不可读,需要设置):
javascript
rs.slaveOk()// 允许从节点读取(仅临时生效)
db.test.find().pretty()// 应能看到主节点插入的数据
3. 检查数据同步状态
在主节点执行:
javascript
db.printReplicationInfo()// 查看复制信息
db.printSlaveReplicationInfo()// 查看从节点同步状态
六、常见问题解决
1. 节点启动失败
- 检查端口是否被占用:
netstat -ano | findstr :27017
- 确保数据目录权限正确(关闭杀毒软件试试)
- 日志文件路径是否可写
2. 副本集初始化失败
- 检查所有节点是否使用相同的副本集名称(
rs0
) - 确保防火墙允许 MongoDB 端口通信(27017-27019)
- 如果初始化错误,可删除数据目录后重试
3. 从节点状态为 STARTUP2
或 RECOVERING
- 等待数据同步完成(首次同步可能需要几分钟)
- 检查网络连接和防火墙设置
- 查看日志文件定位问题
4. Windows 服务启动失败
- 检查配置文件路径是否正确(使用绝对路径,注意转义符
\\
) - 确保服务使用管理员权限运行
- 查看系统事件日志(
eventvwr.msc
)中的错误信息
七、连接副本集的代码示例
Python(使用 pymongo)
python
from pymongo import MongoClient
# 连接副本集(指定所有节点,驱动会自动发现主节点)
client = MongoClient([
"localhost:27017",
"localhost:27018",
"localhost:27019"
], replicaSet="rs0")
# 验证连接
db = client.testdb
print("主节点:", client.primary)
print("从节点:", client.secondaries)
print("数据:", list(db.test.find()))
Node.js(使用 mongoose)
javascript
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017,localhost:27018,localhost:27019/testdb?replicaSet=rs0', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => console.log('副本集连接成功'))
.catch(err => console.error('连接错误:', err));
八、总结
通过以上步骤,你已在 Windows 环境成功配置了 MongoDB 副本集。关键注意事项:
- 数据目录和端口必须唯一
- 所有节点使用相同的副本集名称
- 确保防火墙允许节点间通信
- 生产环境建议使用独立服务器部署节点,而非单机模拟