windows如何设置mongodb的副本集

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 个节点
  • 其中一个节点的 stateStrPRIMARY(主节点)
  • 其他节点的 stateStrSECONDARY(从节点)

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.confrs0-1.confrs0-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. 从节点状态为 STARTUP2RECOVERING

  • 等待数据同步完成(首次同步可能需要几分钟)
  • 检查网络连接和防火墙设置
  • 查看日志文件定位问题

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 副本集。关键注意事项:

  • 数据目录和端口必须唯一
  • 所有节点使用相同的副本集名称
  • 确保防火墙允许节点间通信
  • 生产环境建议使用独立服务器部署节点,而非单机模拟
相关推荐
RestCloud10 小时前
在制造业数字化转型浪潮中,数据已成为核心生产要素。然而,系统割裂、数据滞后、开发运维成本高等问题,却像顽固的 “数据枷锁”,阻碍着企业发展。ETLCloud与
数据库·postgresql
!chen10 小时前
【Spring Boot】自定义starter
java·数据库·spring boot
十碗饭吃不饱10 小时前
sql报错:java.sql.SQLSyntaxErrorException: Unknown column ‘as0‘ in ‘where clause‘
java·数据库·sql
我是Superman丶11 小时前
【优化】Mysql指定索引查询或忽略某个索引
数据库·mysql
程序定小飞11 小时前
基于springboot的在线商城系统设计与开发
java·数据库·vue.js·spring boot·后端
呆呆小金人11 小时前
SQL入门: HAVING用法全解析
大数据·数据库·数据仓库·sql·数据库开发·etl·etl工程师
LL_break11 小时前
Mysql数据库
java·数据库·mysql
野犬寒鸦11 小时前
从零起步学习Redis || 第十一章:主从切换时的哨兵机制如何实现及项目实战
java·服务器·数据库·redis·后端·缓存
倔强的石头_12 小时前
面向大数据架构的演进:为何 Apache IoTDB 是与生态无缝融合的理想之选?
数据库