一、MongoDB复制集概述
-
组成
MongoDB复制集(副本集replica set)由一组mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,MongoDB Driver(客户端)的所有数据都写入primary,secondary通过oplog来同步primary的数据,保证主节点和从节点数据的一致性,复制集在完成主从复制的基础上,通过心跳机制,一旦primary节点出现宕机,则触发选举一个新的主节点,剩下的secondary节点指向新的primary,时间应该在10-30s内完成感知primary节点故障,实现高可用数据库集群; -
特点
- 主是唯一的,但不是固定的
- 通过oplog同步数据,保证数据的一致性;
- 从库无法写入(默认情况下,不使用驱动连接时,读也是不能查询的);
- 相对于传统的主从结构,复制集可以自动容灾;
二、MongoDB复制集原理
-
角色(按是否存储数据划分)
- primary主节点
由选举产生,负责客户端的写操作,产生oplog日志文件 - secondary从节点
负责客户端的读操作,提供数据的备份和故障的切换 - arbiter仲裁节点
只参与选举的投票,不会成为primary,也不向primary同步数据,若部署了一个2个节点的复制集,1个primary,1个secondary,任意节点宕机,复制集将不能提供服务(无法选出primary),这时可以给复制集添加一个arbiter节点,即使有节点宕机,仍能选出primary;
- primary主节点
-
角色(按类型区分)
- standard(标准)
这种是常规节点,它存储一份完整的数据副本,参与投票选举,有可能成为主节点 - passive(被动)
存储完整的数据副本,参与投票,不能成为活跃节点 - arbiter(投票)
仲裁节点只参与投票,不接收复制的数据,也不能成为活跃节点
注:每个参与节点(非仲裁者)有个优先权(0-1000),优先权(priority)为0则是被动的,不能成为活跃节点,优先权不为0的,按照由大到小选出活跃节点,优先值一样的则看谁的数据比较新; 注:Mongodb 3.0里,复制集成员最多50个,参与Primary选举投票的成员最多7个;
- standard(标准)
-
选举
每个节点通过优先级定义出节点的类型(标准、被动、投票);
标准节点通过对比自身数据进行选举出primary节点或者secondary节点;-
影响选举的因素
- 心跳检测
复制集内成员每隔两秒向其他成员发送心跳检测信息,若10秒内无响应,则标记其为不可用 - 连接
在多个节点中,最少保证连个节点为工作状态,如果集群中共三个节点,挂掉两个节点,那么剩余的节点无论状态是primary还是处于选举过程中,都会直接降权为secondary
- 心跳检测
-
触发的选举的情况
- 初始化状况
- 从节点们无法与主节点进行通信
- 主节点辞职
-
主节点辞职情况
- 在接收到replSetStepDown命令后
- 在现有的环境中,其他secondary节点的数据落后与本身10s内,且拥有更高优先级
- 当主节点无法与集群中多数节点通信时
注:当主节点辞职后,主节点将关闭自身所有的连接,避免出现客户端在从节点进行写入操作;
-
-
总结
- 架构方面
复制集由一个primary和多个secondary节点构成,在多个实例中进行选举以上角色; - 选举过程
每个MongoDB实例都会通过优先级被定义成为不同的类型(标准、被动、投票);
标准节点和被动节点进行投票选举,选举一个标准节点作为primary节点;
其他所有节点除仲裁节点以外,都被选举成secondary节点,通过oplog日志文件向primary节点同步数据; - 故障切换
在集群内,所有节点每隔10秒发送一次心跳检测信息,若在规定时间内未响应,则认为宕机,触发选举操作;
在多个节点中,至少两个节点是正常工作状态,如只剩下一个节点,则降级为secondary;
- 架构方面
三、部署MongoDB实现应用复制集
-
异常处理
当primary宕机时,如果有数据未同步到secondary,当primary重新加入时,如果新的primary上已经发生写操作,则旧primary需要回滚部分操作,以保证数据集与新的primary一致;旧primary将会滚的数据写到单独的rollback目录下,数据库管理员可根据需要使用mongorestore进行恢复。 -
环境
系统 | 主机名 | IP | 所需软件 |
---|---|---|---|
centos7.8 | mongodb | 192.168.100.105 | mongodb-linux-x86_64-rhel70-3.6.3.tgz |
- 安装mongodb
[root@mongodb ~]# tar xf mongodb-linux-x86_64-rhel70-3.6.3.tgz
[root@mongodb ~]# mv mongodb-linux-x86_64-rhel70-3.6.3 /usr/local/mongodb
[root@mongodb ~]# echo "export PATH=/usr/local/mongodb/bin:\$PATH" >>/etc/profile
[root@mongodb ~]# source /etc/profile
[root@mongodb ~]# ulimit -n 25000
[root@mongodb ~]# ulimit -u 25000
[root@mongodb ~]# echo 0 >/proc/sys/vm/zone_reclaim_mode
[root@mongodb ~]# sysctl -w vm.zone_reclaim_mode=0
vm.zone_reclaim_mode = 0
[root@mongodb ~]# echo never >/sys/kernel/mm/transparent_hugepage/enabled
[root@mongodb ~]# echo never >/sys/kernel/mm/transparent_hugepage/defrag
- 创建并启动四个实例
[root@mongodb ~]# cd /usr/local/mongodb/bin/
[root@mongodb bin]# mkdir {../mongodb1,../mongodb2,../mongodb3,../mongodb4}
[root@mongodb bin]# mkdir ../logs
[root@mongodb bin]# touch ../logs/mongodb{1..4}.log
[root@mongodb bin]# chmod 777 ../logs/mongodb*
[root@mongodb bin]# cat <<END >>/usr/local/mongodb/bin/mongodb1.conf
bind_ip=192.168.100.105
port=27017
dbpath=/usr/local/mongodb/mongodb1/
logpath=/usr/local/mongodb/logs/mongodb1.log
logappend=true
fork=true
maxConns=5000
replSet=haha
#replication name
END
[root@mongodb bin]# cat <<END >>/usr/local/mongodb/bin/mongodb2.conf
bind_ip=192.168.100.105
port=27018
dbpath=/usr/local/mongodb/mongodb2/
logpath=/usr/local/mongodb/logs/mongodb2.log
logappend=true
fork=true
maxConns=5000
replSet=haha
END
[root@mongodb bin]# vi /usr/local/mongodb/bin/mongodb2.conf
[root@mongodb bin]# cat <<END >>/usr/local/mongodb/bin/mongodb3.conf
bind_ip=192.168.100.105
port=27019
dbpath=/usr/local/mongodb/mongodb3/
logpath=/usr/local/mongodb/logs/mongodb3.log
logappend=true
fork=true
maxConns=5000
replSet=haha
END
[root@mongodb bin]# cat <<END >>/usr/local/mongodb/bin/mongodb4.conf
bind_ip=192.168.100.105
port=27020
dbpath=/usr/local/mongodb/mongodb4/
logpath=/usr/local/mongodb/logs/mongodb4.log
logappend=true
fork=true
maxConns=5000
replSet=haha
END
[root@mongodb bin]# cd
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb2.conf
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb3.conf
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb4.conf
[root@mongodb ~]# netstat -utpln |grep mongod
tcp 0 0 192.168.100.105:27019 0.0.0.0:* LISTEN 1224/mongod
tcp 0 0 192.168.100.105:27020 0.0.0.0:* LISTEN 1252/mongod
tcp 0 0 192.168.100.105:27017 0.0.0.0:* LISTEN 1168/mongod
tcp 0 0 192.168.100.105:27018 0.0.0.0:* LISTEN 1196/mongod
[root@mongodb ~]# echo -e "/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/mongodb1.conf \n/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/mongodb2.conf\n/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/mongodb3.conf\n/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/mongodb4.conf">>/etc/rc.local
[root@mongodb ~]# chmod +x /etc/rc.local
[root@mongodb ~]# cat <<END >>/etc/init.d/mongodb
#!/bin/bash
INSTANCE=\$1
ACTION=\$2
case "\$ACTION" in
'start')
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/"\$INSTANCE".conf;;
'stop')
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/"\$INSTANCE".conf --shutdown;;
'restart')
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/"\$INSTANCE".conf --shutdown
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/"\$INSTANCE".conf;;
esac
END
[root@mongodb ~]# chmod +x /etc/init.d/mongodb
[root@mongodb ~]# /etc/init.d/mongodb mongodb1 stop
[root@mongodb ~]# /etc/init.d/mongodb mongodb1 start
- 配置实例
[root@mongodb ~]# mongo --port 27017 --host 192.168.100.105
##添加节点
> cfg={"_id":"haha","members":[{"_id":0,"host":"192.168.100.105:27017"},{"_id":1,"host":"192.168.100.105:27018"},{"_id":2,"host":"192.168.100.105:27019"}]}
{
"_id" : "haha",
"members" : [
{
"_id" : 0,
"host" : "192.168.100.105:27017"
},
{
"_id" : 1,
"host" : "192.168.100.105:27018"
},
{
"_id" : 2,
"host" : "192.168.100.105:27019"
}
]
}
##初始化节点
> rs.initiate(cfg)
{
"ok" : 1,
"operationTime" : Timestamp(1661686022, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1661686022, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
##查看复制群状态
haha:OTHER> rs.status()
{
"set" : "haha",
"date" : ISODate("2022-08-28T11:27:19.065Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1661686035, 3),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1661686035, 3),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1661686035, 3),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1661686035, 3),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.100.105:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", ##主节点
"uptime" : 452,
"optime" : {
"ts" : Timestamp(1661686035, 3),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2022-08-28T11:27:15Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1661686033, 1),
"electionDate" : ISODate("2022-08-28T11:27:13Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.100.105:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", ##从节点
"uptime" : 16,
"optime" : {
"ts" : Timestamp(1661686035, 3),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1661686035, 3),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2022-08-28T11:27:15Z"),
"optimeDurableDate" : ISODate("2022-08-28T11:27:15Z"),
"lastHeartbeat" : ISODate("2022-08-28T11:27:17.897Z"),
"lastHeartbeatRecv" : ISODate("2022-08-28T11:27:15.023Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.100.105:27017",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.100.105:27019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", ##从节点
"uptime" : 16,
"optime" : {
"ts" : Timestamp(1661686035, 3),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1661686035, 3),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2022-08-28T11:27:15Z"),
"optimeDurableDate" : ISODate("2022-08-28T11:27:15Z"),
"lastHeartbeat" : ISODate("2022-08-28T11:27:17.896Z"),
"lastHeartbeatRecv" : ISODate("2022-08-28T11:27:15.018Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.100.105:27017",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1661686035, 3),
"$clusterTime" : {
"clusterTime" : Timestamp(1661686035, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
##添加仲裁节点
haha:PRIMARY> rs.addArb("192.168.100.105:27020")
{
"ok" : 1,
"operationTime" : Timestamp(1661686116, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1661686116, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
haha:PRIMARY> rs.status()
...
{
"_id" : 3,
"name" : "192.168.100.105:27020",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 19,
"lastHeartbeat" : ISODate("2022-08-28T11:28:54.331Z"),
"lastHeartbeatRecv" : ISODate("2022-08-28T11:28:51.329Z"),
"pingMs" : NumberLong(0),
"configVersion" : 2
}
...
注:rs.add()和rs.remove()命令分别用于添加和删除标准节点
haha:PRIMARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
haha:PRIMARY> use cloud
switched to db cloud
haha:PRIMARY> db.users.insert({"id":"1","name":"xiaoming"})
WriteResult({ "nInserted" : 1 })
haha:PRIMARY> db.users.find()
{ "_id" : ObjectId("630b53a4c821b079238237d4"), "id" : "1", "name" : "xiaoming" }
haha:PRIMARY> exit
bye
[root@mongodb ~]# mongo --port 27018 --host 192.168.100.105
haha:SECONDARY> show dbs ##secondary节点默认无法读取
2022-08-28T19:39:49.549+0800 E QUERY [thread1] Error: listDatabases failed:{
"operationTime" : Timestamp(1661686785, 1),
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1661686785, 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:65:1
shellHelper.show@src/mongo/shell/utils.js:816:19
shellHelper@src/mongo/shell/utils.js:706:15
#通过以下方式或者驱动方式实现
haha:SECONDARY> db.getMongo().setSlaveOk();
haha:SECONDARY> show dbs
admin 0.000GB
cloud 0.000GB
config 0.000GB
local 0.000GB
haha:SECONDARY> use cloud
switched to db cloud
##secondary节点无法写入
haha:SECONDARY> db.users.insert({"id":"2","name":"xiaohong"})
WriteResult({ "writeError" : { "code" : 10107, "errmsg" : "not master" } })
haha:SECONDARY> db.users.find()
{ "_id" : ObjectId("630b53a4c821b079238237d4"), "id" : "1", "name" : "xiaoming" }
haha:SECONDARY> exit
bye
- 模拟primary故障,查看角色切换情况
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf --shutdown
[root@mongodb ~]# mongo --port 27018 --host 192.168.100.105
haha:PRIMARY> rs.status()
{
"set" : "haha",
"date" : ISODate("2022-08-28T11:46:53.956Z"),
"myState" : 1,
"term" : NumberLong(2),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1661687175, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1661687175, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1661687212, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1661687212, 1),
"t" : NumberLong(2)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.100.105: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"),
"lastHeartbeat" : ISODate("2022-08-28T11:46:53.225Z"),
"lastHeartbeatRecv" : ISODate("2022-08-28T11:46:19.785Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "Connection refused",
"configVersion" : -1
},
{
"_id" : 1,
"name" : "192.168.100.105:27018",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", ##主节点
"uptime" : 1748,
"optime" : {
"ts" : Timestamp(1661687212, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2022-08-28T11:46:52Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1661687191, 1),
"electionDate" : ISODate("2022-08-28T11:46:31Z"),
"configVersion" : 2,
"self" : true
},
{
"_id" : 2,
"name" : "192.168.100.105:27019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", ##从节点
"uptime" : 1189,
"optime" : {
"ts" : Timestamp(1661687212, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1661687212, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2022-08-28T11:46:52Z"),
"optimeDurableDate" : ISODate("2022-08-28T11:46:52Z"),
"lastHeartbeat" : ISODate("2022-08-28T11:46:53.218Z"),
"lastHeartbeatRecv" : ISODate("2022-08-28T11:46:53.380Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.100.105:27018",
"configVersion" : 2
},
{
"_id" : 3,
"name" : "192.168.100.105:27020",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER", ##仲裁节点
"uptime" : 1097,
"lastHeartbeat" : ISODate("2022-08-28T11:46:53.213Z"),
"lastHeartbeatRecv" : ISODate("2022-08-28T11:46:51.915Z"),
"pingMs" : NumberLong(0),
"configVersion" : 2
}
],
"ok" : 1,
"operationTime" : Timestamp(1661687212, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1661687212, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
haha:PRIMARY> exit
bye
- 启用并手动切换primary角色
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf
[root@mongodb ~]# mongo --port 27018 --host 192.168.100.105
haha:PRIMARY> cfg={"_id":"haha","members":[{"_id":0,"host":"192.168.100.105:27017","priority":100},{"_id":1,"host":"192.168.100.105:27018","priority":10},{"_id":2,"host":"192.168.100.105:27019","priority":10}]}
haha:PRIMARY> rs.reconfig(cfg)
haha:PRIMARY> exit
bye
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb2.conf --shutdown
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb2.conf
[root@mongodb ~]# mongo --port 27017 --host 192.168.100.105
haha:PRIMARY> exit
bye
- 将标准节点停掉,被动节点也不会成为主节点
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf --shutdown
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb2.conf --shutdown
[root@mongodb ~]# mongo --port 27019 --host 192.168.100.105
haha:SECONDARY> rs.status()
{
"set" : "haha",
"date" : ISODate("2022-08-28T12:04:41.351Z"),
"myState" : 2,
"term" : NumberLong(4),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1661688219, 1),
"t" : NumberLong(4)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1661688219, 1),
"t" : NumberLong(4)
},
"appliedOpTime" : {
"ts" : Timestamp(1661688219, 1),
"t" : NumberLong(4)
},
"durableOpTime" : {
"ts" : Timestamp(1661688219, 1),
"t" : NumberLong(4)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.100.105: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"),
"lastHeartbeat" : ISODate("2022-08-28T12:04:39.126Z"),
"lastHeartbeatRecv" : ISODate("2022-08-28T12:03:47.988Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "Connection refused",
"configVersion" : -1
},
{
"_id" : 1,
"name" : "192.168.100.105:27018",
"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"),
"lastHeartbeat" : ISODate("2022-08-28T12:04:39.126Z"),
"lastHeartbeatRecv" : ISODate("2022-08-28T12:03:53.292Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "Connection refused",
"configVersion" : -1
},
{
"_id" : 2,
"name" : "192.168.100.105:27019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 125,
"optime" : {
"ts" : Timestamp(1661688219, 1),
"t" : NumberLong(4)
},
"optimeDate" : ISODate("2022-08-28T12:03:39Z"),
"infoMessage" : "could not find member to sync from",
"configVersion" : 4,
"self" : true
}
],
"ok" : 1,
"operationTime" : Timestamp(1661688219, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1661688219, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
haha:SECONDARY> exit
bye
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf
[root@mongodb ~]# mongod -f /usr/local/mongodb/bin/mongodb2.conf
[root@mongodb ~]# netstat -utpln |grep mongod
tcp 0 0 192.168.100.105:27019 0.0.0.0:* LISTEN 1918/mongod
tcp 0 0 192.168.100.105:27020 0.0.0.0:* LISTEN 1252/mongod
tcp 0 0 192.168.100.105:27017 0.0.0.0:* LISTEN 2024/mongod
tcp 0 0 192.168.100.105:27018 0.0.0.0:* LISTEN 2103/mongod
- 查询复制集状态及查看oplog日志文件的大小
[root@mongodb ~]# mongo --port 27019 --host 192.168.100.105
haha:PRIMARY> use local
switched to db local
haha:PRIMARY> rs.printSlaveReplicationInfo() ##查看节点信息
source: 192.168.100.105:27017
syncedTo: Sun Aug 28 2022 20:08:17 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 192.168.100.105:27018
syncedTo: Sun Aug 28 2022 20:08:17 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
haha:PRIMARY> rs.printReplicationInfo()
configured oplog size: 990MB ##oplog大小为990M
log length start to end: 2535secs (0.7hrs)
oplog first event time: Sun Aug 28 2022 19:27:02 GMT+0800 (CST)
oplog last event time: Sun Aug 28 2022 20:09:17 GMT+0800 (CST)
now: Sun Aug 28 2022 20:09:18 GMT+0800 (CST)
haha:PRIMARY> db.oplog.rs.stats()
{
"ns" : "local.oplog.rs",
"size" : 28427,
"count" : 249,
"avgObjSize" : 114,
"storageSize" : 45056,
"capped" : true,
"max" : -1,
"maxSize" : 1038090240, ##单位是字节
...
- 部署用户认证登录(秘钥对)的复制集
[root@mongodb ~]# mongo --port 27019 --host 192.168.100.105
haha:PRIMARY> use admin
switched to db admin
haha:PRIMARY> db.createUser({"user":"root","pwd":"123","roles":["root"]})
Successfully added user: { "user" : "root", "roles" : [ "root" ] }
haha:PRIMARY> exit
bye
[root@mongodb ~]# echo -e "clusterAuthMode=keyFile\nkeyFile=/usr/local/mongodb/bin/cloudkey1" >>/usr/local/mongodb/bin/mongodb1.conf
[root@mongodb ~]# echo -e "clusterAuthMode=keyFile\nkeyFile=/usr/local/mongodb/bin/cloudkey2" >>/usr/local/mongodb/bin/mongodb2.conf
[root@mongodb ~]# echo -e "clusterAuthMode=keyFile\nkeyFile=/usr/local/mongodb/bin/cloudkey3" >>/usr/local/mongodb/bin/mongodb3.conf
[root@mongodb ~]# echo "haha key" >/usr/local/mongodb/bin/cloudkey1
[root@mongodb ~]# echo "haha key" >/usr/local/mongodb/bin/cloudkey2
[root@mongodb ~]# echo "haha key" >/usr/local/mongodb/bin/cloudkey3
[root@mongodb ~]# chmod 600 /usr/local/mongodb/bin/cloudkey*
[root@mongodb ~]# /etc/init.d/mongodb mongodb1 restart
[root@mongodb ~]# /etc/init.d/mongodb mongodb2 restart
[root@mongodb ~]# /etc/init.d/mongodb mongodb3 restart
[root@mongodb ~]# mongo --port 27019 --host 192.168.100.105
haha:PRIMARY> show dbs
2022-08-28T20:15:53.475+0800 E QUERY [thread1] Error: listDatabases failed:{
...
haha:PRIMARY> use admin
switched to db admin
haha:PRIMARY> db.auth("root","123")
1
haha:PRIMARY> show dbs
admin 0.000GB
cloud 0.000GB
config 0.000GB
local 0.000GB
haha:PRIMARY> exit
bye