正如上一篇Mongodb-Single Server Install中所说,mongod数据库服务有不同的部署方案(单机部署,副本集部署,分片集群部署),通过不同的配置,可以扮演多种不同的角色:
我们本实验中安装副本集方案,参考官方文档:https://docs.mongodb.com/manual/replication/
MongoDB 在 1.6 版本对开发了新功能replica set,这比之前的replication 功能要强大一 些,增加了故障自动切换和自动修复成员节点,各个DB 之间数据完全一致,大大降低了维 护成功。3.6版本后已经不支持replication paris(主从复制方式),建议使用replica set,replica set 故障切换完全自动。
Replica Sets的结构类似一个集群,完全可以把它当成一个集群,因为它确实与集群实现的作用是一样的:如果其中一个节点出现故障,其他节点马上会将业务接管过来而无须停机操作。
在副本集部署方案中,有三个角色:
副本集的容错能力是可能变得不可用且仍会在集中留下足够成员来选择主副本集的成员数。
换句话说,它是集合中的成员数量与选举初选所需的大多数投票成员之间的差异。如果没有主副本,副本集将无法接受写入操作。容错是副本集大小的影响,但这种关系不是直接的。
我们知道大多数是指N/2+1,那么我们可以得到容错能力和集群成员数的关系:
成员数量 | 选举新的初选所需的多数票 | 容错 |
---|---|---|
3 | 2 | 1 |
4 | 3 | 1 |
5 | 3 | 2 |
6 | 4 | 2 |
… |
设计集群成员数,最好也应为奇数。
当初始化的主节点故障是,副本集的其他主机会要根据一定规则来选主节点。
选举规则是根据票数来决定谁获胜:
在获得票数的时候,优先级(priority)参数影响重大。
可以通过设置优先级(priority)来设置额外票数。优先级即权重,取值为0-1000,相当于可额外增加0-1000的票数,优先级的值越大,就越可能获得多数成员的投票(votes)数。
指定较高的值可使成员更有资格成为主要成员,更低的值可使成员更不符合条件。
默认情况下,优先级的值是1。
由于在副本集中,能够接受写操作的是主成员,而主成员在发生故障的时候会发转移。Mongodb官方给出了连接副本集的方法,而避免直接连接到某个副本集成员
标准 URI 连接方案的格式为:
mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
对于副本集:
mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/?replicaSet=myrs #myrs为副本集名称
对于强制实施访问控制的副本集,需要包括用户凭据:
mongodb://myDBReader:D1fficultP%[email protected]:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/?authSource=admin&replicaSet=myrs
设计3成员副本集,采用一台Primary和两台Secondary
本次实验使用三个mongodb实例,分别为Alma、db1和db2。
安装步骤和Mongodb-Single Server Install一致,不过在mongd.conf中要配置副本集参数,默认位置/etc/mongod.conf:
replication:
replSetName: etaonrs
其中:副本集名字为:etaonrs
参考完整的配置文件:
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/mongodb/replica_sets/log/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbPath: "/mongodb/replica_sets/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/mongodb/replica_sets/log/mongod.pid"
net:
#服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
#bindIpAll: true
#服务实例绑定的IP
bindIp: 0.0.0.0
#bindIp
#绑定的端口
port: 27019
replication:
#副本集的名称
replSetName: etaonrs
使用rs.initiate()初始化副本集和主节点
rs.initiate(configuration)
Parameter | Type | Description |
---|---|---|
configuration | document | Optional. A document that specifies configuration for the new replica set. If a configuration is not specified,MongoDB uses a default replica set configuration. |
> rs.initiate()
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "Alma:27017",
"ok" : 1
}
etaonrs:SECONDARY>
etaonrs:PRIMARY>
etaonrs:PRIMARY>
语法:
rs.add(host, arbiterOnly)
Parameter | Type | Description |
---|---|---|
host | string or document | 要添加到副本集的新成员。 指定为字符串或配置文档:1)如果是一个字符串,则需要指定新成员的主机名和可选的端口号;2)如果是一个文档,请指定在members数组中找到的副本集成员配置文档。 必须在成员配置文档中指定主机字段。 |
arbiterOnly | boolean | 可选的。 仅在 值为字符串时适用。 如果为true,则添加的主机是仲裁者。 |
etaonrs:PRIMARY> rs.add('db1:27017')
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1643259552, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1643259552, 1)
}
etaonrs:PRIMARY> rs.add('db2:27017')
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1643259569, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1643259569, 1)
}
使用rs.status()命令
etaonrs:PRIMARY> rs.status()
{
"set" : "etaonrs",
"date" : ISODate("2022-01-27T05:05:54.779Z"),
"myState" : 1,
"term" : NumberLong(9),
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"votingMembersCount" : 3,
"writableVotingMembersCount" : 3,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1643259948, 1),
"t" : NumberLong(9)
},
"lastCommittedWallTime" : ISODate("2022-01-27T05:05:48.385Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1643259948, 1),
"t" : NumberLong(9)
},
"appliedOpTime" : {
"ts" : Timestamp(1643259948, 1),
"t" : NumberLong(9)
},
"durableOpTime" : {
"ts" : Timestamp(1643259948, 1),
"t" : NumberLong(9)
},
"lastAppliedWallTime" : ISODate("2022-01-27T05:05:48.385Z"),
"lastDurableWallTime" : ISODate("2022-01-27T05:05:48.385Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1643259898, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2022-01-27T04:58:18.287Z"),
"electionTerm" : NumberLong(9),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(1643258692, 1),
"t" : NumberLong(8)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1643258702, 1),
"t" : NumberLong(8)
},
"numVotesNeeded" : 1,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"newTermStartDate" : ISODate("2022-01-27T04:58:18.296Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2022-01-27T04:58:18.306Z")
},
"members" : [
{
"_id" : 0,
"name" : "Alma:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 5813,
"optime" : {
"ts" : Timestamp(1643259948, 1),
"t" : NumberLong(9)
},
"optimeDate" : ISODate("2022-01-27T05:05:48Z"),
"lastAppliedWallTime" : ISODate("2022-01-27T05:05:48.385Z"),
"lastDurableWallTime" : ISODate("2022-01-27T05:05:48.385Z"),
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1643259498, 1),
"electionDate" : ISODate("2022-01-27T04:58:18Z"),
"configVersion" : 387392,
"configTerm" : 9,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "db1:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 212,
"optime" : {
"ts" : Timestamp(1643259948, 1),
"t" : NumberLong(9)
},
"optimeDurable" : {
"ts" : Timestamp(1643259948, 1),
"t" : NumberLong(9)
},
"optimeDate" : ISODate("2022-01-27T05:05:48Z"),
"optimeDurableDate" : ISODate("2022-01-27T05:05:48Z"),
"lastAppliedWallTime" : ISODate("2022-01-27T05:05:48.385Z"),
"lastDurableWallTime" : ISODate("2022-01-27T05:05:48.385Z"),
"lastHeartbeat" : ISODate("2022-01-27T05:05:53.038Z"),
"lastHeartbeatRecv" : ISODate("2022-01-27T05:05:53.914Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "Alma:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 387392,
"configTerm" : 9
},
{
"_id" : 2,
"name" : "db2:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 218,
"optime" : {
"ts" : Timestamp(1643259948, 1),
"t" : NumberLong(9)
},
"optimeDurable" : {
"ts" : Timestamp(1643259948, 1),
"t" : NumberLong(9)
},
"optimeDate" : ISODate("2022-01-27T05:05:48Z"),
"optimeDurableDate" : ISODate("2022-01-27T05:05:48Z"),
"lastAppliedWallTime" : ISODate("2022-01-27T05:05:48.385Z"),
"lastDurableWallTime" : ISODate("2022-01-27T05:05:48.385Z"),
"lastHeartbeat" : ISODate("2022-01-27T05:05:53.038Z"),
"lastHeartbeatRecv" : ISODate("2022-01-27T05:05:52.932Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "Alma:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 387392,
"configTerm" : 9
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1643259948, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1643259948, 1)
}
etaonrs:PRIMARY> use etaondb
switched to db etaondb
etaonrs:PRIMARY> db.comment.find()
{ "_id" : "0", "articleid" : "100000", "content" : "今天天气真好,阳光明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2022-01-27T03:06:19.502Z"), "likenum" : 10, "state" : null }
{ "_id" : "1", "articleid" : "100001", "content" : "我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。", "userid" : "1002", "nickname" : "相忘于江湖", "createdatetime" : ISODate("2019-08-05T22:08:15.522Z"), "likenum" : 1000, "state" : "1" }
{ "_id" : "2", "articleid" : "100001", "content" : "我夏天空腹喝凉开水,冬天喝温开水", "userid" : "1005", "nickname" : "伊人憔悴", "createdatetime" : ISODate("2019-08-05T23:58:51.485Z"), "likenum" : 888, "state" : "1" }
{ "_id" : "3", "articleid" : "100001", "content" : "我一直喝凉开水,冬天夏天都喝。", "userid" : "1004", "nickname" : "杰克船长", "createdatetime" : ISODate("2019-08-06T01:05:06.321Z"), "likenum" : 666, "state" : "1" }
{ "_id" : "4", "articleid" : "100001", "content" : "专家说不能空腹吃饭,影响健康。", "userid" : "1003", "nickname" : "凯撒", "createdatetime" : ISODate("2019-08-06T08:18:35.288Z"), "likenum" : 2000, "state" : "1" }
{ "_id" : "5", "articleid" : "100001", "content" : "研究表明,刚烧开的水千万不能喝,因为烫嘴。", "userid" : "1003", "nickname" : "凯撒", "createdatetime" : ISODate("2019-08-06T11:01:02.521Z"), "likenum" : 3000, "state" : "1" }
删除一条记录并查看,写操作和读取操作
etaonrs:PRIMARY> db.comment.remove({userid:'1002'})
WriteResult({ "nRemoved" : 1 })
etaonrs:PRIMARY> db.comment.find()
{ "_id" : "0", "articleid" : "100000", "content" : "今天天气真好,阳光明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2022-01-27T03:06:19.502Z"), "likenum" : 10, "state" : null }
{ "_id" : "2", "articleid" : "100001", "content" : "我夏天空腹喝凉开水,冬天喝温开水", "userid" : "1005", "nickname" : "伊人憔悴", "createdatetime" : ISODate("2019-08-05T23:58:51.485Z"), "likenum" : 888, "state" : "1" }
{ "_id" : "3", "articleid" : "100001", "content" : "我一直喝凉开水,冬天夏天都喝。", "userid" : "1004", "nickname" : "杰克船长", "createdatetime" : ISODate("2019-08-06T01:05:06.321Z"), "likenum" : 666, "state" : "1" }
{ "_id" : "4", "articleid" : "100001", "content" : "专家说不能空腹吃饭,影响健康。", "userid" : "1003", "nickname" : "凯撒", "createdatetime" : ISODate("2019-08-06T08:18:35.288Z"), "likenum" : 2000, "state" : "1" }
{ "_id" : "5", "articleid" : "100001", "content" : "研究表明,刚烧开的水千万不能喝,因为烫嘴。", "userid" : "1003", "nickname" : "凯撒", "createdatetime" : ISODate("2019-08-06T11:01:02.521Z"), "likenum" : 3000, "state" : "1" }
etaonrs:SECONDARY> db.comment.find()
Error: error: {
"topologyVersion" : {
"processId" : ObjectId("61f223e7b916a2f7bd2ea194"),
"counter" : NumberLong(5)
},
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotPrimaryNoSecondaryOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1643259928, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1643259928, 1)
}
在辅助成员初始化后,其并没有变成slaveOk,需要使用命令rs.slaveOk()
etaonrs:SECONDARY> rs.slaveOk()
WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.
然后再进行查询
etaonrs:SECONDARY> db.comment.find()
{ "_id" : "0", "articleid" : "100000", "content" : "今天天气真好,阳光明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2022-01-27T03:06:19.502Z"), "likenum" : 10, "state" : null }
{ "_id" : "2", "articleid" : "100001", "content" : "我夏天空腹喝凉开水,冬天喝温开水", "userid" : "1005", "nickname" : "伊人憔悴", "createdatetime" : ISODate("2019-08-05T23:58:51.485Z"), "likenum" : 888, "state" : "1" }
{ "_id" : "3", "articleid" : "100001", "content" : "我一直喝凉开水,冬天夏天都喝。", "userid" : "1004", "nickname" : "杰克船长", "createdatetime" : ISODate("2019-08-06T01:05:06.321Z"), "likenum" : 666, "state" : "1" }
{ "_id" : "4", "articleid" : "100001", "content" : "专家说不能空腹吃饭,影响健康。", "userid" : "1003", "nickname" : "凯撒", "createdatetime" : ISODate("2019-08-06T08:18:35.288Z"), "likenum" : 2000, "state" : "1" }
{ "_id" : "5", "articleid" : "100001", "content" : "研究表明,刚烧开的水千万不能喝,因为烫嘴。", "userid" : "1003", "nickname" : "凯撒", "createdatetime" : ISODate("2019-08-06T11:01:02.521Z"), "likenum" : 3000, "state" : "1" }
现在的副本集为三成员,可以提供一个成员的故障保护
{
"_id" : 1,
"name" : "db2:27017",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
"lastAppliedWallTime" : ISODate("2022-01-28T03:28:25.101Z"),
"lastDurableWallTime" : ISODate("2022-01-28T03:28:25.101Z"),
"lastHeartbeat" : ISODate("2022-01-28T03:29:35.375Z"),
"lastHeartbeatRecv" : ISODate("2022-01-28T03:28:32.875Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "Error connecting to db2:27017 (172.16.21.11:27017) :: caused by :: Connection refused",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 517368,
"configTerm" : 15
},
状态已经改变:“stateStr” : “(not reachable/healthy)”
etaonrs:PRIMARY> db.comment.find({},{userid:1})
{ "_id" : "0", "userid" : "1001" }
{ "_id" : "2", "userid" : "1005" }
{ "_id" : "3", "userid" : "1004" }
{ "_id" : "4", "userid" : "1003" }
{ "_id" : "5", "userid" : "1003" }
etaonrs:PRIMARY> db.comment.insert({"_id":"1","articleid":"100001","content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。","userid":"1002","nickname":"相忘于江湖","createdatetime":new Date("2019-08-05T22:08:15.522"),"likenum":NumberInt(1000),"state":"1"})
WriteResult({ "nInserted" : 1 })
etaonrs:PRIMARY> db.comment.find({},{userid:1})
{ "_id" : "0", "userid" : "1001" }
{ "_id" : "2", "userid" : "1005" }
{ "_id" : "3", "userid" : "1004" }
{ "_id" : "4", "userid" : "1003" }
{ "_id" : "5", "userid" : "1003" }
{ "_id" : "1", "userid" : "1002" }
[root@db2 ~]# systemctl restart mongod
[root@db2 ~]# mongo
MongoDB shell version v5.0.5
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("62202173-4e67-4a6b-b6fb-83fc3fb97aef") }
MongoDB server version: 5.0.5
================
......
etaonrs:SECONDARY> rs.slaveOk()
WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.
etaonrs:SECONDARY> use etaondb
switched to db etaondb
etaonrs:SECONDARY> db.comment.find({},{userid:1})
{ "_id" : "0", "userid" : "1001" }
{ "_id" : "2", "userid" : "1005" }
{ "_id" : "3", "userid" : "1004" }
{ "_id" : "4", "userid" : "1003" }
{ "_id" : "5", "userid" : "1003" }
{ "_id" : "1", "userid" : "1002" }
再启动辅助成员,会发现,主成员写入的数据,会自动同步给辅助成员。
[root@Alma ~]# systemctl stop mongod.service
[root@Alma ~]#
etaonrs:SECONDARY> rs.status()
{
"set" : "etaonrs",
"date" : ISODate("2022-01-28T03:45:25.763Z"),
"myState" : 2,
"term" : NumberLong(16),
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"votingMembersCount" : 3,
"writableVotingMembersCount" : 3,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1643341519, 1),
"t" : NumberLong(16)
},
"lastCommittedWallTime" : ISODate("2022-01-28T03:45:19.113Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1643341519, 1),
"t" : NumberLong(16)
},
"appliedOpTime" : {
"ts" : Timestamp(1643341519, 1),
"t" : NumberLong(16)
},
"durableOpTime" : {
"ts" : Timestamp(1643341519, 1),
"t" : NumberLong(16)
},
"lastAppliedWallTime" : ISODate("2022-01-28T03:45:19.113Z"),
"lastDurableWallTime" : ISODate("2022-01-28T03:45:19.113Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1643341465, 1),
"electionParticipantMetrics" : {
"votedForCandidate" : true,
"electionTerm" : NumberLong(16),
"lastVoteDate" : ISODate("2022-01-28T03:45:09.099Z"),
"electionCandidateMemberId" : 1,
"voteReason" : "",
"lastAppliedOpTimeAtElection" : {
"ts" : Timestamp(1643341505, 1),
"t" : NumberLong(15)
},
"maxAppliedOpTimeInSet" : {
"ts" : Timestamp(1643341505, 1),
"t" : NumberLong(15)
},
"priorityAtElection" : 1,
"newTermStartDate" : ISODate("2022-01-28T03:45:09.110Z"),
"newTermAppliedDate" : ISODate("2022-01-28T03:45:10.107Z")
},
"members" : [
{
"_id" : 0,
"name" : "Alma:27017",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
"lastAppliedWallTime" : ISODate("2022-01-28T03:45:19.113Z"),
"lastDurableWallTime" : ISODate("2022-01-28T03:45:19.113Z"),
"lastHeartbeat" : ISODate("2022-01-28T03:45:25.760Z"),
"lastHeartbeatRecv" : ISODate("2022-01-28T03:45:22.154Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "Error connecting to Alma:27017 (172.16.21.9:27017) :: caused by :: Connection refused",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 517368,
"configTerm" : 16
},
{
"_id" : 1,
"name" : "db2:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 423,
"optime" : {
"ts" : Timestamp(1643341519, 1),
"t" : NumberLong(16)
},
"optimeDurable" : {
"ts" : Timestamp(1643341519, 1),
"t" : NumberLong(16)
},
"optimeDate" : ISODate("2022-01-28T03:45:19Z"),
"optimeDurableDate" : ISODate("2022-01-28T03:45:19Z"),
"lastAppliedWallTime" : ISODate("2022-01-28T03:45:19.113Z"),
"lastDurableWallTime" : ISODate("2022-01-28T03:45:19.113Z"),
"lastHeartbeat" : ISODate("2022-01-28T03:45:25.710Z"),
"lastHeartbeatRecv" : ISODate("2022-01-28T03:45:25.131Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1643341509, 1),
"electionDate" : ISODate("2022-01-28T03:45:09Z"),
"configVersion" : 517368,
"configTerm" : 16
},
{
"_id" : 2,
"name" : "db1:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1835,
"optime" : {
"ts" : Timestamp(1643341519, 1),
"t" : NumberLong(16)
},
"optimeDate" : ISODate("2022-01-28T03:45:19Z"),
"lastAppliedWallTime" : ISODate("2022-01-28T03:45:19.113Z"),
"lastDurableWallTime" : ISODate("2022-01-28T03:45:19.113Z"),
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 517368,
"configTerm" : 16,
"self" : true,
"lastHeartbeatMessage" : ""
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1643341519, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1643341519, 1)
}
原来的主成员:
"name" : "Alma:27017",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)"
新的主成员变成了db2
"_id" : 1,
"name" : "db2:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
etaonrs:SECONDARY> db.comment.find({},{userid:1,nickname:1})
{ "_id" : "0", "userid" : "1001", "nickname" : "Rose" }
{ "_id" : "2", "userid" : "1005", "nickname" : "伊人憔悴" }
{ "_id" : "3", "userid" : "1004", "nickname" : "杰克船长" }
{ "_id" : "4", "userid" : "1003", "nickname" : "凯撒" }
{ "_id" : "5", "userid" : "1003", "nickname" : "凯撒" }
{ "_id" : "1", "userid" : "1002", "nickname" : "相忘于江湖" }
etaonrs:PRIMARY> db.comment.find({},{userid:1})
{ "_id" : "0", "userid" : "1001" }
{ "_id" : "2", "userid" : "1005" }
{ "_id" : "3", "userid" : "1004" }
{ "_id" : "4", "userid" : "1003" }
{ "_id" : "5", "userid" : "1003" }
{ "_id" : "1", "userid" : "1002" }
剩下的两台上面的数都没变。
etaonrs:PRIMARY> db.comment.find({},{userid:1,nickname:1})
{ "_id" : "0", "userid" : "1001", "nickname" : "Rose" }
{ "_id" : "2", "userid" : "1005", "nickname" : "伊人憔悴" }
{ "_id" : "3", "userid" : "1004", "nickname" : "杰克船长" }
{ "_id" : "4", "userid" : "1003", "nickname" : "凯撒" }
{ "_id" : "5", "userid" : "1003", "nickname" : "凯撒" }
{ "_id" : "1", "userid" : "1002", "nickname" : "相忘于江湖" }
etaonrs:PRIMARY> db.comment.update({userid:'1003'},{$set:{nickname:'杨过'}},{multi:true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
etaonrs:PRIMARY> db.comment.find({},{userid:1,nickname:1})
{ "_id" : "0", "userid" : "1001", "nickname" : "Rose" }
{ "_id" : "2", "userid" : "1005", "nickname" : "伊人憔悴" }
{ "_id" : "3", "userid" : "1004", "nickname" : "杰克船长" }
{ "_id" : "4", "userid" : "1003", "nickname" : "杨过" }
{ "_id" : "5", "userid" : "1003", "nickname" : "杨过" }
{ "_id" : "1", "userid" : "1002", "nickname" : "相忘于江湖" }
[root@Alma ~]# systemctl start mongod.service
[root@Alma ~]# mongo
MongoDB shell version v5.0.5
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("b73a2247-defb-48a6-8af1-0615f617b8ac") }
......
etaonrs:SECONDARY> rs.slaveOk()
WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.
etaonrs:SECONDARY> use etaondb
switched to db etaondb
etaonrs:SECONDARY> db.comment.find({},{userid:1,nickname:1})
{ "_id" : "0", "userid" : "1001", "nickname" : "Rose" }
{ "_id" : "2", "userid" : "1005", "nickname" : "伊人憔悴" }
{ "_id" : "3", "userid" : "1004", "nickname" : "杰克船长" }
{ "_id" : "4", "userid" : "1003", "nickname" : "杨过" }
{ "_id" : "5", "userid" : "1003", "nickname" : "杨过" }
{ "_id" : "1", "userid" : "1002", "nickname" : "相忘于江湖" }
etaonrs:SECONDARY> rs.status()
{
"set" : "etaonrs",
"date" : ISODate("2022-01-28T04:11:32.101Z"),
"myState" : 2,
"term" : NumberLong(16),
"syncSourceHost" : "db1:27017",
"syncSourceId" : 2,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"votingMembersCount" : 3,
"writableVotingMembersCount" : 3,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1643343089, 1),
"t" : NumberLong(16)
},
"lastCommittedWallTime" : ISODate("2022-01-28T04:11:29.276Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1643343089, 1),
"t" : NumberLong(16)
},
"appliedOpTime" : {
"ts" : Timestamp(1643343089, 1),
"t" : NumberLong(16)
},
"durableOpTime" : {
"ts" : Timestamp(1643343089, 1),
"t" : NumberLong(16)
},
"lastAppliedWallTime" : ISODate("2022-01-28T04:11:29.276Z"),
"lastDurableWallTime" : ISODate("2022-01-28T04:11:29.276Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1643343079, 1),
"members" : [
{
"_id" : 0,
"name" : "Alma:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 375,
"optime" : {
"ts" : Timestamp(1643343089, 1),
"t" : NumberLong(16)
},
"optimeDate" : ISODate("2022-01-28T04:11:29Z"),
"lastAppliedWallTime" : ISODate("2022-01-28T04:11:29.276Z"),
"lastDurableWallTime" : ISODate("2022-01-28T04:11:29.276Z"),
"syncSourceHost" : "db1:27017",
"syncSourceId" : 2,
"infoMessage" : "",
"configVersion" : 517368,
"configTerm" : 16,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "db2:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 372,
"optime" : {
"ts" : Timestamp(1643343089, 1),
"t" : NumberLong(16)
},
"optimeDurable" : {
"ts" : Timestamp(1643343089, 1),
"t" : NumberLong(16)
},
"optimeDate" : ISODate("2022-01-28T04:11:29Z"),
"optimeDurableDate" : ISODate("2022-01-28T04:11:29Z"),
"lastAppliedWallTime" : ISODate("2022-01-28T04:11:29.276Z"),
"lastDurableWallTime" : ISODate("2022-01-28T04:11:29.276Z"),
"lastHeartbeat" : ISODate("2022-01-28T04:11:31.064Z"),
"lastHeartbeatRecv" : ISODate("2022-01-28T04:11:30.864Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1643341509, 1),
"electionDate" : ISODate("2022-01-28T03:45:09Z"),
"configVersion" : 517368,
"configTerm" : 16
},
{
"_id" : 2,
"name" : "db1:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 372,
"optime" : {
"ts" : Timestamp(1643343089, 1),
"t" : NumberLong(16)
},
"optimeDurable" : {
"ts" : Timestamp(1643343089, 1),
"t" : NumberLong(16)
},
"optimeDate" : ISODate("2022-01-28T04:11:29Z"),
"optimeDurableDate" : ISODate("2022-01-28T04:11:29Z"),
"lastAppliedWallTime" : ISODate("2022-01-28T04:11:29.276Z"),
"lastDurableWallTime" : ISODate("2022-01-28T04:11:29.276Z"),
"lastHeartbeat" : ISODate("2022-01-28T04:11:31.064Z"),
"lastHeartbeatRecv" : ISODate("2022-01-28T04:11:30.448Z"),
"pingMs" : NumberLong(1),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "db2:27017",
"syncSourceId" : 1,
"infoMessage" : "",
"configVersion" : 517368,
"configTerm" : 16
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1643343089, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1643343089, 1)
}
db2依然为主成员,而Alma变成辅助成员
"_id" : 1,
"name" : "db2:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"_id" : 0,
"name" : "Alma:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY"
在副本集中,主成员的归属是可以改变的。
使用MongoDB Compass,连接要选择副本集而不是节点成员。
使用命令:
mongodb://Alma,db1,db2/etaondb?connect=replicaSet&slaveOk=true&replicaSet=etaonrs
连接以后:
利用Compass增加一条一个table:ccc
从主机上看:
etaonrs:SECONDARY> show tables
ccc
comment
创建成功。