在 Windows Server 上部署 MongoDB 副本集,与 Linux 环境最大的区别在于服务注册、路径书写和防火墙管理。很多教程默认使用正斜杠路径或者直接命令行启动,导致节点重启后无法自动恢复。本文使用三台 Windows Server 主机,IP 分别规划为 192.168.10.11、192.168.10.12、192.168.10.13,端口统一为 27017,数据目录固定为 C:\MongoDB\data,日志目录固定为 C:\MongoDB\log,配置文件放在 C:\MongoDB\config\mongod.cfg,然后逐步完成从环境准备到副本集选举验证的全过程。

副本集架构与目录规划
MongoDB 副本集由多个 mongod 节点组成,其中一个节点为主节点负责写入,其余为从节点异步复制主节点的 oplog。副本集依靠心跳检测成员存活状态,当主节点失联时会在剩余节点中发起选举,得到大多数投票的从节点会升级为新的主节点。正因为选举机制要求“大多数”存活,所以生产环境通常采用三个节点,这样即使一个节点宕机,另外两个节点仍然可以形成多数派完成选举。
在 Windows Server 上搭建副本集前,需要先在三台主机上完成相同的目录结构。建议使用管理员权限在每台机器上执行以下命令创建目录:
mkdir C:\MongoDB\data mkdir C:\MongoDB\log mkdir C:\MongoDB\config mkdir C:\MongoDB\bin
将 MongoDB 企业版或社区版压缩包解压后,把 bin 目录下的所有可执行文件复制到 C:\MongoDB\bin 中。接下来编写统一的配置文件 C:\MongoDB\config\mongod.cfg,内容如下:
systemLog:
destination: file
path: C:\MongoDB\log\mongod.log
logAppend: true
storage:
dbPath: C:\MongoDB\data
journal:
enabled: true
net:
port: 27017
bindIp: 0.0.0.0
replication:
replSetName: rs0这里注意 replication.replSetName 的值必须三台机器完全一致,否则后续初始化时会因为副本集名称不匹配而报错。bindIp 设置为 0.0.0.0 是为了让其他节点可以访问,但在生产环境如果服务器有多个网卡,建议改成实际内网 IP 或专用网段,同时配合防火墙规则限制访问来源。
注册 Windows 服务并启动节点
Windows 下不建议直接用命令行启动 mongod,因为控制台关闭后进程会退出。正确做法是把 mongod 注册为 Windows 服务,这样系统重启后服务可以自动拉起。进入 C:\MongoDB\bin 目录,在管理员 PowerShell 中执行安装命令:
cd C:\MongoDB\bin .\mongod.exe --config "C:\MongoDB\config\mongod.cfg" --install --serviceName "MongoDB" --serviceDisplayName "MongoDB Replica Set"
执行成功后,可以通过服务管理控制台找到名为 MongoDB Replica Set 的服务。接着启动服务并设置自动启动类型:
net start MongoDB sc.exe config MongoDB start= auto
需要注意,sc config 命令中 start= 后面的空格不能省略,否则会提示参数错误。启动完成后,可以打开 C:\MongoDB\log\mongod.log 查看日志,确认没有报错并且能看到 waiting for connections on port 27017。三台主机执行同样的步骤,全部启动成功后即可进入副本集初始化阶段。
如果安装服务时使用了带空格的路径,例如 C:\Program Files\MongoDB\Server\7.0\bin\mongod.exe,则必须用引号把整个路径包起来,否则 sc create 会解析失败。本文统一使用 C:\MongoDB\bin,就是为了避免这类路径问题。
初始化副本集与验证选举
副本集第一次启动时不会自动产生主节点,需要连接到任意一个节点执行 rs.initiate。由于三个节点目前都是无认证状态,直接使用 mongo shell 连接第一个节点:
mongo --host 192.168.10.11 --port 27017
进入 shell 后执行以下初始化命令,将所有成员一次性加入副本集:
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "192.168.10.11:27017", priority: 2 },
{ _id: 1, host: "192.168.10.12:27017", priority: 1 },
{ _id: 2, host: "192.168.10.13:27017", priority: 1 }
]
})priority 值较高的节点更容易成为主节点,这里把 192.168.10.11 设置为 2,让它在正常情况下承担写入。初始化成功后,执行 rs.status() 可以查看每个节点的 stateStr,正常情况下应该显示 PRIMARY 和 SECONDARY。需要注意的是,从节点默认不可读,需要在从节点的 shell 中执行 rs.secondaryOk() 才能进行查询测试。
为了验证写入和复制是否正常,可以连接到主节点插入一条测试数据:
use appdb
db.records.insertOne({ name: "replica-test", server: "192.168.10.11" })然后切换到从节点执行 rs.secondaryOk() 后再执行 db.records.find(),如果能看到相同文档,说明复制链路正常。最后模拟主节点故障:在主节点上执行 net stop MongoDB,等待几秒后在另一个节点执行 rs.status(),会发现新的主节点被自动选出。再次启动原节点后,它会作为从节点重新加入,整个高可用过程验证完成。
开启认证与防火墙收尾
生产环境不能长期以无认证状态运行。建议先在无认证状态下创建管理员用户,再启用认证。使用 mongo shell 连接到主节点,执行以下命令创建 root 用户:
use admin
db.createUser({
user: "replicaAdmin",
pwd: "yourStrongPassword",
roles: [ { role: "root", db: "admin" } ]
})创建用户后,修改三个节点的 mongod.cfg,在文件末尾添加如下内容:
security: authorization: enabled
保存后重启所有 mongod 服务,之后的连接就必须携带账号密码,例如:
mongo --host 192.168.10.11 --port 27017 -u replicaAdmin -p yourStrongPassword --authenticationDatabase admin
Windows 防火墙同样需要放行 27017 端口,否则其他节点无法建立心跳连接。管理员 PowerShell 中执行:
New-NetFirewallRule -DisplayName "MongoDB 27017" -Direction Inbound -Protocol TCP -LocalPort 27017 -Action Allow
放行规则可以进一步限制远程地址为本机网段,例如 -RemoteAddress 192.168.10.0/24,这样只有副本集成员之间可以穿透防火墙,提高安全性。完成以上步骤后,Windows Server 上的 MongoDB 副本集就具备自动故障转移、数据冗余和基础访问控制能力,可以投入业务使用。
MongoDB副本集Windows Server副本集搭建修改时间:2026-10-03 18:45:22