MongoDB資料庫之主從複製配置實戰【轉】

paul_hch發表於2024-03-14

一、MongoDB介紹

1.1 MongoDB簡介

MongoDB是一個開源的文件資料庫,使用JSON格式儲存和運算元據,具有高度靈活性和可擴充套件性。MongoDB的資料模型是面向文件的,這意味著它可以儲存各種型別的資料,如陣列、巢狀文件和二進位制資料。MongoDB是一種NoSQL資料庫,不需要使用傳統的表格結構。MongoDB是分散式的,可以在多臺伺服器上部署,支援自動分片,可以實現高可用性和橫向擴充套件。MongoDB還帶有很多強大的功能,包括聚合框架、索引、MapReduce等,支援多種程式語言和多種平臺。它被廣泛用於Web應用程式、大資料分析和實時資料處理等領域。

1.2 MongoDB特點

  • 面向文件的資料模型:MongoDB是一種面向文件的資料庫,這意味著它使用文件來儲存資料,文件是一個鍵值對集合,是非常靈活的資料模型。

  • 分散式:MongoDB支援分散式資料儲存,可以將資料分佈在多個伺服器上,從而實現更高的可用性和可擴充套件性。

  • 高效能:MongoDB支援高效能讀寫,能夠在海量資料環境下快速響應。

  • 強大的查詢語言:MongoDB支援豐富的查詢語言,包括聚合管道、地理空間查詢、全文搜尋等,能夠滿足各種查詢需求。

  • 靈活的資料模型:MongoDB的文件的格式非常靈活,沒有固定的架構,可以按照需求進行調整。同時,支援動態新增欄位和修改文件結構。

  • 可擴充套件性:MongoDB非常容易擴充套件,可以透過水平擴充套件的方式來增加伺服器數量,以滿足不斷增長的資料和請求量。

  • 視覺化管理工具:MongoDB提供了視覺化的管理工具,如MongoDB Compass,使得管理和操作MongoDB資料庫更加方便。

二、MongoDB主從複製介紹

2.1 MongoDB主從複製

MongoDB主從複製是一種資料同步機制,透過該機制可以將一個 MongoDB 例項的資料複製到其他多個例項中,以提高資料的可靠性和可用性。在主從複製中,有一個主節點(也稱為主伺服器),負責接收寫入請求並將資料同步到從節點(也稱為從伺服器)。從節點只能處理讀操作,而不允許寫入操作。

主從複製的核心是複製集(Replica Set),它由多個 MongoDB 例項組成。一個複製集中包括一個主節點和多個從節點。主節點將寫入操作同步到所有的從節點,從節點在收到主節點的更新後,將自己的資料更新為與主節點一致的狀態,確保資料的一致性。

當主節點出現故障時,從節點可以接替主節點成為新的主節點,繼續處理寫入請求和同步資料到其他從節點。這種自動切換的機制可以保證系統的高可用性和可靠性。

主從複製還可以透過讀寫分離的方式提高讀寫效能。將讀操作分發到從節點,從而減輕主節點的負載壓力,提高系統的併發處理能力。MongoDB主從複製是一種可靠、高效的資料同步機制,可以幫助使用者保證資料的完整性和可用性。

2.2MongoDB副本集

  • 副本集在mongodb中是是一組 mongod保持相同的資料集過程,副本集提供冗餘和高可用性,並且是所有生產部署的基礎。

  • 複製提供冗餘並增加資料可用性,在不同資料庫伺服器上具有多個資料副本,複製可以提供一個級別的單一資料庫伺服器丟失的容錯能力。

  • 副本集至少需要3個成員,可以是一主兩從,也可以是一主一從一仲裁節點,如果主節點掛掉,兩個從節點會重新選舉,找到一個從節點,將其提升為主。

三、本次實踐介紹

3.1 實踐環境規劃

hostnameIP地址系統版本MongoDB版本角色
master 192.168.3.141 centos 7.9 v5.0.21 主節點
node01 192.168.3.142 centos 7.9 v5.0.21 從節點
node02 192.168.3.143 centos 7.9 v5.0.21 從節點

3.2 本次實踐簡介

1.本次實踐準備三臺伺服器,作業系統為centos7.9;
2.本次實踐環境為個人測試環境,生產環境請謹慎;
3.本次實踐主要配置MongoDB主從複製。

四、安裝MongoDB

4.1 安裝說明

  • 三臺伺服器都需要按照以下步驟安裝MongoDB環境。4.2 配置yum倉庫配置mongodb的yum倉庫

vim /etc/yum.repos.d/mongodb.repo
[mongodb-org]
name=MongoDB Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mongodb/yum/el7/
gpgcheck=0
enabled=1

4.3 檢查yum倉庫狀態

檢查yum倉庫各映象源狀態

[root@master ~]# yum repolist all |grep enable
base/7/x86_64 CentOS-7 - Base - mirrors.aliyun.com enabled: 10,072
extras/7/x86_64 CentOS-7 - Extras - mirrors.aliyun.com enabled: 518
mongodb-org/7 MongoDB Repository enabled: 337
updates/7/x86_64 CentOS-7 - Updates - mirrors.aliyun.com enabled: 5,176

4.4 安裝MongoDB

直接使用yum安裝mongodb

yum install -y mongodb-org-server mongodb-org

圖片

4.5 修改繫結IP

修改/etc/mongod.conf 配置檔案中的mongodb服務繫結的IP地址為0.0.0.0。

vim /etc/mongod.conf 

圖片

4.6 啟動MongoDB服務

啟動MongoDB服務

systemctl start mongod.service  && systemctl enable  mongod.service

4.7 檢查MongoDB服務狀態

檢查MongoDB服務狀態

[root@master ~]# systemctl status mongod
● mongod.service - MongoDB Database Server
Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2023-09-13 16:38:48 CST; 44s ago
Docs: https://docs.mongodb.org/manual
Main PID: 1472 (mongod)
CGroup: /system.slice/mongod.service
└─1472 /usr/bin/mongod -f /etc/mongod.conf

Sep 13 16:38:48 master systemd[1]: Started MongoDB Database Server.
Sep 13 16:38:48 master mongod[1472]: {"t":{"$date":"2023-09-13T08:38:48.292Z"},"s":"I", "c":"CONTROL", "id":7484500, "ctx":"-","msg":"Environment variable MONG... to false"}
Hint: Some lines were ellipsized, use -l to show in full.

4.8 檢視MongoDB版本

檢視當前安裝的MongoDB版本

[root@master ~]# mongod --version
db version v5.0.21
Build Info: {
"version": "5.0.21",
"gitVersion": "4fad44a858d8ee2d642566fc8872ef410f6534e4",
"openSSLVersion": "OpenSSL 1.0.1e-fips 11 Feb 2013",
"modules": [],
"allocator": "tcmalloc",
"environment": {
"distmod": "rhel70",
"distarch": "x86_64",
"target_arch": "x86_64"
}
}

五、master節點配置工作

5.1 進入mongodb資料庫

直接本地進入mongodb

mongo

圖片

5.2 建立admin賬號

在mongodb內建立使用者管理員admin賬號

db.createUser({
user: "admin",
pwd: "admin",
roles: [
{role: "userAdminAnyDatabase",db: "admin"}
]
}
)

圖片

5.3 建立測試賬號

進入admin資料庫內,使用admin賬號驗證登入。

>  use admin;
switched to db admin
> db.auth("admin", "admin")
1

圖片

在在mongodb內建立huawei使用者,使用者角色許可權為“root”。

db.createUser({
user: "huawei",
pwd: "huawei",
roles: [ "root" ]
}
)

圖片

5.4 訪問測試資料庫

使用admin賬號連線mongodb

mongo -uadmin -padmin --authenticationDatabase admin

圖片

5.5 在主節點建立key檔案

在主節點建立key檔案

mkdir -p /data/mongodb/
openssl rand -base64 666 > /data/mongodb/mongodb.key
  • 在兩個從節點建立目錄

mkdir -p /data/mongodb/

5.5 複製key檔案

將key檔案傳送兩個從節點

scp  /data/mongodb/mongodb.key root@192.168.3.142:/data/mongodb/
scp /data/mongodb/mongodb.key root@192.168.3.143:/data/mongodb/

圖片

六、所有節點配置工作

6.1 配置說明

  • 以下步驟,三個節點都需要執行。

6.2 目錄及檔案授權

在三個節點伺服器中,執行以下命令,對相關目錄及檔案進行授權操作·。

chown mongod:mongod -R /data/mongodb/
chmod 600 /data/mongodb/mongodb.key

圖片

6.3 編輯/etc/mongod.conf檔案

在三個節點伺服器中,編輯/etc/mongod.conf檔案。

systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27017
bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
security:
authorization: enabled
keyFile: /data/mongodb/mongodb.key
clusterAuthMode: keyFile
replication:
replSetName: rs0
oplogSizeMB: 5000

圖片

6.4 重啟mongodb服務

三個節點伺服器,重啟mongodb服務。

systemctl restart mongod

圖片

七、配置MongoDB主從

7.1 使用者認證

連線master節點的mongodb。

mongo

圖片

使用huawei賬號進行認證

> use admin;
switched to db admin
> db.auth("huawei","huawei")
1

圖片

7.2 配置副本集

執行以下命令,配置副本集。

rs.initiate({
_id : "rs0",
members: [
{ _id: 0, host: "192.168.3.141:27017" },
{ _id: 1, host: "192.168.3.142:27017" },
{ _id: 2, host: "192.168.3.143:27017" }
]
})

圖片

7.3 主庫檢視副本集配置

master主節點,退出mongodb,重新連線後,使用huawei賬號驗證。

  • 使用huawei賬號進行認證

 use admin;
db.auth("huawei","huawei")
  • 檢視副本集配置

rs.config()
rs0:PRIMARY>  rs.config()
{
"_id" : "rs0",
"version" : 1,
"term" : 1,
"members" : [
{
"_id" : 0,
"host" : "192.168.3.141:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.3.142:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.3.143:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
}
],
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("65018aed22234a6282b793a6")
}
}

7.4 檢視副本集狀態

檢視副本集狀態

rs0:PRIMARY>  rs.status()
{
"set" : "rs0",
"date" : ISODate("2023-09-13T10:18:54.675Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"votingMembersCount" : 3,
"writableVotingMembersCount" : 3,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2023-09-13T10:18:49.099Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2023-09-13T10:18:49.099Z"),
"lastDurableWallTime" : ISODate("2023-09-13T10:18:49.099Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1694600279, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2023-09-13T10:12:08.624Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(1694599918, 1),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1694599918, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2023-09-13T10:12:08.987Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2023-09-13T10:12:10.491Z")
},
"members" : [
{
"_id" : 0,
"name" : "192.168.3.141:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 834,
"optime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-09-13T10:18:49Z"),
"lastAppliedWallTime" : ISODate("2023-09-13T10:18:49.099Z"),
"lastDurableWallTime" : ISODate("2023-09-13T10:18:49.099Z"),
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1694599928, 1),
"electionDate" : ISODate("2023-09-13T10:12:08Z"),
"configVersion" : 1,
"configTerm" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.3.142:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 416,
"optime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-09-13T10:18:49Z"),
"optimeDurableDate" : ISODate("2023-09-13T10:18:49Z"),
"lastAppliedWallTime" : ISODate("2023-09-13T10:18:49.099Z"),
"lastDurableWallTime" : ISODate("2023-09-13T10:18:49.099Z"),
"lastHeartbeat" : ISODate("2023-09-13T10:18:54.667Z"),
"lastHeartbeatRecv" : ISODate("2023-09-13T10:18:54.192Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "192.168.3.141:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 1
},
{
"_id" : 2,
"name" : "192.168.3.143:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 416,
"optime" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1694600329, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-09-13T10:18:49Z"),
"optimeDurableDate" : ISODate("2023-09-13T10:18:49Z"),
"lastAppliedWallTime" : ISODate("2023-09-13T10:18:49.099Z"),
"lastDurableWallTime" : ISODate("2023-09-13T10:18:49.099Z"),
"lastHeartbeat" : ISODate("2023-09-13T10:18:54.667Z"),
"lastHeartbeatRecv" : ISODate("2023-09-13T10:18:54.192Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "192.168.3.141:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1694600329, 1),
"signature" : {
"hash" : BinData(0,"TEVJDeHnCzlM41kvfsK8m3GP4L8="),
"keyId" : NumberLong("7278251270563954692")
}
},
"operationTime" : Timestamp(1694600329, 1)
}

7.5 判斷主從節點

“primary” : “192.168.3.141:27017”,顯示192.168.3.141主機為主節點

rs.isMaster()
s0:PRIMARY> rs.isMaster()
{
"topologyVersion" : {
"processId" : ObjectId("6501894c22234a6282b7934f"),
"counter" : NumberLong(6)
},
"hosts" : [
"192.168.3.141:27017",
"192.168.3.142:27017",
"192.168.3.143:27017"
],
"setName" : "rs0",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.3.141:27017",
"me" : "192.168.3.141:27017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1694600459, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2023-09-13T10:20:59Z"),
"majorityOpTime" : {
"ts" : Timestamp(1694600459, 1),
"t" : NumberLong(1)
},
"majorityWriteDate" : ISODate("2023-09-13T10:20:59Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2023-09-13T10:21:02.808Z"),
"logicalSessionTimeoutMinutes" : 30,
"connectionId" : 15,
"minWireVersion" : 0,
"maxWireVersion" : 13,
"readOnly" : false,
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1694600459, 1),
"signature" : {
"hash" : BinData(0,"K6fiimpJmajEAl5G2IovptISfL4="),
"keyId" : NumberLong("7278251270563954692")
}
},
"operationTime" : Timestamp(1694600459, 1)
}

八、測試MongoDB主從切換

8.1 停止主庫的mongodb服務

停止主庫的mongodb服務

systemctl stop mongod.service 

圖片

8.2 檢視從庫狀態

其他從節點登入mongodb,檢視mongodb的角色,發現node01節點已經切換為主庫。

mongo

圖片

MongoDB資料庫之主從複製配置實戰
https://mp.weixin.qq.com/s/PS_yPjuyy-HiH8hw4ytU_Q

相關文章