一、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 實踐環境規劃
hostname | IP地址 | 系統版本 | 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 1648 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 1648 master systemd[1]: Started MongoDB Database Server. Sep 13 1648 master mongod[1472]: {"t":{"$date":"2023-09-13T0848.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-13T1054.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-13T1049.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-13T1049.099Z"), "lastDurableWallTime" : ISODate("2023-09-13T1049.099Z") }, "lastStableRecoveryTimestamp" : Timestamp(1694600279, 1), "electionCandidateMetrics" : { "lastElectionReason" : "electionTimeout", "lastElectionDate" : ISODate("2023-09-13T1008.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-13T1008.987Z"), "wMajorityWriteAvailabilityDate" : ISODate("2023-09-13T1010.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-13T1049Z"), "lastAppliedWallTime" : ISODate("2023-09-13T1049.099Z"), "lastDurableWallTime" : ISODate("2023-09-13T1049.099Z"), "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "electionTime" : Timestamp(1694599928, 1), "electionDate" : ISODate("2023-09-13T1008Z"), "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-13T1049Z"), "optimeDurableDate" : ISODate("2023-09-13T1049Z"), "lastAppliedWallTime" : ISODate("2023-09-13T1049.099Z"), "lastDurableWallTime" : ISODate("2023-09-13T1049.099Z"), "lastHeartbeat" : ISODate("2023-09-13T1054.667Z"), "lastHeartbeatRecv" : ISODate("2023-09-13T1054.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-13T1049Z"), "optimeDurableDate" : ISODate("2023-09-13T1049Z"), "lastAppliedWallTime" : ISODate("2023-09-13T1049.099Z"), "lastDurableWallTime" : ISODate("2023-09-13T1049.099Z"), "lastHeartbeat" : ISODate("2023-09-13T1054.667Z"), "lastHeartbeatRecv" : ISODate("2023-09-13T1054.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-13T1059Z"), "majorityOpTime" : { "ts" : Timestamp(1694600459, 1), "t" : NumberLong(1) }, "majorityWriteDate" : ISODate("2023-09-13T1059Z") }, "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 100000, "localTime" : ISODate("2023-09-13T1002.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
審核編輯:黃飛
-
數據庫
+關注
關注
7文章
3712瀏覽量
64023 -
mongodb
+關注
關注
0文章
22瀏覽量
353
原文標題:八、測試MongoDB主從切換
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論