MongoDB副本集部署完整教程
一般而言,副本集主要成員有三個:主節(jié)點,副本節(jié)點,仲裁節(jié)點
按照官方推薦方案,我們搭建一個三成員的副本集,這個副本集由一個主結(jié)點和兩個副本結(jié)點組成。
這里采用三臺虛擬機進行部署:node1(主節(jié)點),node2(副本節(jié)點),node3(副本節(jié)點)
一、環(huán)境準備
按照跳轉(zhuǎn)文章介紹的方式,分別在三臺服務(wù)器上創(chuàng)建user-mongo用戶,并將目錄/opt/module/,mongodb_dcmo/更改為用戶user_mongo的權(quán)限,使用該用戶進行MongoDB副本集安裝與啟動
在三臺服務(wù)器目錄/opt/module/mongodb_demo/下創(chuàng)建目錄/replicaset/data/和目錄/replicaset/logs/,用于存放MongoDB副本集的數(shù)據(jù)和MongoDB副本集的日志文件,具體操作命令如下:
mkdir replicaset cd replicaset/ mkdir data mkdir logs cd logs touch mongodb.log
二、副本集的安裝與啟動
1.安裝副本集
首先在node1上安裝好mongodb,通過解壓MongoDB安裝包的方式安裝MongoDB,將MongoDB安裝包解壓目錄/opt/module/mongo_demo/replicaset/下,重命名為mongodb后
replicaset目錄下包含data(數(shù)據(jù))、logs(日志)和mongodb(MongoDB安裝目錄)文件夾,并且這些文件夾的用戶權(quán)限都是user_mongo.
再將服務(wù)器node1中/opt/module/mongodb_demo/replicaset/目錄下的所有內(nèi)容通過scp命令分發(fā)到服務(wù)器node2和服務(wù)器node3上
2.啟動副本集
分別在三臺服務(wù)器node1、node2和node3的/opt/module/mongodb_demo/replicaset/mongodb/bin目錄下以副本集模式啟動MongoDB,這里以服務(wù)器node1為例進行操作
node1:
cd /opt/module/mongodb_demo/replicaset/mongodb/bin
副本集模式啟動mongodb:
./mongod --replSet xxx --dbpath=/opt/module/mongodb_demo/replicaset/data/ --logpath=/opt/module/mongodb_demo/replicaset/logs/mongodb.log --port 27017 --bind_ip node1 --logappend --fork

上述啟動MongoDB命令中,參數(shù)replSet指定MongoDB副本集名稱【xxx-自己命名】,同一副本集須指定相同名稱;
- 參數(shù)dbpath指定MongoDB副本集數(shù)據(jù)存放目錄(不能與其他MongoDB服務(wù)沖突);
- 參數(shù)logpath指定MongoDB服務(wù)副本集日志目錄;
- 參數(shù)port指定MongoDB副本集啟動占用的端口號(不能與其他MongoDB沖突);
- 參數(shù)bind_ip開啟遠程連接,使用當前服務(wù)器主機名;
- 參數(shù)logappend指定以追加的方式寫入日志;
- 參數(shù)fork指定MongoDB后臺啟動。
node2:
cd /opt/module/mongodb_demo/replicaset/mongodb/bin
./mongod --replSet itcast --dbpath=/opt/module/mongodb_demo/replicaset/data/ --logpath=/opt/module/mongodb_demo/replicaset/logs/mongodb.log --port 27018 --bind_ip node2 --logappend --fork

node3:
cd /opt/module/mongodb_demo/replicaset/mongodb/bin
./mongod --replSet itcast --dbpath=/opt/module/mongodb_demo/replicaset/data/ --logpath=/opt/module/mongodb_demo/replicaset/logs/mongodb.log --port 27018 --bind_ip node3 --logappend --fork

3.副本集的初始化
登錄mongodb客戶端:
./mongosh --host node1 --port 27017
這里新版本用的mongosh 老版本用mongo即可

當出現(xiàn)命令輸入提示符>,證明在服務(wù)器node1中成功登錄MongoDB客戶端!
接著在MongoDB客戶端中執(zhí)行副本集初始化操作:
rs.initiate()

接著查看副本集成員狀態(tài):
rs.status()




當前副本集只有一個成員角色,即主結(jié)點。接下來,我們將其他兩臺服務(wù)器node2和node3中的MongoDB以副本結(jié)點的角色添加到副本集中(添加結(jié)點的操作必須在主結(jié)點
進行),具體命令如下:
rs.add("node2:27017")rs.add("node3:27017")
執(zhí)行完添加副本結(jié)點命令后,客戶端會返回添加的副本結(jié)點的相關(guān)信息,如信息中字段“OK”的值為1,則證明副本結(jié)點添加成功!
此時,在服務(wù)器node2和node3上登錄MongoDB客戶端,查看當前服務(wù)器在副本集中的角色分配情況:
./mongosh --host node2 --port 27017

./mongosh --host node3 --port 27017
4.同步副本文檔
通過向MongoDB副本集主結(jié)點寫入文檔,驗證其他副本結(jié)點是否成功同步主結(jié)點寫入的文檔內(nèi)容,具體操作步驟如下。
(1)在服務(wù)器node1(副本集主結(jié)點)的MongoDB客戶端寫入一條文檔,具體命令如下:

通過上述操作,成功在副本集主結(jié)點的數(shù)據(jù)庫test中創(chuàng)建集合user并插入一條文檔。
(2)在服務(wù)器node2(副本結(jié)點)中登錄MongoDB客戶端,查看數(shù)據(jù)庫test下的集合user中是否存在與主結(jié)點一致的文檔內(nèi)容,具體命令如下:

執(zhí)行查看集合中的文檔命令時,客戶端會返回Error的錯誤信息,這是因為默認情況下
副本結(jié)點不能讀取副本集中的內(nèi)容,因此我們需要設(shè)置開啟副本結(jié)點的讀取權(quán)限,然后才可
以查看副本集中的內(nèi)容,具體命令如下:

注:MongoDB 舊版本中,rs.secondaryOk() 用于允許從 secondary 副本集成員讀取數(shù)據(jù)。但在較新版本(MongoDB 4.2 及以上),官方改進了 讀偏好(Read Preference) 機制,推薦使用 setReadPref() 來設(shè)置讀取策略。
db.getMongo().setReadPref("primaryPreferred")或在 MongoDB shell 連接時直接指定:
mongo --host xxx --readPreference=primaryPreferred
"primary":默認值,只從 primary 讀取。"secondary":只從 secondary 讀?。ㄟm用于查詢壓力大的情況)。"primaryPreferred":優(yōu)先從 primary 讀取,但如果 primary 不可用,則從 secondary 讀?。ㄍ扑])。"secondaryPreferred":優(yōu)先從 secondary 讀取,primary 不可用時才會使用 primary。"nearest":從最近的節(jié)點讀?。ú豢紤] primary/secondary
5.配置副本集成員
1.查看當前副本集配置
首先,您已經(jīng)使用了 rs.conf() 命令查看了當前的副本集配置,以下是您已經(jīng)提供的配置內(nèi)容:cfg = rs.conf();
2.將服務(wù)器nosql02由仲裁結(jié)點更改為副本結(jié)點
修改配置
將 node2 修改為 仲裁節(jié)點(arbiterOnly: true,并且將 priority 設(shè)置為 0)。
將 node3 修改為 延遲節(jié)點(secondaryDelaySecs: Long("0"),并且將 priority 設(shè)置為 0,hidden 設(shè)置為 true)。
cfg.members[1].arbiterOnly = true; // 將 node2 改為仲裁節(jié)點 cfg.members[1].priority = 0; // 設(shè)置優(yōu)先級為 0,避免 node2 成為主節(jié)點
提交配置更改
rs.reconfig(cfg);

但由于不允許直接修改節(jié)點的 arbiterOnly 字段,需要先刪除該節(jié)點,然后再重新添加它作為仲裁節(jié)點。
1.從副本集中刪除 node2: 使用 rs.remove() 命令從副本集配置中刪除 node2。
rs.remove("node2:27017");2.重新添加 node2 作為仲裁節(jié)點: 通過 rs.add() 命令將 node2 以仲裁節(jié)點的身份重新添加到副本集中。這里將 arbiterOnly 設(shè)置為 true,并將其優(yōu)先級設(shè)置為 0。
rs.add({ _id: 1, host: "node2:27017", arbiterOnly: true, priority: 0 });
成功成為仲裁節(jié)點!
也有別的方法,我沒試過,應(yīng)該莫問題,自己嘗試


3.將服務(wù)器nosql03中延遲結(jié)點修改為正常的副本結(jié)點
修改配置:
cfg.members[2].priority = 0; // 設(shè)置優(yōu)先級為 0,避免 node3 成為主節(jié)點 cfg.members[2].hidden = true; // 將 node3 設(shè)置為隱藏節(jié)點,確保不會被選為主節(jié)點
【注】出現(xiàn)問題解決方法【新版】

錯誤提示 BSON field 'MemberConfig.slaveDelay' is an unknown field 表示 slaveDelay 這個字段在 MongoDB 配置中是不被識別的,導致 rs.reconfig(cfg) 執(zhí)行失敗。事實上,MongoDB 中并沒有 slaveDelay 字段用于副本集成員的配置。
正確的字段名:
在 MongoDB 中,應(yīng)該使用 secondaryDelaySecs 來設(shè)置副本集成員的延遲時間,而不是 slaveDelay。secondaryDelaySecs 字段用于設(shè)置副本節(jié)點相對于主節(jié)點的延遲時間,單位是秒。
解決方法:
將 slaveDelay 更改為 secondaryDelaySecs,并重新配置副本集:
cfg.members[2].secondaryDelaySecs = 3600; // 設(shè)置延遲時間為3600秒

cfg.members[3].priority = 1; // 設(shè)置優(yōu)先級為 1 cfg.members[3].hidden = false; // 取消隱藏節(jié)點 cfg.members[3].secondaryDelaySecs = 0; // 設(shè)置延遲為 0 秒

成功了,將服務(wù)器nosql03中延遲結(jié)點修改為正常的副本結(jié)點,即優(yōu)先級為1,非隱藏和延遲為0秒。
6.安全認證
1.在服務(wù)器node3創(chuàng)建新的數(shù)據(jù)目錄和日志文件,以副本集模式啟動新的MongoDB,此MongoDB使用27016端口,并指定keyFile文件。
(1)創(chuàng)建存放keyfile文件的目錄,文件寫入密鑰并修改權(quán)限
mkdir -p /opt/module/mongodb_demo/replicaset/key touch /opt/module/mongodb_demo/replicaset/key/keyfile openssl rand -base64 756 -out /opt/module/mongodb_demo/replicaset/key/keyfile chmod 600 /opt/module/mongodb_demo/replicaset/key/keyfile

(2)同步文件
scp -r /opt/module/mongodb_demo/replicaset/key user_mongo@node1:/opt/module/mongodb_demo/replicaset/ scp -r /opt/module/mongodb_demo/replicaset/key user_mongo@node2:/opt/module/mongodb_demo/replicaset/
(3)創(chuàng)建全局管理用戶
登錄客戶端后,切換到數(shù)據(jù)庫admin,添加全局用戶
use admin;
db.createUser({user:"wurui",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"}]});
驗證用戶是否創(chuàng)建成功:

執(zhí)行完上述命令后客戶端返回信息“1”,則證明用戶創(chuàng)建成功。
創(chuàng)建新data和新log --我這里命名data103文件和log103文件,log3文件中添加空文件mongo.log
賦予權(quán)限:
sudo chown -R user_mongo:user_mongo /opt/module/mongodb_demo/replicaset/data103/ sudo chown -R user_mongo:user_mongob /opt/module/mongodb_demo/replicaset/logs103/
啟動安全認證:
./mongod --replSet wurui --keyFile /opt/module/mongodb_demo/replicaset/key/keyfile --dbpath=/opt/module/mongodb_demo/replicaset/data103/ --logpath=/opt/module/mongodb_demo/replicaset/logs103/mongo.log --port 27016 --bind_ip node3 --logappend -fork
node1查看狀態(tài):

2.在副本集主結(jié)點將服務(wù)器node3上新啟動的MongoDB以副本結(jié)點的形式添加到副本集
主節(jié)點中:
rs.add("node3:27016")
出現(xiàn)ok1-->成功成功!
到此這篇關(guān)于MongoDB副本集部署完整教程的文章就介紹到這了,更多相關(guān)MongoDB副本集部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Mongodb參數(shù)說明與常見錯誤處理的總結(jié)
這篇文章主要給大家介紹了關(guān)于Mongodb參數(shù)說明與常見錯誤處理的相關(guān)資料,文中通過一步步的步驟介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。2017-07-07
為MongoDB數(shù)據(jù)庫注冊windows服務(wù)
這篇文章介紹了為MongoDB數(shù)據(jù)庫注冊windows服務(wù)的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06
解決MongoDB6.0報錯:"mongo"不是內(nèi)部或外部命令,也不是可運行的程序或批處理文件
這篇文章主要給大家介紹了關(guān)于解決MongoDB6.0報錯:"mongo"不是內(nèi)部或外部命令,也不是可運行的程序或批處理文件的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-05-05
SpringBoot?整合mongoDB并自定義連接池的示例代碼
這篇文章主要介紹了SpringBoot?整合mongoDB并自定義連接池?,整合mongoDB的目的就是想用它給我們提供的mongoTemplate,它可以很容易的操作mongoDB數(shù)據(jù)庫,對整合過程及實例代碼感興趣的朋友跟隨小編一起看看吧2022-02-02
MongoDB.NET 2.2.4驅(qū)動版本對Mongodb3.3數(shù)據(jù)庫中GridFS增刪改查
這篇文章主要為大家詳細介紹了使用MongoDB.NET 2.2.4驅(qū)動版本對Mongodb3.3數(shù)據(jù)庫中GridFS增刪改查,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11

