mongodb在window10中创建副本集的方法,以及node.js连接副本集的方法

创建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 adminrs.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

再进行最上面的步骤

测试用Node.js连接副本集

//mongotest.js

const {MongoClient}=require('mongodb');//这里我重新建了一个只能读写的用户名
//employees是数据库名,replicaSet=rs0表示连接到副本集rs0
//authSource=employees表示存储登陆用户名和密码的数据库
//w=majority表示保证写入操作传到大多数从节点,说人话就是大多数从节点复制了这个写入的数据wtimeoutMs表示延时
const uri='mongodb://qqtest:123456@localhost:27018,localhost:27019,localhost:27201/employees?replicaSet=rs0&authSource=employees&w=majority&wtimeoutMS=5000';
const client=new MongoClient(uri);async function run(){try{await client.connect();console.log('Connected to MongoDB replica set');const db=client.db('employees');const collection=db.collection('users');const result=await collection.insertMany([{"name":"Bob",age:25},{'name':"Alice",age:32},{"writeConcern":{'w':'majority','wtimeoutMS':5000}}	//也可以把大多数写入从节点写在这里]);console.log("文档已经插入:",result.insertedIds);const findResult =await collection.find({'name':'kimi'}).toArray();console.log('查询到文档:',findResult);}catch(err){console.error('Error:',err);}finally{await client.close();console.log('Connection closed');}
}run();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven 多仓库与镜像配置全攻略:从原理到企业级实践

Maven 多仓库与镜像配置全攻略&#xff1a;从原理到企业级实践 一、核心概念&#xff1a;Repository 与 Mirror 的本质差异 在 Maven 依赖管理体系中&#xff0c;repository与mirror是构建可靠依赖解析链的两大核心组件&#xff0c;其核心区别如下&#xff1a; 1. Repositor…

STM32 四足机器人常见问题汇总

文章不介绍具体参数&#xff0c;有需求可去网上搜索。 特别声明&#xff1a;不论年龄&#xff0c;不看学历。既然你对这个领域的东西感兴趣&#xff0c;就应该不断培养自己提出问题、思考问题、探索答案的能力。 提出问题&#xff1a;提出问题时&#xff0c;应说明是哪款产品&a…

MySQL 中 `${}` 和 `#{}` 占位符详解及面试高频考点

文章目录 一、概述二、#{} 和 ${} 的核心区别1. 底层机制代码示例 2. 核心区别总结 三、为什么表名只能用 ${}&#xff1f;1. 预编译机制的限制2. 动态表名的实现 四、安全性注意事项1. ${} 的风险场景2. 安全实践 五、面试高频考点1. 基础原理类问题**问题 1**&#xff1a;**问…

C语言编译预处理2

#include <XXXX.h>和#include <XXXX.c> #include "XXXX.h" 是 C 语言中一条预处理指令 #include <XXXX.h>&#xff1a;这种形式用于包含系统标准库的头文件。预处理器会在系统默认的头文件搜索路径中查找XXXX.h 文件。例如在 Linux 系统中&#…

Elasticvue-轻量级Elasticsearch可视化管理工具

Elasticvue一个免费且开源的 Elasticsearch 在线可视化客户端&#xff0c;用于管理 Elasticsearch 集群中的数据&#xff0c;完全支持 Elasticsearch 版本 8.x 和 7.x. 功能特色&#xff1a; 集群概览索引和别名管理分片管理搜索和编辑文档REST 查询快照和存储库管理支持国际…

Git提交规范及最佳实践

Git 提交规范通常是为了提高代码提交的可读性、可维护性和自动化效率&#xff08;如生成 ChangeLog&#xff09;。以下是常见的 Conventional Commits 规范&#xff0c;结合社区最佳实践总结而成&#xff1a; 1. 提交格式 每次提交的 commit message 应包含三部分&#xff1a;…

Ubuntu中snap

通过Snap可以安装众多的软件包。需要注意的是&#xff0c;snap是一种全新的软件包管理方式&#xff0c;它类似一个容器拥有一个应用程序所有的文件和库&#xff0c;各个应用程序之间完全独立。所以使用snap包的好处就是它解决了应用程序之间的依赖问题&#xff0c;使应用程序之…

android studio 运行java main报错

运行某个带main函数的java文件报错 Could not create task :app:Test.main(). > SourceSet with name main not found. 解决办法&#xff1a;在工程的.idea/gradle.xml 文件下添加&#xff1a; <option name"delegatedBuild" value"false" /&g…

openssh离线一键升级脚本分享(含安装包)

查看当前的版本 [rootmyoracle ~]#ssh -V相关安装包下载地址 openssh下载地址&#xff1a;http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssl下载地址&#xff1a;https://www.openssl.org/source/zlib下载地址&#xff1a;http://www.zlib.net/今天演示从7.4升级…

Mac M1管理多个Node.js版本

目录 1. 使用 nvm (Node Version Manager) 1.1.安装 nvm 1.2.安装Node.js版本 1.3.查看已安装的node版本列表 1.4.使用特定版本的Node.js 1.5.查看当前使用的版本 2. 使用 fnm (Fast Node Manager) 2.1.安装 fnm 2.2.安装Node.js版本 2.3.查看已安装的版本 2.4.使用…

Unity中国战略调整简讯:Unity6下架 团结引擎接棒

Unity中国战略调整简讯&#xff1a;Unity6下架 团结引擎接棒 免费版 2025年4月9日 —— Unity中国宣布自即日起&#xff0c;中国大陆及港澳地区停止提供Unity 6及后续版本下载与服务&#xff0c;相关功能由国产引擎“团结引擎”承接。国际版2022 LTS及更早版本仍由Unity中国维护…

TestNG 单元测试详解

1、测试环境 jdk1.8.0 121 myeclipse-10.0-offline-installer-windows.exe TestNG 插件 org.testng.eclipse 6.8.6.20130607 0745 2、介绍 套件(suite):由一个 XML 文件表示,通过<suite>标签定义,包含一个或更多测试(test)。测试(test):由<test>定义&#xf…

C复习(主要复习)

指针和数组 指针数组是一个数组&#xff0c;数组的每个元素都是指针。它适用于需要存储多个指针的场景&#xff0c;如字符串数组。数组指针是一个指针&#xff0c;指向一个数组。它适用于需要传递整个数组给函数或处理多维数组的场景。 函数指针&#xff1a;函数指针的定义需要…

探索大语言模型(LLM):定义、发展、构建与应用

文章目录 引言大规模语言模型的基本概念大规模语言模型的发展历程1. 基础模型阶段&#xff08;2018年至2021年&#xff09;2. 能力探索阶段&#xff08;2019年至2022年&#xff09;3. 突破发展阶段&#xff08;以2022年11月ChatGPT的发布为起点&#xff09; 大规模语言模型的构…

5. k8s 之 pod原理与使用

Kubernetes Pod 原理详解 1. Pod 的部署方式 Pod 是 Kubernetes 的最小调度单元&#xff0c;其部署方式分为 声明式&#xff08;YAML&#xff09; 和 命令式&#xff08;kubectl&#xff09; 两种&#xff1a; (1) 声明式部署&#xff08;推荐&#xff09; 通过 YAML 文件定…

使用PyTorch实现目标检测边界框转换与可视化

一、引言 在目标检测任务中&#xff0c;边界框&#xff08;Bounding Box&#xff09;的坐标表示与转换是核心基础操作。本文将演示如何&#xff1a; 实现边界框的两种表示形式&#xff08;角点坐标 vs 中心坐标&#xff09;之间的转换 使用Matplotlib在图像上可视化边界框 验…

电影推荐及数据分析可视化系统(Python+Echarts+Mysql+Flask框架)

提升自己&#xff0c;掌握数据分析的能力&#xff0c;最快的方式就是实践&#xff01; 下面是对本项目的一些功能展示、介绍以及部分核心代码的展示,附项目系统展示的视频,制作不易如需完整代码后台私信我有偿获取! 一 、系统分析及功能介绍 1.系统分析 系统采用Python作为开发…

Android Jetpack Compose 高级开发核心技术

Android Compose 高级技术总结 1. 性能优化 1.1 状态管理优化 状态提升原则&#xff1a;将状态提升到共享的最近共同父组件derivedStateOf&#xff1a;当需要基于多个状态计算派生状态时使用 val scrollState rememberScrollState() val showButton by remember {derivedS…

Java堆结构深度解析:原理、实现与应用全指南

一、堆的核心概念体系 1. 堆的定义与性质 graph TBROOT((最大堆)) --> A[父节点 ≥ 子节点]ROOT --> B[完全二叉树结构]ROOT --> C[数组存储]ROOT --> D[快速获取极值] 2. 堆类型对比 类型特性典型应用场景最大堆父节点值 ≥ 子节点值获取前K大元素最小堆父节点…

SpringMVC学习(请求与响应。常见参数类型接收与响应。@RequestParam、@RequestBody的使用)(详细示例)

目录 一、请求与响应。(RequestMapping) &#xff08;1&#xff09;使用注解RequestMapping对业务模块区分。 StudentController。 TeacherController。 &#xff08;2&#xff09;Apifox请求与响应。 "/student/login"。 "/teacher/login"。 二、常见参数…