MongoDB 副本集 Replica Sets 搭建

MongoDB 副本集 Replica Sets 搭建

一 .三種角色 說明

1. 主要成員(Primary):主要接收全部寫操做。就是主節點。 shell

2. 副本成員(Replicate):從主節點經過複製操做以維護相同的數據集,即備份數據,不可寫操做,但可以讀操做(但須要配置)。是默認的一種從節點類型。centos

3.  仲裁者(Arbiter):不保留任何數據的副本,只具備投票選舉做用。固然也能夠將仲裁服務器維護爲副本集的一部分,即副本成員同時也能夠是仲裁者。也是一種從節點類型。數組

關於仲裁者的額外說明:

您能夠將額外的mongod實例添加到副本集做爲仲裁者。 仲裁者不維護數據集。 仲裁者的目的是經過響應其餘副本集成員的心跳和選舉請求來維護副本集中的仲裁。 由於它們不存儲數據集,因此仲裁器可以是提供副本集仲裁功能的好方法,其資源成本比具備數據集的全功能副本集成員更便宜。 服務器

若是您的副本集具備偶數個成員,請添加仲裁者以得到主要選舉中的 大多數 投票。 仲裁者不須要專用 硬件。

 

仲裁者將永遠是仲裁者,而主要人員可能會退出併成爲次要人員,而次要人員可能成爲選舉期間的主要人員。 網絡

若是你的副本 + 主節點的個數是偶數,建議加一個仲裁者,造成奇數,容易知足大多數的投票。
 
若是你的副本 + 主節點的個數是奇數,能夠不加仲裁者

二. 副本集架構目標

一主一副本 一仲裁

1. 建立三個目錄 隔離三個配置、數據、日誌

myrs_27017  myrs_27018 myrs_27019

[root@VM_0_7_centos mongo]# pwd
/usr/local/mongo
[root@VM_0_7_centos mongo]# ll
total 32
drwxr-xr-x 4 root root 4096 Oct  9 21:20 data
drwxr-xr-x 2 root root 4096 Oct  6 20:30 data28128
drwxr-xr-x 2 root root 4096 Oct  6 20:30 logs
-rw-r--r-- 1 root root  172 Oct  6 20:32 mongo28128.conf
-rw-r--r-- 1 root root  162 Sep 28 22:28 mongo.conf
drwxr-xr-x 4 root root 4096 Oct  9 21:44 myrs_27017
drwxr-xr-x 4 root root 4096 Oct  9 22:05 myrs_27018
drwxr-xr-x 4 root root 4096 Oct  9 21:58 myrs_27019

2. 在每一個目錄中建立 如下文件及目錄

mongod.conf            配置文件架構

/data/db                    數據目錄app

/log/                         日誌目錄測試

/log/mongod.log      日誌文件ui

3. 配置文件內容

以27017 爲例,修改 2701八、27019spa

bind_ip=0.0.0.0
#對應端口
port=27017
#數據目錄
dbpath=/usr/local/mongo/myrs_27017/data/db
#日誌文件
logpath=/usr/local/mongo/myrs_27017/log/mongod.log
logappend=true
journal=true
maxConns=2000
fork=true
#副本集名稱
replSet=myrs

4. 啓動三個Mongo服務

[root@VM_0_7_centos myrs_27017]# mongod -f /usr/local/mongo/myrs_27017/mongo.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 25929
child process started successfully, parent exiting
[root@VM_0_7_centos myrs_27017]# mongod -f /usr/local/mongo/myrs_27018/mongo.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 26061
child process started successfully, parent exiting
[root@VM_0_7_centos myrs_27017]# mongod -f /usr/local/mongo/myrs_27019/mongo.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 26159
child process started successfully, parent exiting

5. 登陸主機
 

mongo --host 172.21.0.7:27017

6. 使用默認配置初始化副本集

示例:

提示:
1 「ok」 的值爲 1 ,說明建立成功。
2 )命令行提示符發生變化,變成了一個從節點角色,此時默認不能讀寫。稍等片刻,回車,變成主節 點。
 

7. 查看副本集的配置 rs.config()

rs.conf(configuration)   別名 rs.config()
confifiguration :可選,若是沒有配置,則使用默認主節點配置。 .
 
myrs:PRIMARY> rs.config()
{
	"_id" : "myrs",
	"version" : 5,
	"protocolVersion" : NumberLong(1),
	"writeConcernMajorityJournalDefault" : true,
	"members" : [
		{
			"_id" : 0,
			"host" : "VM_0_7_centos:27017",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		}
	],
	"settings" : {
		"chainingAllowed" : true,
		"heartbeatIntervalMillis" : 2000,
		"heartbeatTimeoutSecs" : 10,
		"electionTimeoutMillis" : 10000,
		"catchUpTimeoutMillis" : -1,
		"catchUpTakeoverDelayMillis" : 30000,
		"getLastErrorModes" : {
			
		},
		"getLastErrorDefaults" : {
			"w" : 1,
			"wtimeout" : 0
		},
		"replicaSetId" : ObjectId("5f806d1896301db3f14d0412")
	}
}

 

本質是查詢system.replset表中的數據
myrs:PRIMARY> use local
switched to db local
myrs:PRIMARY> show collections
oplog.rs
replset.election
replset.minvalid
replset.oplogTruncateAfterPoint
startup_log
system.replset
system.rollback.id
myrs:PRIMARY> db.system.replset.find()
{ "_id" : "myrs", "version" : 5, "protocolVersion" : NumberLong(1), "writeConcernMajorityJournalDefault" : true, "members" : [ { "_id" : 0, "host" : "VM_0_7_centos:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : {  }, "slaveDelay" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : -1, "catchUpTakeoverDelayMillis" : 30000, "getLastErrorModes" : {  }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("5f806d1896301db3f14d0412") } }

 

 8. 查看副本集的狀態 rs.status()

說明 :

    "set" : "myrs",:副本集的名稱

    "myState" : 1,說明狀態正常

    "members" : [  副本集成員數組。

myrs:PRIMARY> rs.status()
{
	"set" : "myrs",
	"date" : ISODate("2020-10-10T08:01:46.987Z"),
	"myState" : 1,
	"term" : NumberLong(2),
	"syncingTo" : "",
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"majorityVoteCount" : 1,
	"writeMajorityCount" : 1,
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1602316900, 1),
			"t" : NumberLong(2)
		},
		"lastCommittedWallTime" : ISODate("2020-10-10T08:01:40.808Z"),
		"readConcernMajorityOpTime" : {
			"ts" : Timestamp(1602316900, 1),
			"t" : NumberLong(2)
		},
		"readConcernMajorityWallTime" : ISODate("2020-10-10T08:01:40.808Z"),
		"appliedOpTime" : {
			"ts" : Timestamp(1602316900, 1),
			"t" : NumberLong(2)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1602316900, 1),
			"t" : NumberLong(2)
		},
		"lastAppliedWallTime" : ISODate("2020-10-10T08:01:40.808Z"),
		"lastDurableWallTime" : ISODate("2020-10-10T08:01:40.808Z")
	},
	"lastStableRecoveryTimestamp" : Timestamp(1602316880, 1),
	"lastStableCheckpointTimestamp" : Timestamp(1602316880, 1),
	"electionCandidateMetrics" : {
		"lastElectionReason" : "electionTimeout",
		"lastElectionDate" : ISODate("2020-10-10T07:41:00.774Z"),
		"electionTerm" : NumberLong(2),
		"lastCommittedOpTimeAtElection" : {
			"ts" : Timestamp(0, 0),
			"t" : NumberLong(-1)
		},
		"lastSeenOpTimeAtElection" : {
			"ts" : Timestamp(1602253127, 1),
			"t" : NumberLong(1)
		},
		"numVotesNeeded" : 2,
		"priorityAtElection" : 1,
		"electionTimeoutMillis" : NumberLong(10000),
		"numCatchUpOps" : NumberLong(0),
		"newTermStartDate" : ISODate("2020-10-10T07:41:00.783Z"),
		"wMajorityWriteAvailabilityDate" : ISODate("2020-10-10T07:41:01.749Z")
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "VM_0_7_centos:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 1281,
			"optime" : {
				"ts" : Timestamp(1602316900, 1),
				"t" : NumberLong(2)
			},
			"optimeDate" : ISODate("2020-10-10T08:01:40Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1602315660, 1),
			"electionDate" : ISODate("2020-10-10T07:41:00Z"),
			"configVersion" : 5,
			"self" : true,
			"lastHeartbeatMessage" : ""
		}
	],
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1602316900, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1602316900, 1)
}
myrs:PRIMARY>

9. 添加 副本從節點

rs.add(host, arbiterOnly)
 
主機成員的配置文檔:
{  
    _id: <int>,
 host: <string>, // required
 arbiterOnly: <boolean>,
 buildIndexes: <boolean>,
 hidden: <boolean>, 
 priority: <number>, 
 tags: <document>, 
 slaveDelay: <int>, 
 votes: <number>
}
將27018的副本節點添加到副本集中:
myrs:PRIMARY> rs.add("172.21.0.7:27018")
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1602317234, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1602317234, 1)
}

OK:1 說明添加成功

此時查看副本集的狀態: 

members中增長了27018  ,其角色是"stateStr" : "SECONDARY",

myrs:PRIMARY> rs.status()
{
	"set" : "myrs",
	"date" : ISODate("2020-10-10T08:08:05.179Z"),
	"myState" : 1,
	"term" : NumberLong(2),
	"syncingTo" : "",
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"majorityVoteCount" : 2,
	"writeMajorityCount" : 2,
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1602317280, 1),
			"t" : NumberLong(2)
		},
		"lastCommittedWallTime" : ISODate("2020-10-10T08:08:00.815Z"),
		"readConcernMajorityOpTime" : {
			"ts" : Timestamp(1602317280, 1),
			"t" : NumberLong(2)
		},
		"readConcernMajorityWallTime" : ISODate("2020-10-10T08:08:00.815Z"),
		"appliedOpTime" : {
			"ts" : Timestamp(1602317280, 1),
			"t" : NumberLong(2)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1602317280, 1),
			"t" : NumberLong(2)
		},
		"lastAppliedWallTime" : ISODate("2020-10-10T08:08:00.815Z"),
		"lastDurableWallTime" : ISODate("2020-10-10T08:08:00.815Z")
	},
	"lastStableRecoveryTimestamp" : Timestamp(1602317234, 1),
	"lastStableCheckpointTimestamp" : Timestamp(1602317234, 1),
	"electionCandidateMetrics" : {
		"lastElectionReason" : "electionTimeout",
		"lastElectionDate" : ISODate("2020-10-10T07:41:00.774Z"),
		"electionTerm" : NumberLong(2),
		"lastCommittedOpTimeAtElection" : {
			"ts" : Timestamp(0, 0),
			"t" : NumberLong(-1)
		},
		"lastSeenOpTimeAtElection" : {
			"ts" : Timestamp(1602253127, 1),
			"t" : NumberLong(1)
		},
		"numVotesNeeded" : 2,
		"priorityAtElection" : 1,
		"electionTimeoutMillis" : NumberLong(10000),
		"numCatchUpOps" : NumberLong(0),
		"newTermStartDate" : ISODate("2020-10-10T07:41:00.783Z"),
		"wMajorityWriteAvailabilityDate" : ISODate("2020-10-10T07:41:01.749Z")
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "VM_0_7_centos:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 1660,
			"optime" : {
				"ts" : Timestamp(1602317280, 1),
				"t" : NumberLong(2)
			},
			"optimeDate" : ISODate("2020-10-10T08:08:00Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1602315660, 1),
			"electionDate" : ISODate("2020-10-10T07:41:00Z"),
			"configVersion" : 6,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
		{
			"_id" : 1,
			"name" : "172.21.0.7:27018",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 48,
			"optime" : {
				"ts" : Timestamp(1602317280, 1),
				"t" : NumberLong(2)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1602317280, 1),
				"t" : NumberLong(2)
			},
			"optimeDate" : ISODate("2020-10-10T08:08:00Z"),
			"optimeDurableDate" : ISODate("2020-10-10T08:08:00Z"),
			"lastHeartbeat" : ISODate("2020-10-10T08:08:04.632Z"),
			"lastHeartbeatRecv" : ISODate("2020-10-10T08:08:03.633Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "VM_0_7_centos:27017",
			"syncSourceHost" : "VM_0_7_centos:27017",
			"syncSourceId" : 0,
			"infoMessage" : "",
			"configVersion" : 6
		}
	],
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1602317280, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1602317280, 1)
}

10.添加仲裁從節點

添加仲裁節點到副本集

rs.addArb(host)

將27019以仲裁節點添加到副本集中

myrs:PRIMARY> rs.addArb("172.21.0.7:27019")
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1602317560, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1602317560, 1)
}

此時查看副本集狀態

myrs:PRIMARY> rs.status()
{
	"set" : "myrs",
	"date" : ISODate("2020-10-10T08:13:09.745Z"),
	"myState" : 1,
	"term" : NumberLong(2),
	"syncingTo" : "",
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"majorityVoteCount" : 2,
	"writeMajorityCount" : 2,
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1602317580, 1),
			"t" : NumberLong(2)
		},
		"lastCommittedWallTime" : ISODate("2020-10-10T08:13:00.821Z"),
		"readConcernMajorityOpTime" : {
			"ts" : Timestamp(1602317580, 1),
			"t" : NumberLong(2)
		},
		"readConcernMajorityWallTime" : ISODate("2020-10-10T08:13:00.821Z"),
		"appliedOpTime" : {
			"ts" : Timestamp(1602317580, 1),
			"t" : NumberLong(2)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1602317580, 1),
			"t" : NumberLong(2)
		},
		"lastAppliedWallTime" : ISODate("2020-10-10T08:13:00.821Z"),
		"lastDurableWallTime" : ISODate("2020-10-10T08:13:00.821Z")
	},
	"lastStableRecoveryTimestamp" : Timestamp(1602317540, 1),
	"lastStableCheckpointTimestamp" : Timestamp(1602317540, 1),
	"electionCandidateMetrics" : {
		"lastElectionReason" : "electionTimeout",
		"lastElectionDate" : ISODate("2020-10-10T07:41:00.774Z"),
		"electionTerm" : NumberLong(2),
		"lastCommittedOpTimeAtElection" : {
			"ts" : Timestamp(0, 0),
			"t" : NumberLong(-1)
		},
		"lastSeenOpTimeAtElection" : {
			"ts" : Timestamp(1602253127, 1),
			"t" : NumberLong(1)
		},
		"numVotesNeeded" : 2,
		"priorityAtElection" : 1,
		"electionTimeoutMillis" : NumberLong(10000),
		"numCatchUpOps" : NumberLong(0),
		"newTermStartDate" : ISODate("2020-10-10T07:41:00.783Z"),
		"wMajorityWriteAvailabilityDate" : ISODate("2020-10-10T07:41:01.749Z")
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "VM_0_7_centos:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 1964,
			"optime" : {
				"ts" : Timestamp(1602317580, 1),
				"t" : NumberLong(2)
			},
			"optimeDate" : ISODate("2020-10-10T08:13:00Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1602315660, 1),
			"electionDate" : ISODate("2020-10-10T07:41:00Z"),
			"configVersion" : 7,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
		{
			"_id" : 1,
			"name" : "172.21.0.7:27018",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 353,
			"optime" : {
				"ts" : Timestamp(1602317580, 1),
				"t" : NumberLong(2)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1602317580, 1),
				"t" : NumberLong(2)
			},
			"optimeDate" : ISODate("2020-10-10T08:13:00Z"),
			"optimeDurableDate" : ISODate("2020-10-10T08:13:00Z"),
			"lastHeartbeat" : ISODate("2020-10-10T08:13:08.288Z"),
			"lastHeartbeatRecv" : ISODate("2020-10-10T08:13:08.292Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "VM_0_7_centos:27017",
			"syncSourceHost" : "VM_0_7_centos:27017",
			"syncSourceId" : 0,
			"infoMessage" : "",
			"configVersion" : 7
		},
		{
			"_id" : 2,
			"name" : "172.21.0.7:27019",
			"health" : 1,
			"state" : 7,
			"stateStr" : "ARBITER",
			"uptime" : 27,
			"lastHeartbeat" : ISODate("2020-10-10T08:13:08.290Z"),
			"lastHeartbeatRecv" : ISODate("2020-10-10T08:13:08.293Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : 7
		}
	],
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1602317580, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1602317580, 1)
}
myrs:PRIMARY>

說明

            "name" : "172.21.0.7:27019", 名稱
            "health" : 1,         健康
            "state" : 7,
            "stateStr" : "ARBITER",  狀態是仲裁者

11 . 副本集的數據讀寫操做

11.1 主節點寫入數據

myrs:PRIMARY> show dbs
admin      0.000GB
articledb  0.000GB
config     0.000GB
local      0.000GB
myrs:PRIMARY> use articledb
switched to db articledb
myrs:PRIMARY> db.content.insert({title:'AAA',content:'BBB'})
WriteResult({ "nInserted" : 1 })
myrs:PRIMARY> db.content.find()
{ "_id" : ObjectId("5f817a179595bc6e7dfc444c"), "title" : "AAA", "content" : "BBB" }
myrs:PRIMARY>

11.2 副節點嘗試讀數據

myrs:SECONDARY> show dbs
2020-10-10T17:10:01.034+0800 E  QUERY    [js] uncaught exception: Error: listDatabases failed:{
	"operationTime" : Timestamp(1602321000, 1),
	"ok" : 0,
	"errmsg" : "not master and slaveOk=false",
	"code" : 13435,
	"codeName" : "NotMasterNoSlaveOk",
	"$clusterTime" : {
		"clusterTime" : Timestamp(1602321000, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs/<@src/mongo/shell/mongo.js:135:19
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:87:12
shellHelper.show@src/mongo/shell/utils.js:906:13
shellHelper@src/mongo/shell/utils.js:790:15
@(shellhelp2):1:1
myrs:SECONDARY>

發現,不能讀取集合的數據。當前從節點只是一個備份,不是奴隸節點,沒法讀取數據,寫固然更不行。由於默認狀況下,從節點是沒有讀寫權限的,能夠增長讀的權限,但須要進行設置

11.3 副節點設置 與 取消 讀操做權限

rs.slaveOk()  
或 
rs.slaveOk(true)

設置爲奴隸節點,容許在從成員上運行讀的操做

myrs:SECONDARY> rs.slaveOk(true)
myrs:SECONDARY> show dbs
admin      0.000GB
articledb  0.000GB
config     0.000GB
local      0.000GB
myrs:SECONDARY> use articledb
switched to db articledb
myrs:SECONDARY> db.content.find()
{ "_id" : ObjectId("5f817a179595bc6e7dfc444c"), "title" : "AAA", "content" : "BBB" }
myrs:SECONDARY>

如今可實現了讀寫分離,讓主插入數據,讓歷來讀取數據。
若是要取消做爲奴隸節點的讀權限:

myrs:SECONDARY> rs.slaveOk(false)
myrs:SECONDARY> show dbs
2020-10-10T17:14:34.613+0800 E  QUERY    [js] uncaught exception: Error: listDatabases failed:{
	"operationTime" : Timestamp(1602321270, 1),
	"ok" : 0,
	"errmsg" : "not master and slaveOk=false",
	"code" : 13435,
	"codeName" : "NotMasterNoSlaveOk",
	"$clusterTime" : {
		"clusterTime" : Timestamp(1602321270, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs/<@src/mongo/shell/mongo.js:135:19
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:87:12
shellHelper.show@src/mongo/shell/utils.js:906:13
shellHelper@src/mongo/shell/utils.js:790:15
@(shellhelp2):1:1
myrs:SECONDARY> rs.slaveOk(true)

衝裁者 節點,不存聽任何業務數據的,能夠登陸查看

先配置爲奴隸節點賦予讀權限,再查看數據。

myrs:ARBITER> rs.slaveOk()
myrs:ARBITER> show dbs
local  0.000GB
myrs:ARBITER> use local
switched to db local
myrs:ARBITER> show collections
replset.election
replset.minvalid
replset.oplogTruncateAfterPoint
startup_log
system.replset
system.rollback.id
myrs:ARBITER>

12 . 主節點的選舉原則


MongoDB在副本集中,會自動進行主節點的選舉,主節點選舉的觸發條件:
1) 主節點故障
2) 主節點網絡不可達(默認心跳信息爲10秒)
3) 人工干預(rs.stepDown(600))

一旦觸發選舉,就要根據必定規則來選主節點。
選舉規則是根據票數來決定誰獲勝:

  • 票數最高,且得到了「大多數」成員的投票支持的節點獲勝。

    「大多數」的定義爲:假設複製集內投票成員數量爲N,則大多數爲 N/2 + 1。例如:3個投票成員,則大多數的值是2。當複製集內存活成員數量不足大多數時,整個複製集將沒法選舉出Primary,
    複製集將沒法提供寫服務,處於只讀狀態。

  • 若票數相同,且都得到了「大多數」成員的投票支持的,數據新的節點獲勝。

    數據的新舊是經過操做日誌oplog來對比的。

在得到票數的時候,優先級(priority)參數影響重大。能夠經過設置優先級(priority)來設置額外票數。優先級即權重,取值爲0-1000,至關於可額外增長 0-1000的票數,優先級的值越大,就越可能得到多數成員的投票(votes)數。指定較高的值可以使成員 更有資格成爲主要成員,更低的值可以使成員更不符合條件。


默認狀況下,優先級的值是1

經過rs.conf()命令查看每一個members中的優先級字段 prioriry 

myrs:ARBITER> rs.conf()
{
	"_id" : "myrs",
	"version" : 7,
	"protocolVersion" : NumberLong(1),
	"writeConcernMajorityJournalDefault" : true,
	"members" : [
		{
			"_id" : 0,
			"host" : "VM_0_7_centos:27017",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		},
		{
			"_id" : 1,
			"host" : "172.21.0.7:27018",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		},
		{
			"_id" : 2,
			"host" : "172.21.0.7:27019",
			"arbiterOnly" : true,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 0,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		}
	],
	"settings" : {
		"chainingAllowed" : true,
		"heartbeatIntervalMillis" : 2000,
		"heartbeatTimeoutSecs" : 10,
		"electionTimeoutMillis" : 10000,
		"catchUpTimeoutMillis" : -1,
		"catchUpTakeoverDelayMillis" : 30000,
		"getLastErrorModes" : {
			
		},
		"getLastErrorDefaults" : {
			"w" : 1,
			"wtimeout" : 0
		},
		"replicaSetId" : ObjectId("5f806d1896301db3f14d0412")
	}
}


能夠看出,主節點和副本節點的優先級各爲1,即,默承認以認爲都已經有了一票。但選舉節點,優先級是0,(要注意是,官方說了,選舉節點的優先級必須是0,不能是別的值。即不具有選舉權,但具備投票權)

修改優先級方法:

1)先將配置導入cfg變量

myrs:SECONDARY> cfg=rs.conf()


2)而後修改值(ID號默認從0開始):

myrs:SECONDARY> cfg.members[1].priority=2
2


3)從新加載配置  須要在主機操做。
myrs:SECONDARY> rs.reconfig(cfg) 
稍等片刻會從新開始選舉。

13. 故障測試

13.1 副本節點故障測試

關閉27018副本節點:

使用127.0.0.1:27018登陸, 不然提示

"errmsg" : "shutdown must run from localhost when running db without auth",

 

[root@VM_0_7_centos ~]# mongo --host 127.0.0.1:27018
....

myrs:SECONDARY> use admin 
switched to db admin
myrs:SECONDARY> db.shutdownServer()


發現,主節點和仲裁節點對27018的心跳失敗。由於主節點還在,所以,沒有觸發投票選舉。
若是此時,在主節點寫入數據。

myrs:PRIMARY> db.content.insert({title:'CCC',content:'DDD'})
WriteResult({ "nInserted" : 1 })

重啓 副節點,配置讀權限,再進行讀數據

myrs:SECONDARY> rs.slaveOk()
myrs:SECONDARY> show dbs
admin      0.000GB
articledb  0.000GB
config     0.000GB
local      0.000GB
myrs:SECONDARY> use articledb
switched to db articledb
myrs:SECONDARY> db.content.find()
{ "_id" : ObjectId("5f817a179595bc6e7dfc444c"), "title" : "AAA", "content" : "BBB" }
{ "_id" : ObjectId("5f8180369595bc6e7dfc444d"), "title" : "CCC", "content" : "DDD" }
myrs:SECONDARY>

數據已經同步過來了

13.2 主節點故障測試

關閉27017節點
發現,從節點和仲裁節點對27017的心跳失敗,當失敗超過10秒,此時由於沒有主節點了,會自動發起
投票。
而副本節點只有27018,所以,候選人只有一個就是27018,開始投票。
27019向27018投了一票,27018自己自帶一票,所以共兩票,超過了「大多數」
27019是仲裁節點,沒有選舉權,27018不向其投票,其票數是0.
最終結果,27018成爲主節點。具有讀寫功能。
在27018寫入數據查看。

主節點關閉,再啓動,使用27018查看狀態

myrs:SECONDARY> rs.status()
{
	"set" : "myrs",
	"date" : ISODate("2020-10-10T09:40:44.700Z"),
	"myState" : 1,
	"term" : NumberLong(3),
	"syncingTo" : "",
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"majorityVoteCount" : 2,
	"writeMajorityCount" : 2,
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1602322836, 1),
			"t" : NumberLong(3)
		},
		"lastCommittedWallTime" : ISODate("2020-10-10T09:40:36.790Z"),
		"readConcernMajorityOpTime" : {
			"ts" : Timestamp(1602322836, 1),
			"t" : NumberLong(3)
		},
		"readConcernMajorityWallTime" : ISODate("2020-10-10T09:40:36.790Z"),
		"appliedOpTime" : {
			"ts" : Timestamp(1602322836, 1),
			"t" : NumberLong(3)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1602322836, 1),
			"t" : NumberLong(3)
		},
		"lastAppliedWallTime" : ISODate("2020-10-10T09:40:36.790Z"),
		"lastDurableWallTime" : ISODate("2020-10-10T09:40:36.790Z")
	},
	"lastStableRecoveryTimestamp" : Timestamp(1602322780, 1),
	"lastStableCheckpointTimestamp" : Timestamp(1602322780, 1),
	"electionCandidateMetrics" : {
		"lastElectionReason" : "stepUpRequestSkipDryRun",
		"lastElectionDate" : ISODate("2020-10-10T09:39:46.784Z"),
		"electionTerm" : NumberLong(3),
		"lastCommittedOpTimeAtElection" : {
			"ts" : Timestamp(1602322780, 1),
			"t" : NumberLong(2)
		},
		"lastSeenOpTimeAtElection" : {
			"ts" : Timestamp(1602322780, 1),
			"t" : NumberLong(2)
		},
		"numVotesNeeded" : 2,
		"priorityAtElection" : 1,
		"electionTimeoutMillis" : NumberLong(10000),
		"priorPrimaryMemberId" : 0,
		"numCatchUpOps" : NumberLong(0),
		"newTermStartDate" : ISODate("2020-10-10T09:39:46.789Z"),
		"wMajorityWriteAvailabilityDate" : ISODate("2020-10-10T09:40:24.592Z")
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "VM_0_7_centos:27017",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 19,
			"optime" : {
				"ts" : Timestamp(1602322836, 1),
				"t" : NumberLong(3)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1602322836, 1),
				"t" : NumberLong(3)
			},
			"optimeDate" : ISODate("2020-10-10T09:40:36Z"),
			"optimeDurableDate" : ISODate("2020-10-10T09:40:36Z"),
			"lastHeartbeat" : ISODate("2020-10-10T09:40:42.792Z"),
			"lastHeartbeatRecv" : ISODate("2020-10-10T09:40:43.086Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "172.21.0.7:27018",
			"syncSourceHost" : "172.21.0.7:27018",
			"syncSourceId" : 1,
			"infoMessage" : "",
			"configVersion" : 7
		},
		{
			"_id" : 1,
			"name" : "172.21.0.7:27018",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 297,
			"optime" : {
				"ts" : Timestamp(1602322836, 1),
				"t" : NumberLong(3)
			},
			"optimeDate" : ISODate("2020-10-10T09:40:36Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1602322786, 1),
			"electionDate" : ISODate("2020-10-10T09:39:46Z"),
			"configVersion" : 7,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
		{
			"_id" : 2,
			"name" : "172.21.0.7:27019",
			"health" : 1,
			"state" : 7,
			"stateStr" : "ARBITER",
			"uptime" : 295,
			"lastHeartbeat" : ISODate("2020-10-10T09:40:42.788Z"),
			"lastHeartbeatRecv" : ISODate("2020-10-10T09:40:44.303Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : 7
		}
	],
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1602322836, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1602322836, 1)
}
myrs:PRIMARY>

27018 變爲主節點,寫入數據,在27017 上讀取

myrs:PRIMARY> show dbs
admin      0.000GB
articledb  0.000GB
config     0.000GB
local      0.000GB
myrs:PRIMARY> use articledb
switched to db articledb
myrs:PRIMARY> show collections
comment
content
myrs:PRIMARY> db.content.insert({"k1":'v1'})
WriteResult({ "nInserted" : 1 })
myrs:PRIMARY>
myrs:SECONDARY> rs.slaveOk()
myrs:SECONDARY> show dbs
admin      0.000GB
articledb  0.000GB
config     0.000GB
local      0.000GB
myrs:SECONDARY> use articledb
switched to db articledb
myrs:SECONDARY> db.content.find()
{ "_id" : ObjectId("5f817a179595bc6e7dfc444c"), "title" : "AAA", "content" : "BBB" }
{ "_id" : ObjectId("5f8180369595bc6e7dfc444d"), "title" : "CCC", "content" : "DDD" }
{ "_id" : ObjectId("5f818206997162c565e0d7ff"), "k1" : "v1" }
myrs:SECONDARY>


13.3 仲裁節點和主節點故障 


先關掉仲裁節點27019,
關掉如今的主節點27018
登陸27017後,發現,27017仍然是從節點,副本集中沒有主節點了,致使此時,副本集是隻讀狀態,
沒法寫入。
爲啥不選舉了?由於27017的票數,沒有得到大多數,即沒有大於等於2,它只有默認的一票(優先級
是1)
若是要觸發選舉,隨便加入一個成員便可。

若是隻加入27019仲裁節點成員,則主節點必定是27017,由於沒得選了,仲裁節點不參與選舉,
但參與投票。(不演示)
若是隻加入27018節點,會發起選舉。由於27017和27018都是兩票,則按照誰數據新,誰當主節


13.4 仲裁節點和從節點故障  

先關掉仲裁節點27019, 關掉如今的副本節點27018 10秒後,27017主節點自動降級爲副本節點。(服務降級) 副本集不可寫數據了,已經故障了。

相關文章
相關標籤/搜索