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

  • 数据目录和端口必须唯一
  • 所有节点使用相同的副本集名称
  • 确保防火墙允许节点间通信
  • 生产环境建议使用独立服务器部署节点,而非单机模拟
相关推荐
iCxhust14 小时前
windows环境下在Bochs中运行Linux0.12系统
linux·运维·服务器·windows·minix
Elastic 中国社区官方博客18 小时前
在 Elasticsearch 中使用 Mistral Chat completions 进行上下文工程
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
编程爱好者熊浪20 小时前
两次连接池泄露的BUG
java·数据库
TDengine (老段)21 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq7422349841 天前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE1 天前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102161 天前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎1 天前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP1 天前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
l1t1 天前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb