mongodb在window10中创建副本集的方法

发布于:2025-04-12 ⋅ 阅读:(33) ⋅ 点赞:(0)

创建Mongodb的副本集最好是新建一个文件夹,如D:/data,不要在mongodb安装文件夹里面创建副本集,虽然这样也可以,但是容易造成误操作或路径混乱;在新建文件夹里与现有 MongoDB 数据隔离,避免误操作影响原有数据,后续要清理和迁移都要方便得多。

1、在cmd命令符中创建三个数据文件夹

mkdir D:\data\db1  # 主节点(Primary)
mkdir D:\data\db2  # 从节点1(Secondary)
mkdir D:\data\db3  # 从节点2(Secondary)

2、启动 3 个 mongod 实例(模拟 3 节点副本集)
打开 3 个独立的 CMD 窗口,分别运行:

窗口 1(主节点,端口 27017)

mongod --replSet rs0 --dbpath D:\data\db1 --port 27017 --logpath D:\data\db1\log.log --bind_ip 0.0.0.0

窗口 2(从节点1,端口 27018)

mongod --replSet rs0 --dbpath D:\data\db2 --port 27018 --logpath D:\data\db2\log.log --bind_ip 0.0.0.0

窗口 3(从节点2,端口 27019)

mongod --replSet rs0 --dbpath D:\data\db3 --port 27019 --logpath D:\data\db3\log.log --bind_ip 0.0.0.0

注意:这三个cmd窗口都不能关闭,如果关闭则副本集也会关闭,他们会没啥反应,只能在mongosh中才能查看到状态

3、 初始化副本集
连接主节点(27017)并执行初始化:
再打开一个cmd命令,首先你要安装好mongodb shell,下面的mongosh命令才能用

这里先登陆主节点

mongosh --port 27017

然后初始化副本集,注意在cmd命令中不能换行书写的,你最好写成一行,要么用mongosh加载js文件

rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "localhost:27017" },
    { _id: 1, host: "localhost:27018" },
    { _id: 2, host: "localhost:27019" }
  ]
})

用mongosh加载js文件初始化,把上面的写在init_replica.js文件后用mongosh加载

mongosh --port 27017 --file init_replica.js

初始化成功后,验证各节点状态,进入主节点
mongosh --port 27017

rs.status()  // 检查各节点状态
rs.isMaster() // 查看主节点信息

现在你就可以测试了,比如在主节点中插入数据,然后在从节点中查询

db.user.insertOne({"name":"Bob",age:22});

登陆从节点27018
mongosh --port 27018

db.user.find({});//这时会显示主节点插入的数据

这里的副本集和你单机的mongodb数据库是一模一样的,在主节点上也有admin,local,test等集合,一样可以设置用户名和密码及ssl证书

4、创建管理员账户和从节点管理

在初始化后我们就可以进行创建用户名和密码,上面都是直接登陆,这样显然是不安全的,进入我们的主节点

use admin
db.createUser({
  user: "admin",
  pwd: "yourSecurePassword",  // 替换为强密码
  roles: [
    { role: "root", db: "admin" },          // 超级管理员
    { role: "clusterAdmin", db: "admin" }   // 副本集管理权限
  ]
});

说明:用户权限在副本集中的同步机制,主节点创建的用户会自动同步到所有从节点
MongoDB 的 用户数据存储在 admin 数据库 中,而 admin 数据库的内容(包括用户账号)会通过副本集的 Oplog 自动同步到所有成 员。
因此:
只需在主节点创建用户(如 admin),从节点会自动同步该用户信息。
从节点不需要单独创建用户,但必须用相同的用户名/密码登录。

编辑 MongoDB 配置文件(通常位于 /etc/mongod.conf 或 C:\Program Files\MongoDB\Server<version>\bin\mongod.cfg):

security:
  authorization: enabled  # 启用认证
  keyFile: /path/to/keyfile  # 副本集内部认证文件(下一步生成)
  1. 生成 KeyFile(副本集内部认证)
openssl rand -base64 756 > /path/to/mongo-keyfile
chmod 400 /path/to/mongo-keyfile  # 限制权限

KeyFile 的使用规则
所有副本集成员必须使用完全相同的 KeyFile 文件
KeyFile 是副本集成员之间互相认证的共享密钥,内容必须一致。
生成后需严格限制权限(Linux: chmod 400,Windows: 仅管理员可读)

将 keyfile 复制到所有节点的相同路径。

  1. 重启所有节点
mongod --replSet rs0 --dbpath /data/db1 --port 27017 --bind_ip 0.0.0.0 --auth --keyFile /path/to/mongo-keyfile

(其他节点同理)

  1. 验证认证
mongosh --port 27017 -u admin -p yourSecurePassword --authenticationDatabase admin


rs.status()  // 确认副本集状态正常

配置项作用
authorization: enabled 强制所有连接必须提供用户名/密码
keyFile 副本集成员间通信的共享密钥,防止未授权节点加入
clusterAdmin 角色 允许用户管理副本集(如 rs.status(), rs.reconfig())
root 角色 超级管理员权限(谨慎分配)

生产环境最佳实践

避免使用默认端口:修改 27017 为非常用端口。

网络隔离:将副本集部署在内网,仅暴露主节点给应用服务器。

定期轮换 KeyFile:每 3 个月更新一次 keyfile。

审计日志:启用 auditLog 记录所有敏感操作。

强制关闭节点

db.shutdownServer()  // 主节点才能执行
// 或强制关闭(从节点适用)
db.adminCommand({ shutdown: 1, force: true })

如果要重新初始化
停止 MongoDB:

net stop MongoDB
(或 taskkill /F /IM mongod.exe)

删除数据目录:

rmdir /s /q D:\data\db1
rmdir /s /q D:\data\db2
rmdir /s /q D:\data\db3

重新创建目录:

mkdir D:\data\db1
mkdir D:\data\db2
mkdir D:\data\db3

再进行最上面的步骤


网站公告

今日签到

点亮在社区的每一天
去签到