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.pswp.cn/web/76100.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76100.shtml
英文地址,請注明出處:http://en.pswp.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"。 二、常見參數…