1 介紹
MongoDB Replica Set中文名為副本集,通俗地講是集群當中包含了多份數據,保證主節點掛掉了,備節點能繼續提供數據服務,提供的前提就是數據需要和主節點一致。
Mongodb(M)表示主節點,Mongodb(S)表示備節點,Mongodb(A)表示仲裁節點(Arbiter)。主備節點存儲數據,仲裁節點不存儲數據。客戶端同時連接主節點與備節點,不連接仲裁節點。
默認設置下,主節點提供所有增刪查改服務,備節點不提供任何服務。但是可以通過設置使備節點提供查詢服務,這樣就可以減少主節點的壓力,當客戶端進行數據查詢時,請求自動轉到備節點上。這個設置叫做Read Preference Modes,同時Java客戶端提供了簡單的配置方式,可以不必直接對數據庫進行操作。
仲裁節點是一種特殊的節點,它本身並不存儲數據,主要的作用是決定哪一個備節點在主節點掛掉之后提升為主節點,所以客戶端不需要連接此節點。這里雖然只有一個備節點,但是仍然需要一個仲裁節點來提升備節點級別。我開始也不相信必須要有仲裁節點,但是自己也試過沒仲裁節點的話,主節點掛了備節點還是備節點,所以咱們還是需要它的。
2 部署MongoDB Replica Set
2.1 准備工作
MongoDB版本: 5.0.5
部署環境:
角色 | 默認端口 | 映射主機端口 | |
Master | 27017 | 37071 | |
Slave1 | 27017 | 37072 | |
Slave2 | 27017 | 37073 | |
Arbiter1 | 27017 | 37074 |
宿主機安裝MongoDB Shell(MongoDB Shell版本與數據庫版本一致),后面方便管理。
拉取MongoDB for Docker鏡像
[root]# docker pull mongo:latest
生成keyfile文件(后面開啟認證登錄時需要)
[root]# mkdir -p /etc/mongodb
[root]# openssl rand -base64 765 > /etc/mongodb/key.file
[root]# chmod 400 /etc/mongodb/key.file
2.2 部署數據節點
創建配置文件mongod.conf
[root]# vi /etc/mongodb/mongod.conf
systemLog:
destination: file
path: "/data/db/mongod.log"
logAppend: true
storage:
dbPath: /data/db
wiredTiger:
engineConfig:
cacheSizeGB: 0.25
processManagement:
fork: true
net:
bindIpAll: true
port: 27017
#security:
# keyFile: /data/db/key.file
# authorization: enabled
replication:
replSetName: replicas
oplogSizeMB: 2048
創建數據節點容器
[root]# docker run -d --name replica_db01 -p 37071:27017 -v /etc/mongodb/replica01.conf:/data/db/replica01.conf -v /etc/mongodb/key.file:/data/db/key.file mongo --config /data/db/replica01.conf
[root]# docker run -d --name replica_db02 -p 37072:27017 -v /etc/mongodb/replica02.conf:/data/db/replica02.conf -v /etc/mongodb/key.file:/data/db/key.file mongo --config /data/db/replica02.conf
[root]# docker run -d --name replica_db03 -p 37073:27017 -v /etc/mongodb/replica03.conf:/data/db/replica03.conf -v /etc/mongodb/key.file:/data/db/key.file mongo --config /data/db/replica03.conf
2.3 部署Arbiter節點
創建配置文件arbiter.conf
[root]# vi /etc/mongodb/arbiter.conf
systemLog:
destination: file
path: "/data/db/arbiter.log"
logAppend: true
storage:
dbPath: /data/db
wiredTiger:
engineConfig:
cacheSizeGB: 0.25
processManagement:
fork: true
net:
bindIpAll: true
port: 27017
#security:
# keyFile: /data/db/key.file
replication:
replSetName: replicas
oplogSizeMB: 2048
創建Arbiter節點容器
[root]# docker run -d --name replica_arbiter01 -p 37074:27017 -v /etc/mongodb/arbiter.conf:/data/db/arbiter01.conf -v /etc/mongodb/key.file:/data/db/key.file mongo --config /data/db/arbiter01.conf
2.4 創建副本集
初始化並創建副本集
> rs.initiate(
{
_id : "replicas",
members: [
{ _id : 0, host : "10.150.57.13:37071" },
{ _id : 1, host : "10.150.57.13:37072" },
{ _id : 2, host : "10.150.57.13:37073" },
{ _id : 3, host : "10.150.57.13:37074", arbiterOnly:true }
]
}
)
2.5 查看副本集信息
查看副本集信息
replicas:PRIMARY> rs.status()
{
"set" : "replicas",
"date" : ISODate("2022-01-18T02:58:22.833Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 3,
"writeMajorityCount" : 3,
"votingMembersCount" : 4,
"writableVotingMembersCount" : 3,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1642474693, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2022-01-18T02:58:13.609Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1642474693, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1642474693, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1642474693, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2022-01-18T02:58:13.609Z"),
"lastDurableWallTime" : ISODate("2022-01-18T02:58:13.609Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1642474663, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2022-01-18T02:56:03.593Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(1642474552, 1),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1642474552, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 3,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2022-01-18T02:56:03.603Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2022-01-18T02:56:04.258Z")
},
"members" : [
{
"_id" : 0,
"name" : "10.150.57.13:37071",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 39455,
"optime" : {
"ts" : Timestamp(1642474693, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2022-01-18T02:58:13Z"),
"lastAppliedWallTime" : ISODate("2022-01-18T02:58:13.609Z"),
"lastDurableWallTime" : ISODate("2022-01-18T02:58:13.609Z"),
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1642474563, 1),
"electionDate" : ISODate("2022-01-18T02:56:03Z"),
"configVersion" : 1,
"configTerm" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "10.150.57.13:37072",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 150,
"optime" : {
"ts" : Timestamp(1642474693, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1642474693, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2022-01-18T02:58:13Z"),
"optimeDurableDate" : ISODate("2022-01-18T02:58:13Z"),
"lastAppliedWallTime" : ISODate("2022-01-18T02:58:13.609Z"),
"lastDurableWallTime" : ISODate("2022-01-18T02:58:13.609Z"),
"lastHeartbeat" : ISODate("2022-01-18T02:58:21.596Z"),
"lastHeartbeatRecv" : ISODate("2022-01-18T02:58:22.601Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "10.150.57.13:37071",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 1
},
{
"_id" : 2,
"name" : "10.150.57.13:37073",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 150,
"optime" : {
"ts" : Timestamp(1642474693, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1642474693, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2022-01-18T02:58:13Z"),
"optimeDurableDate" : ISODate("2022-01-18T02:58:13Z"),
"lastAppliedWallTime" : ISODate("2022-01-18T02:58:13.609Z"),
"lastDurableWallTime" : ISODate("2022-01-18T02:58:13.609Z"),
"lastHeartbeat" : ISODate("2022-01-18T02:58:21.597Z"),
"lastHeartbeatRecv" : ISODate("2022-01-18T02:58:22.600Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "10.150.57.13:37071",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 1
},
{
"_id" : 3,
"name" : "10.150.57.13:37074",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 150,
"lastHeartbeat" : ISODate("2022-01-18T02:58:21.597Z"),
"lastHeartbeatRecv" : ISODate("2022-01-18T02:58:21.600Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1642474693, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1642474693, 1)
}
確認哪個節點是Master
replicas:PRIMARY> rs.isMaster()
{
"topologyVersion" : {
"processId" : ObjectId("61e592afd305eeacf7ed8c65"),
"counter" : NumberLong(6)
},
"hosts" : [
"10.150.57.13:37071",
"10.150.57.13:37072",
"10.150.57.13:37073"
],
"arbiters" : [
"10.150.57.13:37074"
],
"setName" : "replicas",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "10.150.57.13:37071",
"me" : "10.150.57.13:37071",
"electionId" : ObjectId("7fffffff0000000000000001"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1642474893, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2022-01-18T03:01:33Z"),
"majorityOpTime" : {
"ts" : Timestamp(1642474893, 1),
"t" : NumberLong(1)
},
"majorityWriteDate" : ISODate("2022-01-18T03:01:33Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2022-01-18T03:01:35.509Z"),
"logicalSessionTimeoutMinutes" : 30,
"connectionId" : 2,
"minWireVersion" : 0,
"maxWireVersion" : 13,
"readOnly" : false,
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1642474893, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1642474893, 1)
}
查看副本集配置信息
replicas:PRIMARY> rs.conf()
{
"_id" : "replicas",
"version" : 1,
"term" : 1,
"members" : [
{
"_id" : 0,
"host" : "10.150.57.13:37071",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "10.150.57.13:37072",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "10.150.57.13:37073",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "10.150.57.13:37074",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"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("61e62c38d305eeacf7ed8f87")
}
}
3 MongoDB Replica Set測試
3.1 數據同步測試
Master端創建測試數據
[root]# mongo --port 37071
replicas:PRIMARY> use gaoyu
switched to db gaoyu
replicas:PRIMARY> db.t1.insert( { name : "gaoyu" } )
Slave1端查看數據是否同步
[root]# mongo --port 37072
replicas:SECONDARY> use gaoyu
switched to db gaoyu
replicas:SECONDARY> rs.secondaryOk() #開啟Slave可讀
replicas:SECONDARY> show collections
t1
replicas:SECONDARY> db.t1.find()
{ "_id" : ObjectId("61e6d385c8ca480d8b12f836"), "name" : "gaoyu" }
Slave2端查看數據是否同步
[root]# mongo --port 37073
replicas:SECONDARY> use gaoyu
switched to db gaoyu
replicas:SECONDARY> rs.secondaryOk() #開啟Slave可讀
replicas:SECONDARY> show collections
t1
replicas:SECONDARY> db.t1.find()
{ "_id" : ObjectId("61e6d385c8ca480d8b12f836"), "name" : "gaoyu" }
3.2 測試Master自動切換
查看哪個節點是Master,當前Master是10.150.57.13:37071
replicas:SECONDARY> rs.isMaster()
{
"topologyVersion" : {
"processId" : ObjectId("61e593430ae02c2941c3e53f"),
"counter" : NumberLong(6)
},
"hosts" : [
"10.150.57.13:37071",
"10.150.57.13:37072",
"10.150.57.13:37073"
],
"arbiters" : [
"10.150.57.13:37074"
],
"setName" : "replicas",
"setVersion" : 3,
"ismaster" : false,
"secondary" : true,
"primary" : "10.150.57.13:37071",
"me" : "10.150.57.13:37072",
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1642520214, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2022-01-18T15:36:54Z"),
"majorityOpTime" : {
"ts" : Timestamp(1642520214, 1),
"t" : NumberLong(1)
},
"majorityWriteDate" : ISODate("2022-01-18T15:36:54Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2022-01-18T15:37:01.467Z"),
"logicalSessionTimeoutMinutes" : 30,
"connectionId" : 77,
"minWireVersion" : 0,
"maxWireVersion" : 13,
"readOnly" : false,
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1642520214, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1642520214, 1)
}
手動關閉10.150.57.13:37071所對應的docker容器
[root]# docker stop replica_db01
查看哪個節點是Master
replicas:SECONDARY> rs.isMaster()
{
"topologyVersion" : {
"processId" : ObjectId("61e593430ae02c2941c3e53f"),
"counter" : NumberLong(7)
},
"hosts" : [
"10.150.57.13:37071",
"10.150.57.13:37072",
"10.150.57.13:37073"
],
"arbiters" : [
"10.150.57.13:37074"
],
"setName" : "replicas",
"setVersion" : 3,
"ismaster" : false,
"secondary" : true,
"primary" : "10.150.57.13:37073",
"me" : "10.150.57.13:37072",
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1642520464, 1),
"t" : NumberLong(3)
},
"lastWriteDate" : ISODate("2022-01-18T15:41:04Z"),
"majorityOpTime" : {
"ts" : Timestamp(1642520394, 1),
"t" : NumberLong(1)
},
"majorityWriteDate" : ISODate("2022-01-18T15:39:54Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2022-01-18T15:41:07.337Z"),
"logicalSessionTimeoutMinutes" : 30,
"connectionId" : 90,
"minWireVersion" : 0,
"maxWireVersion" : 13,
"readOnly" : false,
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1642520464, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1642520464, 1)
}
可以看到10.150.57.13:37073已經成為Master。
4 開啟認證登錄
4.1 創建管理員賬號
連接PRIMARY創建管理員賬號
[root]# mongo --port 27071
mongos> use admin
mongos> db.createUser(
{
user: "admin",
pwd: "Gaoyu@029",
roles: [ { role: "root", db: "admin" } ]
}
)
輸出信息:
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
4.2 修改配置文件
去掉配置文件replica01.conf、replica02.conf、replica03.conf、arbiter01.conf、arbiter02.conf、arbiter03.conf中的注釋
security:
keyFile: /data/db/key.file
authorization: enabled
4.3 重啟服務
重啟replica_arbiter01、replica_arbiter02、replica_arbiter03、replica_db03、replica_db02、replica_db01
[root]# docker restart replica_arbiter01
[root]# docker restart replica_arbiter02
[root]# docker restart replica_arbiter03
[root]# docker restart replica_db01
[root]# docker restart replica_db02
[root]# docker restart replica_db03
4.4 驗證
登錄PRIMARY
[root]# mongo --port 37071 admin
權限認證
replicas:PRIMARY> show users
uncaught exception: Error: command usersInfo requires authentication :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.getUsers@src/mongo/shell/db.js:1635:15
shellHelper.show@src/mongo/shell/utils.js:933:9
shellHelper@src/mongo/shell/utils.js:838:15
@(shellhelp2):1:1
replicas:PRIMARY> db.auth('admin','Gaoyu@029')
1
replicas:PRIMARY> show users
{
"_id" : "admin.admin",
"userId" : UUID("12f644c7-660d-4d84-8663-893377eb1ca9"),
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
5 Replica Set增/刪節點
5.1 新增Arbiter節點
創建配置文件
[root]# cp /etc/mongodb/arbiter01.conf /etc/mongodb/arbiter02.conf
[root]# cp /etc/mongodb/arbiter01.conf /etc/mongodb/arbiter03.conf
[root]# cat /etc/mongodb/arbiter03.conf
systemLog:
destination: file
path: "/data/db/shards.log"
logAppend: true
storage:
dbPath: /data/db
wiredTiger:
engineConfig:
cacheSizeGB: 0.25
net:
bindIpAll: true
port: 27017
security:
keyFile: /data/db/key.file
replication:
replSetName: replicas
oplogSizeMB: 2048
創建arbiter容器
[root]# docker run -d --name replica_arbiter02 -p 37075:27017 -v /etc/mongodb/arbiter.conf:/data/db/arbiter02.conf -v /etc/mongodb/key.file:/data/db/key.file mongo --config /data/db/arbiter02.conf
[root]# docker run -d --name replica_arbiter03 -p 37076:27017 -v /etc/mongodb/arbiter.conf:/data/db/arbiter03.conf -v /etc/mongodb/key.file:/data/db/key.file mongo --config /data/db/arbiter03.conf
新增arbiter節點(10.150.57.13:37075、10.150.57.13:37076)
> rs.addArb("10.150.57.13:37075")
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1642475773, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1642475773, 1)
}
> rs.addArb("10.150.57.13:37076")
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1642475792, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1642475792, 1)
}
查看arbiter新節點是否添加成功
replicas:PRIMARY> rs.conf()
{
"_id" : "replicas",
"version" : 3,
"term" : 1,
"members" : [
{
"_id" : 0,
"host" : "10.150.57.13:37071",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "10.150.57.13:37072",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "10.150.57.13:37073",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "10.150.57.13:37074",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 4,
"host" : "10.150.57.13:37075",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 5,
"host" : "10.150.57.13:37076",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"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("61e62c38d305eeacf7ed8f87")
}
}
5.2 刪除Arbiter節點
刪除arbiter(10.150.57.13:37075、10.150.57.13:37076)
replicas:PRIMARY> rs.remove("10.150.57.13:37075")
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1643037995, 1),
"signature" : {
"hash" : BinData(0,"Upxbp5mfXMYSqvM0u3DYhmjnN5E="),
"keyId" : NumberLong("7054374532596891652")
}
},
"operationTime" : Timestamp(1643037995, 1)
}
replicas:PRIMARY> rs.remove("10.150.57.13:37076")
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1643038094, 1),
"signature" : {
"hash" : BinData(0,"PowO0jACeRMNA9V6R3t3eumq/FA="),
"keyId" : NumberLong("7054374532596891652")
}
},
"operationTime" : Timestamp(1643038094, 1)
}
查看arbiter節點是否刪除成功
replicas:PRIMARY> rs.conf()
{
"_id" : "replicas",
"version" : 5,
"term" : 4,
"members" : [
{
"_id" : 0,
"host" : "10.150.57.13:37071",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "10.150.57.13:37072",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "10.150.57.13:37073",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "10.150.57.13:37074",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"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("61e62c38d305eeacf7ed8f87")
}
}
5.3 新增復制節點
修改配置文件
[root]# cp /etc/mongodb/replica03.conf /etc/mongodb/replica04.conf
[root]# cat /etc/mongodb/replica04.conf
systemLog:
destination: file
path: "/data/db/shards.log"
logAppend: true
storage:
dbPath: /data/db
wiredTiger:
engineConfig:
cacheSizeGB: 0.25
net:
bindIpAll: true
security:
keyFile: /data/db/key.file
authorization: enabled
replication:
replSetName: replicas
oplogSizeMB: 2048
創建容器
[root]# docker run -d --name replica_db04 -p 37077:27017 -v /etc/mongodb/replica04.conf:/data/db/replica04.conf -v /etc/mongodb/key.file:/data/db/key.file mongo --config /data/db/replica04.conf
添加數據復制節點(10.150.57.13:37077)
replicas:PRIMARY> db.auth('admin','Gaoyu@029')
1
replicas:PRIMARY> rs.add("10.150.57.13:37077")
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1643039164, 1),
"signature" : {
"hash" : BinData(0,"iHAKa9dp+C8SzJsa3mkae2V6GaA="),
"keyId" : NumberLong("7054374532596891652")
}
},
"operationTime" : Timestamp(1643039164, 1)
}
確認節點是否添加成功
replicas:PRIMARY> rs.conf()
{
"_id" : "replicas",
"version" : 6,
"term" : 4,
"members" : [
{
"_id" : 0,
"host" : "10.150.57.13:37071",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "10.150.57.13:37072",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "10.150.57.13:37073",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "10.150.57.13:37074",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 4,
"host" : "10.150.57.13:37077",
"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("61e62c38d305eeacf7ed8f87")
}
}
5.4 刪除復制節點
刪除復制節點(10.150.57.13:37077)
replicas:PRIMARY> rs.remove("10.150.57.13:37077")
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1643039447, 1),
"signature" : {
"hash" : BinData(0,"dtBEDqnQnh2x2uSXkeia4EwGJhQ="),
"keyId" : NumberLong("7054374532596891652")
}
},
"operationTime" : Timestamp(1643039447, 1)
}
確認節點是否被刪除
replicas:PRIMARY> rs.conf()
{
"_id" : "replicas",
"version" : 7,
"term" : 4,
"members" : [
{
"_id" : 0,
"host" : "10.150.57.13:37071",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "10.150.57.13:37072",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "10.150.57.13:37073",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "10.150.57.13:37074",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"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("61e62c38d305eeacf7ed8f87")
}
}
5.5 新增延遲復制節點
新增復制節點
replicas:PRIMARY> rs.add("10.150.57.13:37077")
查看10.150.57.13:37077節點信息
replicas:PRIMARY> rs.conf()
#截取信息
{
"_id" : 4,
"host" : "10.150.57.13:37077",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
}
將10.150.57.13:37077變更為延遲復制節點
#定義變量
replicas:PRIMARY> cfg = rs.conf()
#修改權重
replicas:PRIMARY> cfg.members[4].priority = 0
0
#設置該節點為hidden,不參與選主
replicas:PRIMARY> cfg.members[4].hidden = true
true
#設置延遲復制的時間(因版本不同參數不一樣slaveDelay/secondaryDelaySecs)
replicas:PRIMARY> cfg.members[4].secondaryDelaySecs = 3600
3600
#使變量生效
replicas:PRIMARY> rs.reconfig(cfg)
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1643547193, 1),
"signature" : {
"hash" : BinData(0,"k4y1ZNtgDmdLghtiyjZpqZdbj9E="),
"keyId" : NumberLong("7054374532596891652")
}
},
"operationTime" : Timestamp(1643547193, 1)
}
再次查看10.150.57.13:37077節點信息,可以看到修改的參數值已生效
{
"_id" : 4,
"host" : "10.150.57.13:37077",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : true,
"priority" : 0,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(3600),
"votes" : 1
}