mongodb是nosql的数据库,与mysql的关系型数据库在底层构造上面有差异。mogodb的的一个collection对于mysql的一个数据表。mongodb的数据表的格式是:_id: uuid,_id就是这条数据的key。 _id对于的数据内容是bson格式。对于代码里面的结构体。
golang代码中,一个结构体对于mongodb的一个collection文档(bson)。 bson编码是二进制编码的json,可以认为是压缩版本的json。

一、搭建mongodb 副本集(Replica Set):

mongodb的集群有3种方式:

  • (1)经典的主从模式 :适合小业务,单站服务
  • (2)副本集模式:适合常规公司的业务
  • (3)分片模式:超大规模的业务,例如互联网三巨头等公司的数据存储和索引。

性能对比:副本集是性能是最高的 > 主从模式 > 分片。

负载量对比:Sharding > 副本集 > 主从模式。

副本集结构图:

PSS
Primary + Secondary + Secondary模式,通过Primary和Secondary搭建的Replica Set
Diagram of a 3 member replica set that consists of a primary and two secondaries.

该模式下 Replica Set节点数必须为奇数,目的是选主投票的时候要出现大多数才能进行选主决策。

PSA
Primary + Secondary + Arbiter模式,使用Arbiter搭建Replica Set

偶数个数据节点,加一个Arbiter构成的Replica Set

本文采用PSA模式搭建副本集。

副本集特点:

集群当中包含了多份相同的数据,读可以分散到从节点,通过动态选举,保证主节点挂掉了之后,备节点能继续提供数据服务。

副本集原理:

主节点在日志文件中记录在其上的所有r/w请求的oplog(action and parameter),从节点定期轮询主节点获取这些操作w日志,然后对自己维护的数据副本执行这些操作,从而保证从节点的数据与主节点最终的一致性。

副本集角色:

  • Mongodb(M)表示主节点,

  • Mongodb(S)表示备节点,

  • Mongodb(A)表示仲裁节点。

主备节点存储数据,仲裁节点不存储数据,只作为主从切换的裁判角色。客户端同时连接主节点与备节点,不与仲裁节点发生网络连接。

mongodb 节点ip:

192.168.1.100   # 主节点(Master)
192.168.1.101   # 从节点(Slave)
192.168.1.102   # 仲裁节点(arbitration)

默认设置下,主节点提供所有增删查改服务,备节点不提供任何r/w服务。需要手工通过设置使备节点开启提供查询的服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes,配置可以通过客户端的sdk来实现,也可以通过mongodb集群cli实现。

仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。我开始也不相信必须要有仲裁节点,但是自己也试过没仲裁节点的话,主节点挂了备节点还是备节点,所以咱们还是需要它的。

查看mongodb版本:

root@ubuntu:~# mongod --version
db version v3.6.8
git version: 8e540c0b6db93ce994cc548f000900bdc740f80a
OpenSSL version: OpenSSL 1.1.1f  31 Mar 2020
allocator: tcmalloc
modules: none
build environment:distarch: x86_64target_arch: x86_64
root@ubuntu:~#

在3个节点修改mongodb service配置文件为以下内容:

root@ubuntu:~# cat /lib/systemd/system/mongodb.service
[Unit]
Description=An object/document-oriented database
Documentation=man:mongod(1)
After=network.target[Service]
User=root
Group=root
RuntimeDirectory=mongodb
RuntimeDirectoryMode=0755
EnvironmentFile=-/etc/default/mongodb
Environment=CONF=/etc/mongodb.conf
Environment=SOCKETPATH=/run/mongodb
ExecStart=/usr/bin/mongod --unixSocketPrefix=${SOCKETPATH} --config ${CONF} $DAEMON_OPTS
LimitFSIZE=infinity
LimitCPU=infinity
LimitAS=infinity
LimitNOFILE=64000
LimitNPROC=64000[Install]
WantedBy=multi-user.target
root@ubuntu:~#

在192.168.2.123、192.168.1.101、192.168.2.125节点 vim 编辑/etc/mongodb.conf,添加副本集名称:

# mongodb.conf# Where to store the data.
dbpath=/var/lib/mongodb#where to log
logpath=/var/log/mongodb/mongodb.loglogappend=true#bind_ip = 127.0.0.1
bind_ip = 0.0.0.0
#port = 27017# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
journal=true# 副本集名称
replSet=ReplicaSet_test#keyFile默认会开启auth=true
#auth=true
#keyFile=/var/lib/mongodb/key/myKey.txt

初始化副本集:

  • 在3个节点,清空一下目录的历史数据,因为可能以前是用的单机节点,集群部署会有不可预知问题,所以先清空历史数据。
rm -rf   /var/lib/mongodb/*
rm -rf   /var/log/mongodb/mongodb.log
  • 在192.168.2.123、192.168.1.101、192.168.2.125节点,重启动mongodb服务
systemctl restart mongodb
  • 创建副本集:

在mongodb主节点(192.168.1.100)执行命令:

root@ubuntu:~# mongo
MongoDB shell version v3.6.8
connecting to: mongodb://127.0.0.1:27017
Implicit session: session { "id" : UUID("e05fdb96-e520-11eb-a4c8-1bb8ded94398") }
MongoDB server version: 3.6.8
Server has startup warnings:
2020-04-6T20:46:21.572+0800 I STORAGE  [initandlisten]
2020-04-6T20:46:21.572+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2020-04-6T20:46:21.572+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2020-04-6T20:46:21.843+0800 I CONTROL  [initandlisten]
2020-04-6T20:46:21.843+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-04-6T20:46:21.843+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2020-04-6T20:46:21.843+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2020-04-6T20:46:21.843+0800 I CONTROL  [initandlisten]
> use admin
switched to db admin
> config = {_id: "ReplicaSet_test", members: [{_id: 0, host:"192.168.1.100:27017",priority:2}, {_id: 1, host:"192.168.1.101:27017",priority:1}, {_id: 2, host:"192.168.1.102:27017", arbiterOnly : true}]}
{"_id" : "ReplicaSet_test","members" : [{"_id" : 0,"host" : "192.168.1.100:27017","priority" : 2},{"_id" : 1,"host" : "192.168.1.101:27017","priority" : 1},{"_id" : 2,"host" : "192.168.1.102:27017","arbiterOnly" : true}]
}
> rs.initiate(config)
{"ok" : 1,"operationTime" : Timestamp(1626258006, 1),"$clusterTime" : {"clusterTime" : Timestamp(1626258006, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}
ReplicaSet_test:SECONDARY>
ReplicaSet_test:PRIMARY>
  • 观察副本集配置:
ReplicaSet_test:PRIMARY> rs.conf()
{"_id" : "ReplicaSet_test","version" : 1,"protocolVersion" : NumberLong(1),"members" : [{"_id" : 0,"host" : "192.168.1.100:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 2,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 1,"host" : "192.168.1.101:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 2,"host" : "192.168.1.102:27017","arbiterOnly" : true,"buildIndexes" : true,"hidden" : false,"priority" : 0,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1}],"settings" : {"chainingAllowed" : true,"heartbeatIntervalMillis" : 2000,"heartbeatTimeoutSecs" : 10,"electionTimeoutMillis" : 10000,"catchUpTimeoutMillis" : -1,"catchUpTakeoverDelayMillis" : 30000,"getLastErrorModes" : {},"getLastErrorDefaults" : {"w" : 1,"wtimeout" : 0},"replicaSetId" : ObjectId("60eeba56ae31d40af9119e3f")}
}
ReplicaSet_test:PRIMARY>
  • 观察副本集状态:
ReplicaSet_test:PRIMARY> rs.status()
{"set" : "ReplicaSet_test","date" : ISODate("2020-04-6T21:21:51.385Z"),"myState" : 1,"term" : NumberLong(1),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"heartbeatIntervalMillis" : NumberLong(2000),"optimes" : {"lastCommittedOpTime" : {"ts" : Timestamp(1626258109, 1),"t" : NumberLong(1)},"readConcernMajorityOpTime" : {"ts" : Timestamp(1626258109, 1),"t" : NumberLong(1)},"appliedOpTime" : {"ts" : Timestamp(1626258109, 1),"t" : NumberLong(1)},"durableOpTime" : {"ts" : Timestamp(1626258109, 1),"t" : NumberLong(1)}},"members" : [{"_id" : 0,"name" : "192.168.1.100:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 393,"optime" : {"ts" : Timestamp(1626258109, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2020-04-6T21:21:49Z"),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "could not find member to sync from","electionTime" : Timestamp(1626258017, 1),"electionDate" : ISODate("2020-04-6T21:20:17Z"),"configVersion" : 1,"self" : true,"lastHeartbeatMessage" : ""},{"_id" : 1,"name" : "192.168.1.101:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 105,"optime" : {"ts" : Timestamp(1626258109, 1),"t" : NumberLong(1)},"optimeDurable" : {"ts" : Timestamp(1626258109, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2020-04-6T21:21:49Z"),"optimeDurableDate" : ISODate("2020-04-6T21:21:49Z"),"lastHeartbeat" : ISODate("2020-04-6T21:21:49.867Z"),"lastHeartbeatRecv" : ISODate("2020-04-6T21:21:50.613Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncingTo" : "192.168.1.100:27017","syncSourceHost" : "192.168.1.100:27017","syncSourceId" : 0,"infoMessage" : "","configVersion" : 1},{"_id" : 2,"name" : "192.168.1.102:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 105,"lastHeartbeat" : ISODate("2020-04-6T21:21:49.863Z"),"lastHeartbeatRecv" : ISODate("2020-04-6T21:21:50.398Z"),"pingMs" : NumberLong(1),"lastHeartbeatMessage" : "","syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","configVersion" : 1}],"ok" : 1,"operationTime" : Timestamp(1626258109, 1),"$clusterTime" : {"clusterTime" : Timestamp(1626258109, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}
ReplicaSet_test:PRIMARY>
  • 在192.168.2.123节点,创建超级管理员账户:
root@ubuntu:~# mongo
MongoDB shell version v3.6.8
connecting to: mongodb://127.0.0.1:27017
Implicit session: session { "id" : UUID("1d3523da-d76f-4c83-af81-36d6128a4eed") }
MongoDB server version: 3.6.8
Server has startup warnings:
2020-04-6T21:02:04.187+0800 I STORAGE  [initandlisten]
2020-04-6T21:02:04.187+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2020-04-6T21:02:04.187+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2020-04-6T21:04:01.455+0800 I CONTROL  [initandlisten]
2020-04-6T21:04:01.455+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-04-6T21:04:01.455+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2020-04-6T21:04:01.455+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2020-04-6T21:04:01.455+0800 I CONTROL  [initandlisten]
ReplicaSet_test:PRIMARY> use admin
switched to db admin
ReplicaSet_test:PRIMARY> db.createUser(
... {
... user: "admin",
... pwd: "123456",
... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
... }
... )
Successfully added user: {"user" : "admin","roles" : [{"role" : "userAdminAnyDatabase","db" : "admin"}]
}
ReplicaSet_test:PRIMARY> db.auth("admin", "123456")
1
ReplicaSet_test:PRIMARY>
ReplicaSet_test:PRIMARY> db.createUser(
... {
... user: "test",
... pwd: "123456",
... roles: [ { role: "readWrite", db: "test" } ]
... }
... )
Successfully added user: {"user" : "test","roles" : [{"role" : "readWrite","db" : "test"}]
}
ReplicaSet_test:PRIMARY> db.auth("test","123456")
1
ReplicaSet_test:PRIMARY>
  • 副本集初始化后,需要给整个副本集创建帐户、密码, 在192.168.2.123、192.168.1.101、192.168.2.125节点执行命令:

(必须修改/var/lib/mongodb/key/myKey.txt文件权限为600权限,否则无法启动(报错信息是文件权限过大:ACCESS [main] permissions on /var/lib/mongodb/key/myKey.txt are too open))。

root@ubuntu:~# mkdir -p /var/lib/mongodb/key
root@ubuntu:~# chmod 600 /var/lib/mongodb/key
root@ubuntu:~# echo "123456" > /var/lib/mongodb/key/myKey.txt
root@ubuntu:~# chmod 600 /var/lib/mongodb/key/myKey.txt
root@ubuntu:~#

在192.168.2.123、192.168.1.101、192.168.2.125节点,vim 编辑/etc/mongodb.conf文件内容如下:

# mongodb.conf# Where to store the data.
dbpath=/var/lib/mongodb#where to log
logpath=/var/log/mongodb/mongodb.loglogappend=true#bind_ip = 127.0.0.1
bind_ip = 0.0.0.0
#port = 27017# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
journal=true# 副本集名称
replSet=ReplicaSet_test#keyFile默认会开启auth=true
auth=true
keyFile=/var/lib/mongodb/key/myKey.txt

在192.168.2.123、192.168.1.101、192.168.2.125节点执行命令:

root@ubuntu:~# systemctl restart mongodb
  • 使用key文件加载mongodb副本集后,进入mongo cli,查看集群状态:
    注意:要开启权限:db.grantRolesToUser(“admin”, [“clusterAdmin”])
ReplicaSet_test:PRIMARY> db.auth("admin","123456")
1
ReplicaSet_test:PRIMARY> rs.status()
{"operationTime" : Timestamp(1626258754, 1),"ok" : 0,"errmsg" : "not authorized on admin to execute command { replSetGetStatus: 1.0, lsid: { id: UUID(\"b888bb8c-e521-11eb-a50a-8fb2db155462\") }, $clusterTime: { clusterTime: Timestamp(1626258754, 1), signature: { hash: BinData(0, 3A4FB4B97511C70B6A0585762A4E9D060E64766E), keyId: 15472389856/4174109 } }, $db: \"admin\" }","code" : 13,"codeName" : "Unauthorized","$clusterTime" : {"clusterTime" : Timestamp(1626258754, 1),"signature" : {"hash" : BinData(0,"Ok+0uXURxwtqBYV2Kk6dBg5kdm4="),"keyId" : NumberLong("15472389856/4174109")}}
}

报错原因分析:

因为admin用户没有执行这个命令的权限,给admin用户赋予集群管理的权限,将admin用户和test用户添加副本集管理员权限:db.grantRolesToUser(“admin”, [“clusterAdmin”])


root@ubuntu:~# mongo
MongoDB shell version v3.6.8
connecting to: mongodb://127.0.0.1:27017
Implicit session: session { "id" : UUID("6b38a8a0-e522-11eb-a163-333897329773") }
MongoDB server version: 3.6.8
ReplicaSet_test:PRIMARY> use admin
switched to db admin
ReplicaSet_test:PRIMARY> db.auth("admin","123456")
1
ReplicaSet_test:PRIMARY> db.grantRolesToUser("admin", ["clusterAdmin"])
ReplicaSet_test:PRIMARY> rs.status()
{"set" : "ReplicaSet_test","date" : ISODate("2020-04-6T21:35:05.209Z"),"myState" : 1,"term" : NumberLong(3),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"heartbeatIntervalMillis" : NumberLong(2000),"optimes" : {"lastCommittedOpTime" : {"ts" : Timestamp(1626198192, 1),"t" : NumberLong(3)},"readConcernMajorityOpTime" : {"ts" : Timestamp(1626198192, 1),"t" : NumberLong(3)},"appliedOpTime" : {"ts" : Timestamp(1626198192, 1),"t" : NumberLong(3)},"durableOpTime" : {"ts" : Timestamp(1626198192, 1),"t" : NumberLong(3)}},"members" : [{"_id" : 0,"name" : "192.168.1.100:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 279,"optime" : {"ts" : Timestamp(1626198192, 1),"t" : NumberLong(3)},"optimeDate" : ISODate("2020-04-6T21:34:57Z"),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","electionTime" : Timestamp(1626198192, 1),"electionDate" : ISODate("2020-04-6T21:31:53Z"),"configVersion" : 1,"self" : true,"lastHeartbeatMessage" : ""},{"_id" : 1,"name" : "192.168.1.101:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 202,"optime" : {"ts" : Timestamp(1626198192, 1),"t" : NumberLong(3)},"optimeDurable" : {"ts" : Timestamp(1626198192, 1),"t" : NumberLong(3)},"optimeDate" : ISODate("2020-04-6T21:34:57Z"),"optimeDurableDate" : ISODate("2020-04-6T21:34:57Z"),"lastHeartbeat" : ISODate("2020-04-6T21:35:03.541Z"),"lastHeartbeatRecv" : ISODate("2020-04-6T21:35:04.157Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncingTo" : "192.168.1.100:27017","syncSourceHost" : "192.168.1.100:27017","syncSourceId" : 0,"infoMessage" : "","configVersion" : 1},{"_id" : 2,"name" : "192.168.1.102:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 181,"lastHeartbeat" : ISODate("2020-04-6T21:35:03.640Z"),"lastHeartbeatRecv" : ISODate("2020-04-6T21:35:04.681Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","configVersion" : 1}],"ok" : 1,"operationTime" : Timestamp(1626198192, 1),"$clusterTime" : {"clusterTime" : Timestamp(1626198192, 1),"signature" : {"hash" : BinData(0,"qP60+nBufcFpMn5bA6hYqFgn4JU="),"keyId" : NumberLong("15472389856/4174109")}}
}
ReplicaSet_test:PRIMARY>

二、测试mongodb副本集

1 查看mongodb副本集角色:

ReplicaSet_test:PRIMARY> rs.status()
{"set" : "ReplicaSet_test","date" : ISODate("2020-04-6T21:49:49.750Z"),"myState" : 1,"term" : NumberLong(3),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"heartbeatIntervalMillis" : NumberLong(2000),"optimes" : {"lastCommittedOpTime" : {"ts" : Timestamp(1626259784, 1),"t" : NumberLong(3)},"readConcernMajorityOpTime" : {"ts" : Timestamp(1626259784, 1),"t" : NumberLong(3)},"appliedOpTime" : {"ts" : Timestamp(1626259784, 1),"t" : NumberLong(3)},"durableOpTime" : {"ts" : Timestamp(1626259784, 1),"t" : NumberLong(3)}},"members" : [{"_id" : 0,"name" : "192.168.1.100:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 1163,"optime" : {"ts" : Timestamp(1626259784, 1),"t" : NumberLong(3)},"optimeDate" : ISODate("2020-04-6T21:49:44Z"),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","electionTime" : Timestamp(1626258713, 1),"electionDate" : ISODate("2020-04-6T21:31:53Z"),"configVersion" : 1,"self" : true,"lastHeartbeatMessage" : ""},{"_id" : 1,"name" : "192.168.1.101:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 1086,"optime" : {"ts" : Timestamp(1626259784, 1),"t" : NumberLong(3)},"optimeDurable" : {"ts" : Timestamp(1626259784, 1),"t" : NumberLong(3)},"optimeDate" : ISODate("2020-04-6T21:49:44Z"),"optimeDurableDate" : ISODate("2020-04-6T21:49:44Z"),"lastHeartbeat" : ISODate("2020-04-6T21:49:48.469Z"),"lastHeartbeatRecv" : ISODate("2020-04-6T21:49:49.084Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncingTo" : "192.168.1.100:27017","syncSourceHost" : "192.168.1.100:27017","syncSourceId" : 0,"infoMessage" : "","configVersion" : 1},{"_id" : 2,"name" : "192.168.1.102:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 1066,"lastHeartbeat" : ISODate("2020-04-6T21:49:48.514Z"),"lastHeartbeatRecv" : ISODate("2020-04-6T21:49:49.684Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","configVersion" : 1}],"ok" : 1,"operationTime" : Timestamp(1626259784, 1),"$clusterTime" : {"clusterTime" : Timestamp(1626259784, 1),"signature" : {"hash" : BinData(0,"zcoriua7yyetYyg3PZCDp6+53sM="),"keyId" : NumberLong("15472389856/4174109")}}
}
ReplicaSet_test:PRIMARY>
ReplicaSet_test:PRIMARY> quit()
root@ubuntu:~#

2 关闭master节点(192.168.1.100),查看主节点切换:

在192.168.2.123节点执行命令,关掉master的mongodb服务:

root@ubuntu:~# systemctl stop mongodb

在192.168.2.124节点(slave节点)查看副本当前状态,发现master挂掉后,slave成为了副本集的主节点:

root@ubuntu:~# mongo
MongoDB shell version v3.6.8
connecting to: mongodb://127.0.0.1:27017
Implicit session: session { "id" : UUID("d669714a-e522-11eb-bd07-bb29e6d39677") }
MongoDB server version: 3.6.8
ReplicaSet_test:PRIMARY> use admin
switched to db admin
ReplicaSet_test:PRIMARY> db.auth("admin","123456")
1
ReplicaSet_test:PRIMARY> rs.status()
{"set" : "ReplicaSet_test","date" : ISODate("2020-04-6T21:53:02.479Z"),"myState" : 1,"term" : NumberLong(4),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"heartbeatIntervalMillis" : NumberLong(2000),"optimes" : {"lastCommittedOpTime" : {"ts" : Timestamp(1626259924, 1),"t" : NumberLong(3)},"readConcernMajorityOpTime" : {"ts" : Timestamp(1626259924, 1),"t" : NumberLong(3)},"appliedOpTime" : {"ts" : Timestamp(1626259975, 1),"t" : NumberLong(4)},"durableOpTime" : {"ts" : Timestamp(1626259975, 1),"t" : NumberLong(4)}},"members" : [{"_id" : 0,"name" : "192.168.1.100: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("2020-04-6T21:53:01.916Z"),"lastHeartbeatRecv" : ISODate("2020-04-6T21:52:12.626Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "Connection refused","syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","configVersion" : -1},{"_id" : 1,"name" : "192.168.1.101:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 1283,"optime" : {"ts" : Timestamp(1626259975, 1),"t" : NumberLong(4)},"optimeDate" : ISODate("2020-04-6T21:52:55Z"),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "could not find member to sync from","electionTime" : Timestamp(1626259943, 1),"electionDate" : ISODate("2020-04-6T21:52:23Z"),"configVersion" : 1,"self" : true,"lastHeartbeatMessage" : ""},{"_id" : 2,"name" : "192.168.1.102:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 1259,"lastHeartbeat" : ISODate("2020-04-6T21:53:01.861Z"),"lastHeartbeatRecv" : ISODate("2020-04-6T21:53:01.888Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","configVersion" : 1}],"ok" : 1,"operationTime" : Timestamp(1626259975, 1),"$clusterTime" : {"clusterTime" : Timestamp(1626259975, 1),"signature" : {"hash" : BinData(0,"RznptKOp1H535+y+ki/UZqoOhTY="),"keyId" : NumberLong("15472389856/4174109")}}
}
ReplicaSet_test:PRIMARY>

3 关闭master节点(192.168.1.100),查看主节点恢复:

打开192.168.2.123节点的mongodb服务:

systemctl start mongodb

查看当前mongodb副集的状态,发现192.168.2.123已经恢复成了主节点的身份:

ReplicaSet_test:SECONDARY> rs.status()
{"set" : "ReplicaSet_test","date" : ISODate("2020-04-6T21:55:52.681Z"),"myState" : 2,"term" : NumberLong(5),"syncingTo" : "192.168.1.100:27017","syncSourceHost" : "192.168.1.100:27017","syncSourceId" : 0,"heartbeatIntervalMillis" : NumberLong(2000),"optimes" : {"lastCommittedOpTime" : {"ts" : Timestamp(1626260145, 1),"t" : NumberLong(5)},"readConcernMajorityOpTime" : {"ts" : Timestamp(1626260145, 1),"t" : NumberLong(5)},"appliedOpTime" : {"ts" : Timestamp(1626260145, 1),"t" : NumberLong(5)},"durableOpTime" : {"ts" : Timestamp(1626260145, 1),"t" : NumberLong(5)}},"members" : [{"_id" : 0,"name" : "192.168.1.100:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 28,"optime" : {"ts" : Timestamp(1626260145, 1),"t" : NumberLong(5)},"optimeDurable" : {"ts" : Timestamp(1626260145, 1),"t" : NumberLong(5)},"optimeDate" : ISODate("2020-04-6T21:55:45Z"),"optimeDurableDate" : ISODate("2020-04-6T21:55:45Z"),"lastHeartbeat" : ISODate("2020-04-6T21:55:51.380Z"),"lastHeartbeatRecv" : ISODate("2020-04-6T21:55:52.438Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","electionTime" : Timestamp(1626260134, 1),"electionDate" : ISODate("2020-04-6T21:55:34Z"),"configVersion" : 1},{"_id" : 1,"name" : "192.168.1.101:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 1453,"optime" : {"ts" : Timestamp(1626260145, 1),"t" : NumberLong(5)},"optimeDate" : ISODate("2020-04-6T21:55:45Z"),"syncingTo" : "192.168.1.100:27017","syncSourceHost" : "192.168.1.100:27017","syncSourceId" : 0,"infoMessage" : "","configVersion" : 1,"self" : true,"lastHeartbeatMessage" : ""},{"_id" : 2,"name" : "192.168.1.102:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 1429,"lastHeartbeat" : ISODate("2020-04-6T21:55:51.541Z"),"lastHeartbeatRecv" : ISODate("2020-04-6T21:55:52.046Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","configVersion" : 1}],"ok" : 1,"operationTime" : Timestamp(1626260145, 1),"$clusterTime" : {"clusterTime" : Timestamp(1626260145, 1),"signature" : {"hash" : BinData(0,"3+5Uill5sMmjXikoz+aZ4Ky4hqY="),"keyId" : NumberLong("15472389856/4174109")}}
}
ReplicaSet_test:SECONDARY>

读写测试:

root@ubuntu:~# mongo
MongoDB shell version v3.6.8
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.8
Server has startup warnings:
2021-07-14T19:59:43.060-0700 I STORAGE  [initandlisten]
2021-07-14T19:59:43.060-0700 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2021-07-14T19:59:43.060-0700 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2021-07-14T19:59:47.295-0700 I CONTROL  [initandlisten]
2021-07-14T19:59:47.295-0700 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2021-07-14T19:59:47.295-0700 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2021-07-14T19:59:47.295-0700 I CONTROL  [initandlisten]
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
> use test
switched to db test
> show tables
student
>
> db.student.insert
db.student.insert(      db.student.insertMany(  db.student.insertOne(
> db.student.insert({"id":1, "name":"kk", "value":"aabbccdd"})
WriteResult({ "nInserted" : 1 })
>
> db.student.insert({"cnt":"100", "name":"zhang", "value":101, "level":"明星"})
WriteResult({ "nInserted" : 1 })
>
> db.student.find({})
{ "_id" : ObjectId("60effbcd69add9172a77b82f"), "id" : 1, "name" : "kk", "value" : "aabbccdd" }
{ "_id" : ObjectId("60effd0a69add9172a77b830"), "cnt" : "100", "name" : "zhang", "value" : 101, "level" : "明星" }
>
> > quit()
root@ubuntu:~#

mongodb 副本集搭建相关推荐

  1. MongoDB副本集搭建及在springboot中使用

    MongoDB副本集搭建及在springboot中使用 一.mongoDB副本集的搭建 原则就是一台master(主),一台salve(从),一台arbiter(仲裁) 1.下载mongoDB htt ...

  2. MongoDB副本集搭建、连接php

    文章目录 PHP连接MongoDB MongoDB副本集介绍 MongoDB副本集搭建 MongoDB副本集测试 PHP连接MongoDB php连接MongoDB需要安装拓展包有两种,分别是mong ...

  3. Linux下MongoDB副本集搭建(主--从--仲裁模式)

    1.下载MongoDB安装文件:mongodb-linux-x86_64-3.2.1.tgz(版本随意): 2.解压安装MongoDB:tar  -zxvf  mongodb-linux-x86_64 ...

  4. MongoDB副本集搭建(超级详细)

    MongoDB 副本集原理 什么是复制 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性 复制还允许从硬件故障和服务中断中恢复数据 为什么要复制 数据 ...

  5. mongodb副本集搭建

    cat >> /etc/sysctl.conf< cat >>/etc/security/limits.conf<<EOF soft nproc 65535 ...

  6. 小丸子学MongoDB系列之——部署MongoDB副本集

    1.以副本集的方式启动mongodb实例 1.1 创建副本集目录 [mgousr01@vm1 ~]$ mkdir -p mongorep/{mg17/{bin,conf,data,logs,pid}, ...

  7. Mongodb 副本集+分片集群搭建

    环境需求: 在三台机器上搭建副本集,在副本集上做分片 服务器IP: 192.168.1.232/192.168.1.238/192.168.1.241 安装Mongodb all nodes: tar ...

  8. mongodb的架构 副本集搭建

    早期的版本使用master-slave,一主一从和mysql类型,但slave在此架构中为只读,如果主库宕机后,从库不能自动切换为主 需要手动才行 后期mongodb开发了个新的架构方案副本集,所以呢 ...

  9. MongoDB副本集学习(一):概述和环境搭建

    MongoDB副本集概述 以下图片摘自MongoDB官方文档:http://docs.mongodb.org/manual/core/replication-introduction/ Primary ...

  10. MongoDB副本集(Replica Sets)搭建教程

    MongoDB副本集(Replica Sets)搭建教程 最近在生产环境下部署公司项目.由于项目中有使用到MongoDB,所以参考网上的博客,在服务器上进行搭建MongoDB副本集.今天打算将其记录成 ...

最新文章

  1. vector,数组,动态数组效率测试
  2. 十类最让前辈讨厌的新人
  3. Nmap源码分析(主机发现)
  4. 面试题: mysql 数据库已看 sql安全性 索引 引擎 sql优化
  5. html文件里的scr是什么,HTML中关于url、scr、href的区别
  6. 数据结构——绪论以及线性表的顺序表示
  7. .Net深入学习序列化和反序列化 (转)
  8. git idea 图形化_Git大全,你所需要的Git资料都在这里
  9. ★LeetCode(704)——二分查找(JavaScript)
  10. gitlab merge request
  11. devc 能优化吗_为啥觉得Dev c++越来越难用?
  12. Python类调用实例方法
  13. JZOJ 6841. 【2020.11.5提高组模拟】淘淘蓝蓝之树林(凸包+最短路)
  14. 2020 年 Python 知识清单(网络爬虫)
  15. SDI视频数据流格式简介(频率、速率、YUV、EAV、SAV)
  16. pyqt5 图像上划线_PyQt5 绘制画 线(鼠标笔)
  17. pandas使用.astype()修改数据类型
  18. ALEVEL经济学:通货膨胀的原因是什么?
  19. ENC28J60学习笔记——第4部分
  20. 共享单车出行数据分析及可视化报告

热门文章

  1. c++ append用法
  2. 谷歌io大会2019_Google IO 2012的前5个精选
  3. 合唱队形c语言编程,洛谷 P1091 合唱队形
  4. 一个很懂业务的资深技术Leader的技术管理成长之路
  5. 许巍的故乡到底想表达什么?是写给谁的?
  6. NShape(开源矢量图形编辑器) 基本功能开发(一)
  7. Android中使用SVG矢量图打造多边形图形框架
  8. HTB打靶(Active Directory 101 Forest)
  9. 王琪你计算机学院,麦考瑞大学 AI 实验室中科院信工所,两场论文直播重磅来袭!...
  10. python链家网爬虫_python3编写爬虫程序获取链家网租房信息