MongoDB安裝、羣集原理
安裝
-
Windows
直接在官網下載
配置文件爲安裝路徑下/bin/mongod.cfg
啓動:net start mongodb
停止:net stop mongodb
-
Mac(解壓包安裝)
去下載官網TGZ包,在電腦解壓,進入/bin
目錄輸入./mongod
即可運行,不推薦使用,所有配置必須啓動時帶命令參數 -
Mac(brew安裝)
MongoDB 不再開源 brew install mongodb 命令下載不了
使用brew install [email protected]
下載
安裝完成後各文件路徑
配置文件:/usr/local/etc/mongod.conf
日誌目錄路徑:/usr/local/var/log/mongodb
數據目錄路徑:/usr/local/var/mongodb
3.0版本以前配置文件:
dbpath=/data/mongodb/data/mongod
logpath=/data/mongodb/logs/mongo.log
logappend=true
bind_ip=127.0.0.1
port=27017
fork=true
journal=true
3.0版本以後配置文件:
- 注意:
只能使用空格,不支持tab鍵
systemLog:
destination: file
path: /usr/local/var/log/mongodb/mongo.log
logAppend: true
storage:
dbPath: /usr/local/var/mongodb
net:
bindIp: 127.0.0.1
安裝完成後可以在終端輸入
查看版本:./mongod --verison
啓動:./mongod --config 配置文件路徑
MongoDB默認不是支持遠程連接,只能自己電腦連接,修改配置文件:bindIp: 127.0.0.1
-> bindIp: 0.0.0.0
羣集
MongoDB羣集分爲兩種:主從和副本集。主從形式已經不使用了(這裏簡單描述一下),現在都使用副本集(自帶主從)。
-
配置主從服務器(老版本)
在主MongoDB配置文件中添加:
master = true
在從MongoDB配置文件中添加:
slave = true
用於從節點,指定從節點的複製來源(主節點的IP+端口),source = 主節點IP:主節點端口
-
配置副本集
主從兩臺服務配置文件均添加
replication:
#設置oplog的大小(MB)
oplogSizeMB: 20480
#集羣名稱
replSetName: rs
在任意一臺機器執行mongo
命令登錄數據庫,執行:
rs.initiate({_id:"rs",members:[
{_id:0,host:"第一臺機器IP:端口"},
{_id:1,host:"第二臺機器IP:端口"},
{_id:2,host:" 第三臺機器IP:端口"}]})
輸入rs.status()
可以查看集羣狀態
{
"set" : "rs",
"date" : ISODate("2020-02-08T06:34:04.161Z"),
"myState" : 1,
"term" : NumberLong(18),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1581143634, 1),
"t" : NumberLong(18)
},
"lastCommittedWallTime" : ISODate("2020-02-08T06:33:54.866Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1581143634, 1),
"t" : NumberLong(18)
},
"readConcernMajorityWallTime" : ISODate("2020-02-08T06:33:54.866Z"),
"appliedOpTime" : {
"ts" : Timestamp(1581143634, 1),
"t" : NumberLong(18)
},
"durableOpTime" : {
"ts" : Timestamp(1581143634, 1),
"t" : NumberLong(18)
},
"lastAppliedWallTime" : ISODate("2020-02-08T06:33:54.866Z"),
"lastDurableWallTime" : ISODate("2020-02-08T06:33:54.866Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1581143584, 1),
"lastStableCheckpointTimestamp" : Timestamp(1581143584, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2020-02-08T03:21:07.501Z"),
"electionTerm" : NumberLong(18),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(1581132043, 1),
"t" : NumberLong(16)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1581132043, 1),
"t" : NumberLong(16)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2020-02-08T03:21:08.120Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2020-02-08T03:21:09.308Z")
},
"members" : [
{
"_id" : 0,
"name" : "192.168.124.8:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 11588,
"optime" : {
"ts" : Timestamp(1581143634, 1),
"t" : NumberLong(18)
},
"optimeDate" : ISODate("2020-02-08T06:33:54Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1581132067, 1),
"electionDate" : ISODate("2020-02-08T03:21:07Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.124.20:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 11562,
"optime" : {
"ts" : Timestamp(1581143634, 1),
"t" : NumberLong(18)
},
"optimeDurable" : {
"ts" : Timestamp(1581143634, 1),
"t" : NumberLong(18)
},
"optimeDate" : ISODate("2020-02-08T06:33:54Z"),
"optimeDurableDate" : ISODate("2020-02-08T06:33:54Z"),
"lastHeartbeat" : ISODate("2020-02-08T06:34:03.483Z"),
"lastHeartbeatRecv" : ISODate("2020-02-08T06:34:02.149Z"),
"pingMs" : NumberLong(45),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.124.8:27017",
"syncSourceHost" : "192.168.124.8:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1581143634, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1581143634, 1)
}
副本集同步數據過程
Primary節點寫入數據,Secondary通過讀取Primary的oplog得到複製信息,開始複製數據並且將複製信息寫入到自己的oplog。如果某個操作失敗,則備份節點停止從當前數據源複製數據。如果某個備份節點由於某些原因掛掉了,當重新啓動後,就會自動從oplog的最後一個操作開始同步,同步完成後,將信息寫入自己的oplog,由於複製操作是先複製數據,複製完成後再寫入oplog,有可能相同的操作會同步兩份,不過MongoDB在設計之初就考慮到這個問題,將oplog的同一個操作執行多次,與執行一次的效果是一樣的。簡單的說就是:
當Primary節點完成數據操作後,Secondary會做出一系列的動作保證數據的同步:
1:檢查自己local庫的oplog.rs集合找出最近的時間戳。
2:檢查Primary節點local庫oplog.rs集合,找出大於此時間戳的記錄。
3:將找到的記錄插入到自己的oplog.rs集合中,並執行這些操作
副本集的同步和主從同步一樣,都是異步同步的過程,不同的是副本集有個自動故障轉移的功能。其原理是:slave端從primary端獲取日誌,然後在自己身上完全順序的執行日誌所記錄的各種操作(該日誌是不記錄查詢操作的),這個日誌就是local數據 庫中的oplog.rs表,默認在64位機器上這個表是比較大的,佔磁盤大小的5%,oplog.rs的大小可以在啓動參數中設 定:–oplogSize 1000,單位是M。
注意:在副本集的環境中,要是所有的Secondary都宕機了,只剩下Primary。最後Primary會變成Secondary,只能提供讀服務。
- 注:
在配置副本集時候可以指定權重,權重高的優先當主節點。
常規節點(standard):參與投票有可能成爲活躍節點
副本節點(passive):參與投票,不能成爲活躍節點
仲裁節點(atbiter):只參與投票,不復制節點,也不能成爲活躍節點
priority:0——1000之間,0代表副本節點,其它代表常規節點
rs.initiate({_id:"rs",members:[
{_id:0,host:"第一臺機器IP:端口",priority:2},
{_id:1,host:"第二臺機器IP:端口",priority:1},
{_id:2,host:" 第三臺機器IP:端口",arbiterOnly:true}]})
- 容忍數:
假設複製集內投票成員(後續介紹)數量爲 N,則大多數爲 N/2 + 1,當複製集內存活成員數量不足大多數時,整個複製集將無法選舉出 Primary,複製集將無法提供寫服務,處於只讀狀態。
投票成員數 | 大多數 | 容忍失敗數 |
---|---|---|
1 | 1 | 0 |
2 | 2 | 0 |
3 | 2 | 1 |
4 | 3 | 1 |
5 | 3 | 2 |
注意:mongodb默認是從主節點讀寫數據的,副本節點上不允許讀,需要設置副本節點可以讀:
repset:SECONDARY> db.getMongo().setSlaveOk();
用程序連接或navicat等第三方連接從節點可以讀