MongoDB安裝、羣集原理

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等第三方連接從節點可以讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章