Mongodb-ReplicaSet Install

概述

正如上一篇Mongodb-Single Server Install中所说,mongod数据库服务有不同的部署方案(单机部署,副本集部署,分片集群部署),通过不同的配置,可以扮演多种不同的角色:

  • 在单机部署中提供所有数据库服务读写功能
  • 在副本集部署中,部署可以是 primary节点(主服务器,负责写数据,也可以提供查询)、secondary节点(从服务器,它从主节点复制数据,也可以提供查询)、以及arbiter节点(仲裁节点,不保存数据,主要用于参与选举投票)
  • 在分片集群中,除了在每个分片中扮演上述角色外,还扮演着配置服务的角色(存储有分片集群的所有元数据信息,mongos的数据路由分发等都要依赖于它)

我们本实验中安装副本集方案,参考官方文档:https://docs.mongodb.com/manual/replication/

MongoDB 在 1.6 版本对开发了新功能replica set,这比之前的replication 功能要强大一 些,增加了故障自动切换和自动修复成员节点,各个DB 之间数据完全一致,大大降低了维 护成功。3.6版本后已经不支持replication paris(主从复制方式),建议使用replica set,replica set 故障切换完全自动。

Replica Sets的结构类似一个集群,完全可以把它当成一个集群,因为它确实与集群实现的作用是一样的:如果其中一个节点出现故障,其他节点马上会将业务接管过来而无须停机操作。

副本集角色

在副本集部署方案中,有三个角色:

  • 主节点(Primary):主要接收所有写操作
  • 副本节点(Replicate):从主节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作(但需要配置),是默认的一种从节点类型。
  • 仲裁者(Arbiter):不保留任何数据的副本,只具有投票选举作用。当然也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也可以是仲裁者,也是一种从节点类型。
  • 避免为每个副本集部署多个仲裁服务器。

副本集成员及容错

成员最大数
  • 一个副本集最多可以有50个成员,但只有7个投票权成员。即如果副本集已具有 7 个投票成员,则其他成员必须是无表决权的成员。
  • 确保副本集具有奇数个投票成员。
副本集容错

副本集的容错能力是可能变得不可用且仍会在集中留下足够成员来选择主副本集的成员数。
换句话说,它是集合中的成员数量与选举初选所需的大多数投票成员之间的差异。如果没有主副本,副本集将无法接受写入操作。容错是副本集大小的影响,但这种关系不是直接的。
我们知道大多数是指N/2+1,那么我们可以得到容错能力和集群成员数的关系:

成员数量选举新的初选所需的多数票容错
321
431
532
642

设计集群成员数,最好也应为奇数。

主节点选取

当初始化的主节点故障是,副本集的其他主机会要根据一定规则来选主节点。

选举规则

选举规则是根据票数来决定谁获胜:

  • 票数最高,且获得了“大多数”成员的投票支持的节点获胜。
  • “大多数”的定义为:假设复制集内投票成员数量为N,则大多数为 N/2 + 1。例如:3个投票成员,
    则大多数的值是2。
  • 当复制集内存活成员数量不足大多数时,整个复制集将无法选举出Primary,复制集将无法提供写服务,处于只读状态。例如在两节点集群,大多数是N/+1=2,当主节点故障,则剩下一台无法选取得到2票。
  • 为了解决上一问题,可以使用仲裁者(Arbiter)。推广的讲,副本集应该设置奇数节点成员。
  • 若票数相同,且都获得了“大多数”成员的投票支持的,数据新的节点获胜。数据的新旧是通过操作日志oplog来对比的。
优先级

在获得票数的时候,优先级(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%40ssw0rd@mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/?authSource=admin&replicaSet=myrs

Lab

设计3成员副本集,采用一台Primary和两台Secondary

拓扑说明

在这里插入图片描述

本次实验使用三个mongodb实例,分别为Alma、db1和db2。

  • Alma为主节点(Primary):主要接收所有写操作
  • db1、db2为副本节点(Replicate)

安装过程

三台mongodb安装mongod server

安装步骤和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)
ParameterTypeDescription
configurationdocumentOptional. 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> 
  • “ok”的值为1,说明创建成功。
  • 可以看到,该节点马上转化为主节点
向副本集添加辅助成员

语法:

rs.add(host, arbiterOnly)
ParameterTypeDescription
hoststring or document要添加到副本集的新成员。 指定为字符串或配置文档:1)如果是一个字符串,则需要指定新成员的主机名和可选的端口号;2)如果是一个文档,请指定在members数组中找到的副本集成员配置文档。 必须在成员配置文档中指定主机字段。
arbiterOnlyboolean可选的。 仅在 值为字符串时适用。 如果为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)
}
  • “set” : “etaonrs” :副本集的名字
  • “myState” : 1:说明状态正常
  • “majorityVoteCount” : 2 :抽票成主成员所需票数
  • “members” :副本集成员数组,此时有三个:“name” : “Alma:27017”, "db1:27017"和 “db2:27017”
  • “stateStr” : "PRIMARY"成员角色
  • “health” : 1 :成员健康情况,1表示健康,-1表示不健康
副本集的读写操作
  1. 主成员的操作
    在主成员上查看document,读取操作
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" }
  • _id=1的记录被删除
  1. 辅助成员的操作
    辅助成员的数据库维护主数据库数据集的副本。为了复制数据,辅助数据库在异步进程中将主数据库的oplog中的操作应用于其自己的数据集。
    一个副本集可以有一个或多个辅助副本。
    我们查看辅助成员的数据情况:
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的记录同样被删除
  1. 对于客户端读取副本集的内容,是由读取首选项模式决定的,参考读取首选项,默认为应用程序将其读取操作定向到副本集中的主成员。

故障模拟

现在的副本集为三成员,可以提供一个成员的故障保护

辅助成员失效
  1. 停掉db2-辅助成员的mongod进程,查看副本集中db2的状态:
{
                        "_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)”

  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" }

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" }
  1. 恢复db2,查看其数据情况
[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" }

再启动辅助成员,会发现,主成员写入的数据,会自动同步给辅助成员。

主成员失效
  1. 关闭主成员进程
[root@Alma ~]# systemctl stop mongod.service 
[root@Alma ~]# 
  1. 查看副本集状态
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",
  1. 数据情况:
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" }

剩下的两台上面的数都没变。

  1. 在db2上面修改documents数据
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" : "相忘于江湖" }
  1. 恢复Alma,查看数据和副本集状态
[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

指定副本集,成员和设置slaveOK
在这里插入图片描述

连接以后:
在这里插入图片描述
利用Compass增加一条一个table:ccc
从主机上看:

etaonrs:SECONDARY> show tables
ccc
comment

创建成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为什么会这样[user_mongo@nosql01 replicaset]$ cd /opt [user_mongo@nosql01 opt]$ ll total 0 drwxr-xr-x. 3 root root 25 Mar 16 17:08 servers drwxr-xr-x. 2 root root 51 Mar 16 17:10 software [user_mongo@nosql01 opt]$ tar -zxvf /opt/software/mongodb-linux-x86_64-rhel70-4.4.12.tgz -C /opt/servers/mongodb_demo/replicaset/ mongodb-linux-x86_64-rhel70-4.4.12/LICENSE-Community.txt tar: mongodb-linux-x86_64-rhel70-4.4.12: Cannot mkdir: Permission denied tar: mongodb-linux-x86_64-rhel70-4.4.12/LICENSE-Community.txt: Cannot open: No such file or directory mongodb-linux-x86_64-rhel70-4.4.12/MPL-2 tar: mongodb-linux-x86_64-rhel70-4.4.12: Cannot mkdir: Permission denied tar: mongodb-linux-x86_64-rhel70-4.4.12/MPL-2: Cannot open: No such file or directory mongodb-linux-x86_64-rhel70-4.4.12/README tar: mongodb-linux-x86_64-rhel70-4.4.12: Cannot mkdir: Permission denied tar: mongodb-linux-x86_64-rhel70-4.4.12/README: Cannot open: No such file or directory mongodb-linux-x86_64-rhel70-4.4.12/THIRD-PARTY-NOTICES tar: mongodb-linux-x86_64-rhel70-4.4.12: Cannot mkdir: Permission denied tar: mongodb-linux-x86_64-rhel70-4.4.12/THIRD-PARTY-NOTICES: Cannot open: No such file or directory mongodb-linux-x86_64-rhel70-4.4.12/bin/install_compass tar: mongodb-linux-x86_64-rhel70-4.4.12: Cannot mkdir: Permission denied tar: mongodb-linux-x86_64-rhel70-4.4.12/bin/install_compass: Cannot open: No such file or directory mongodb-linux-x86_64-rhel70-4.4.12/bin/mongo tar: mongodb-linux-x86_64-rhel70-4.4.12: Cannot mkdir: Permission denied tar: mongodb-linux-x86_64-rhel70-4.4.12/bin/mongo: Cannot open: No such file or directory mongodb-linux-x86_64-rhel70-4.4.12/bin/mongod tar: mongodb-linux-x86_64-rhel70-4.4.12: Cannot mkdir: Permission denied tar: mongodb-linux-x86_64-rhel70-4.4.12/bin/mongod: Cannot open: No such file or directory mongodb-linux-x86_64-rhel70-4.4.12/bin/mongos tar: mongodb-linux-x86_64-rhel70-4.4.12: Cannot mkdir: Permission denied tar: mongodb-linux-x86_64-rhel70-4.4.12/bin/mongos: Cannot open: No such file or directory tar: Exiting with failure status due to previous errors [user_mongo@nosql01 opt]$ tar -zcvf /opt/software/mongodb-linux-x86_64-rhel70-4.4.12.tgz -C /opt/servers/mongodb_demo/replicaset/ tar: Cowardly refusing to create an empty archive Try `tar --help' or `tar --usage' for more information.
06-01

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值