前置准备
Linux环境下MongoDB的下载安装
一定要做完我的前置准备,对你完成此期教程很有帮助
1. 副本集的三个角色
- 主要成员(Primary):
主要接收所有写操作。就是主节点。 - 副本成员(Replicate):
从主节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作(但需要配置)。 - 仲裁者(Arbiter):
不保留任何数据的副本,只有投票选举作用。当然也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也可以是仲裁者。也是一种从节点类型。
2. 副本集架构规划
一主一副本一仲裁
需要有同样的副本集名称:myrs
3. 副本集的创建
3.1 创建主节点
创建数据目录和日志目录
# 创建主节点
[xiaokang@hadoop ~]$ cd /opt/software/mongodb-4.0.10/
[xiaokang@hadoop mongodb-4.0.10]$ mkdir -p replica_sets/myrs_27017/log
[xiaokang@hadoop mongodb-4.0.10]$ mkdir -p replica_sets/myrs_27017/data/db
新建配置文件
[xiaokang@hadoop mongodb-4.0.10]$ vim replica_sets/myrs_27017/mongod.conf
粘贴以下内容:
systemLog:
#日志文件类型
destination: file
#日志文件的路径
path: "/opt/software/mongodb-4.0.10/replica_sets/myrs_27017/log/mongod.log"
#当mongod重新启动时,新日志会追加到现有日志文件的末尾。
logAppend: true
storage:
#数据文件路径。storage.dbPath设置仅适用于mongod。
dbPath: "/opt/software/mongodb-4.0.10/replica_sets/myrs_27017/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#开启后台运行模式
fork: true
#保存进程ID的文件路径
pidFilePath: "/opt/software/mongodb-4.0.10/replica_sets/myrs_27017/log/mongod.pid"
net:
#服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
#bindIpAll: true
#服务实例绑定的IP
bindIp: hadoop
#bindIp
#绑定的端口
port: 27017
replication:
#副本集的名称
replSetName: myrs
启动主节点
[xiaokang@hadoop mongodb-4.0.10]$ mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27017/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 9645
child process started successfully, parent exiting
3.2 创建副本节点
创建数据目录和日志目录
# 副本节点
[xiaokang@hadoop mongodb-4.0.10]$ mkdir -p replica_sets/myrs_27018/log
[xiaokang@hadoop mongodb-4.0.10]$ mkdir -p replica_sets/myrs_27018/data/db
新建配置文件
[xiaokang@hadoop mongodb-4.0.10]$ vim replica_sets/myrs_27018/mongod.conf
粘贴以下内容:
systemLog:
#日志文件类型
destination: file
#日志文件的路径
path: "/opt/software/mongodb-4.0.10/replica_sets/myrs_27018/log/mongod.log"
#当mongod重新启动时,新日志会追加到现有日志文件的末尾。
logAppend: true
storage:
#数据文件路径。storage.dbPath设置仅适用于mongod。
dbPath: "/opt/software/mongodb-4.0.10/replica_sets/myrs_27018/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#开启后台运行模式
fork: true
#保存进程ID的文件路径
pidFilePath: "/opt/software/mongodb-4.0.10/replica_sets/myrs_27018/log/mongod.pid"
net:
#服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
#bindIpAll: true
#服务实例绑定的IP
bindIp: hadoop
#bindIp
#绑定的端口
port: 27018
replication:
#副本集的名称
replSetName: myrs
启动节点服务
[xiaokang@hadoop mongodb-4.0.10]$ mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27018/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 9733
child process started successfully, parent exiting
3.3 创建仲裁节点
创建数据目录和日志目录
# 仲裁节点
[xiaokang@hadoop mongodb-4.0.10]$ mkdir -p replica_sets/myrs_27019/log
[xiaokang@hadoop mongodb-4.0.10]$ mkdir -p replica_sets/myrs_27019/data/db
新建配置文件
[xiaokang@hadoop mongodb-4.0.10]$ vim replica_sets/myrs_27019/mongod.conf
粘贴以下内容:
systemLog:
#日志文件类型
destination: file
#日志文件的路径
path: "/opt/software/mongodb-4.0.10/replica_sets/myrs_27019/log/mongod.log"
#当mongod重新启动时,新日志会追加到现有日志文件的末尾。
logAppend: true
storage:
#数据文件路径。storage.dbPath设置仅适用于mongod。
dbPath: "/opt/software/mongodb-4.0.10/replica_sets/myrs_27019/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#开启后台运行模式
fork: true
#保存进程ID的文件路径
pidFilePath: "/opt/software/mongodb-4.0.10/replica_sets/myrs_27019/log/mongod.pid"
net:
#服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
#bindIpAll: true
#服务实例绑定的IP
bindIp: hadoop
#bindIp
#绑定的端口
port: 27019
replication:
#副本集的名称
replSetName: myrs
启动节点服务
[xiaokang@hadoop mongodb-4.0.10]$ mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27019/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 9819
child process started successfully, parent exiting
[xiaokang@hadoop mongodb-4.0.10]$ ps -ef | grep mongo
xiaokang 9645 1 0 19:14 ? 00:00:06 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27017/mongod.conf
xiaokang 9733 1 0 19:22 ? 00:00:03 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27018/mongod.conf
xiaokang 9819 1 1 19:29 ? 00:00:01 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27019/mongod.conf
xiaokang 9855 9420 0 19:31 pts/0 00:00:00 grep --color=auto mongo
4. 初始化副本集
使用客户端命令连接任意一个节点,这里尽量连接主节点(27017节点)
[xiaokang@hadoop ~]$ mongo --host hadoop --port 27017
初始化新的副本集
> rs.initiate()
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "hadoop:27017",
"ok" : 1,
"operationTime" : Timestamp(1605353788, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1605353788, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
#初始化以后会发现它是secondary,这是过渡状态
myrs:SECONDARY>
#再按一下回车,就变成了primary,这是它就是主节点了
myrs:PRIMARY>
查看配置:
myrs:PRIMARY> rs.conf()
{
"_id" : "myrs",
"version" : 1,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 0,
"host" : "hadoop:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"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("5fafc13cefab67d7a7521480")
}
}
查看状态
myrs:PRIMARY> rs.status()
{
"set" : "myrs",
"date" : ISODate("2020-11-14T11:42:25.758Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1605354140, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1605354140, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1605354140, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1605354140, 1),
"t" : NumberLong(1)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1605354080, 1),
"members" : [
{
"_id" : 0,
"name" : "hadoop:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1652,
"optime" : {
"ts" : Timestamp(1605354140, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-11-14T11:42:20Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1605353788, 2),
"electionDate" : ISODate("2020-11-14T11:36:28Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
}
],
"ok" : 1,
"operationTime" : Timestamp(1605354140, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1605354140, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
5. 添加副本从节点
myrs:PRIMARY> rs.add("hadoop:27018")
{
"ok" : 1,
"operationTime" : Timestamp(1605354339, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1605354339, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
6. 添加仲裁从节点
myrs:PRIMARY> rs.addArb("hadoop:27019")
{
"ok" : 1,
"operationTime" : Timestamp(1605354448, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1605354448, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
查看状态:
myrs:PRIMARY> rs.status()
这样,整个副本集的搭建就完成了。
7. 副本集的数据读写操作
主节点:
myrs:PRIMARY>
myrs:PRIMARY> use articledb
switched to db articledb
myrs:PRIMARY> db
articledb
myrs:PRIMARY> db.comment.insert({"articleid":"100000","content":"今天天气真好,阳光 明媚","userid":"1001","nickname":"Rose","createdatetime":new Date()})
WriteResult({ "nInserted" : 1 })
myrs:PRIMARY> db.comment.find()
{ "_id" : ObjectId("5fafc763381427ebafcae51f"), "articleid" : "100000", "content" : "今天天气真好,阳光 明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2020-11-14T12:02:43.772Z") }
副本节点
[xiaokang@hadoop ~]$ mongo --host hadoop --port 27018
myrs:SECONDARY> show dbs
报错信息显示:既不是主,也不是从。所以就没法读了
也就是说,27018还没有成为从节点
解决这个问题其实很简单:
myrs:SECONDARY> rs.slaveOk()
myrs:SECONDARY> show dbs
admin 0.000GB
articledb 0.000GB
config 0.000GB
local 0.000GB
myrs:SECONDARY> use articledb
switched to db articledb
myrs:SECONDARY> db.comment.find()
{ "_id" : ObjectId("5fafc763381427ebafcae51f"), "articleid" : "100000", "content" : "今天天气真好,阳光 明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2020-11-14T12:02:43.772Z") }
仲裁节点
仲裁者节点不存放任何业务数据,可以登陆查看
[xiaokang@hadoop ~]$ mongo --host hadoop --port 27019
myrs:ARBITER> show dbs
报错同上:
myrs:ARBITER> rs.slaveOk()
myrs:ARBITER> show dbs
local 0.000GB
8. 主节点的选举原则
MongoDB在副本集中,会自动进行主节点的选举,主节点选举的触发条件:
1) 主节点故障
2) 主节点网络不可达(默认心跳信息为10秒)
3) 人工干预(rs.stepDown(600))
通俗地讲,就是如果原来的老大不行了,就要选举一个新的老大,保证我们的服务高可用
选举规则是根据票数来决定谁获胜:
- 票数最高,且获得了“大多数”成员的投票支持的节点获胜。 “大多数”的定义为:假设副本集内投票成员数量为N,则大多数为 N/2 + 1。例如:3个投票成员, 则大多数的值是2。当副本集内存活成员数量不足大多数时,整个副本集将无法选举出Primary, 副本集将无法提供写服务,处于只读状态。
- 若票数相同,且都获得了“大多数”成员的投票支持的,数据新的节点获胜。 数据的新旧是通过操作日志oplog来对比的。
在获得票数的时候,优先级(priority)参数影响重大。
- 可以通过设置优先级(priority)来设置额外票数。优先级即权重,取值为0-1000,相当于可额外增加 0-1000的票数,优先级的值越大,就越可能获得多数成员的投票(votes)数。指定较高的值可使成员更有资格成为主要成员,更低的值可使成员更不符合条件。
- 默认情况下,优先级的值是1
查看优先级信息
myrs:ARBITER> rs.conf()
27019的优先级为0,因为它不会存数据,只是一个投票的人,不具备选举权
9. 故障测试
副本节点故障测试
杀掉副本节点
[xiaokang@hadoop ~]$ ps -ef | grep mongo
xiaokang 9645 1 0 19:14 ? 00:00:29 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27017/mongod.conf
xiaokang 9733 1 0 19:22 ? 00:00:26 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27018/mongod.conf
xiaokang 9819 1 0 19:29 ? 00:00:20 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27019/mongod.conf
xiaokang 9859 9420 0 19:34 pts/0 00:00:01 mongo --host hadoop --port 27017
xiaokang 10126 10082 0 20:21 pts/2 00:00:00 mongo --host hadoop --port 27019
xiaokang 10245 9560 0 20:46 pts/1 00:00:00 mongo --host hadoop --port 27018
xiaokang 10250 10209 0 20:46 pts/3 00:00:00 grep --color=auto mongo
[xiaokang@hadoop ~]$ kill -9 9733
来到主节点执行一下查询,插入操作,可以看到主节点不受任何影响
myrs:PRIMARY> db.comment.find()
{ "_id" : ObjectId("5fafc763381427ebafcae51f"), "articleid" : "100000", "content" : "今天天气真好,阳光 明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2020-11-14T12:02:43.772Z") }
myrs:PRIMARY> db.comment.insert({"_id":"1","articleid":"100001","content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。","userid":"1002","nickname":"相忘于江 湖","createdatetime":new Date("2019-0805T22:08:15.522Z"),"likenum":NumberInt(1000),"state":"1"})
WriteResult({ "nInserted" : 1 })
来到我们的副本节点,发现服务已经挂掉了
myrs:SECONDARY>
2020-11-14T20:51:10.907+0800 I NETWORK [js] trying reconnect to hadoop:27018 failed
2020-11-14T20:51:10.907+0800 I NETWORK [js] reconnect hadoop:27018 failed failed
>
再来启动我们的副本节点
[xiaokang@hadoop ~]$ mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27018/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 10277
child process started successfully, parent exiting
再来到我们的27018的客户端
> db.comment.find()
2020-11-14T20:53:57.880+0800 I NETWORK [js] trying reconnect to hadoop:27018 failed
2020-11-14T20:53:57.882+0800 I NETWORK [js] reconnect hadoop:27018 ok
Error: error: {
"operationTime" : Timestamp(1605358431, 1),
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1605358431, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
> rs.slaveOk()
> db.comment.find()
> use articledb
switched to db articledb
> db.comment.find()
{ "_id" : ObjectId("5fafc763381427ebafcae51f"), "articleid" : "100000", "content" : "今天天气真好,阳光 明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2020-11-14T12:02:43.772Z") }
{ "_id" : "1", "articleid" : "100001", "content" : "我们不应该把清晨浪费在 手机上,健康很重要,一杯温水幸福你我他。", "userid" : "1002", "nickname" : "相忘于江 湖", "createdatetime" : ISODate("1970-01-01T00:00:00Z"), "likenum" : 1000, "state" : "1" }
我们发现副本节点再次起来的时候,也是两条数据。也就是说,主节点写入的数据,会自动同步给从节点。
主节点故障测试
杀掉主节点
[xiaokang@hadoop ~]$ ps -ef | grep mongo
xiaokang 9645 1 0 19:14 ? 00:00:34 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27017/mongod.conf
xiaokang 9819 1 0 19:29 ? 00:00:23 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27019/mongod.conf
xiaokang 9859 9420 0 19:34 pts/0 00:00:01 mongo --host hadoop --port 27017
xiaokang 10126 10082 0 20:21 pts/2 00:00:00 mongo --host hadoop --port 27019
xiaokang 10245 9560 0 20:46 pts/1 00:00:00 mongo --host hadoop --port 27018
xiaokang 10277 1 1 20:52 ? 00:00:06 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27018/mongod.conf
xiaokang 10391 10209 0 21:00 pts/3 00:00:00 grep --color=auto mongo
[xiaokang@hadoop ~]$ kill -9 9645
来到主节点,发现服务挂掉了
myrs:PRIMARY>
>
来到副本节点
# 先退出一下
>
> exit
bye
#再重新进入
[xiaokang@hadoop ~]$ mongo --host hadoop --port 27018
#27018自动升级为了主节点
myrs:PRIMARY>
重新启动主节点
[xiaokang@hadoop ~]$ mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27017/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 10424
child process started successfully, parent exiting
重新进入27017,发现27107变成了副本节点
> exit
bye
2020-11-14T21:10:50.913+0800 I NETWORK [js] trying reconnect to hadoop:27017 failed
2020-11-14T21:10:50.914+0800 I NETWORK [js] reconnect hadoop:27017 ok
[xiaokang@hadoop ~]$ mongo --host hadoop --port 27017
# 发现27107变成了副本节点。也就是说,27017再启动并不会触发选举规则
myrs:SECONDARY>
仲裁节点和主节点故障
[xiaokang@hadoop ~]$ ps -ef | grep mongo
xiaokang 9819 1 0 19:29 ? 00:00:27 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27019/mongod.conf
xiaokang 10126 10082 0 20:21 pts/2 00:00:00 mongo --host hadoop --port 27019
xiaokang 10277 1 0 20:52 ? 00:00:12 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27018/mongod.conf
xiaokang 10416 9560 0 21:04 pts/1 00:00:00 mongo --host hadoop --port 27018
xiaokang 10424 1 1 21:09 ? 00:00:06 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27017/mongod.conf
xiaokang 10508 9420 0 21:10 pts/0 00:00:00 mongo --host hadoop --port 27017
xiaokang 10532 10209 0 21:20 pts/3 00:00:00 grep --color=auto mongo
#此时主节点是27018
[xiaokang@hadoop ~]$ kill -9 10277 9819
[xiaokang@hadoop ~]$ ps -ef | grep mongo
xiaokang 10126 10082 0 20:21 pts/2 00:00:00 mongo --host hadoop --port 27019
xiaokang 10416 9560 0 21:04 pts/1 00:00:00 mongo --host hadoop --port 27018
xiaokang 10424 1 1 21:09 ? 00:00:06 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27017/mongod.conf
xiaokang 10508 9420 0 21:10 pts/0 00:00:00 mongo --host hadoop --port 27017
xiaokang 10536 10209 0 21:20 pts/3 00:00:00 grep --color=auto mongo
我们的主节点和仲裁节点均挂掉了
myrs:PRIMARY>
2020-11-14T21:22:06.558+0800 I NETWORK [js] trying reconnect to hadoop:27018 failed
2020-11-14T21:22:06.558+0800 I NETWORK [js] reconnect hadoop:27018 failed failed
>
>
myrs:ARBITER>
2020-11-14T21:22:23.867+0800 I NETWORK [js] trying reconnect to hadoop:27019 failed
2020-11-14T21:22:23.867+0800 I NETWORK [js] reconnect hadoop:27019 failed failed
>
>
来到副本节点,这时发现我们的副本节点仍为副本节点,没有升级为主节点。
原因:其他两个节点挂掉了,无法投票,副本节点只有自己给自己投的1票,不满足“大多数”投票规则,即至少2票,所以副本节点仍为副本节点。
myrs:SECONDARY>
myrs:SECONDARY>
myrs:SECONDARY>
仲裁节点和副本节点故障测试
# 启动我们kill掉的结点
[xiaokang@hadoop ~]$ mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27018/mongod.conf
[xiaokang@hadoop ~]$ mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27019/mongod.conf
来到27017,可以发现27017又成为主节点了
原因:刚刚主节点27018挂了之后,我这里27017的数据默认是最新的,触发了一个重新选举,重新选举之后,27017又升级为主节点了
# 27017
myrs:SECONDARY>
myrs:PRIMARY>
27018又变回了副本节点
> exit
bye
[xiaokang@hadoop ~]$ mongo --host hadoop --port 27018
myrs:SECONDARY>
这时,再挂掉我们的副本节点和仲裁节点
[xiaokang@hadoop ~]$ ps -ef | grep mongo
xiaokang 10126 10082 0 20:21 pts/2 00:00:00 mongo --host hadoop --port 27019
xiaokang 10424 1 0 21:09 ? 00:00:13 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27017/mongod.conf
xiaokang 10508 9420 0 21:10 pts/0 00:00:00 mongo --host hadoop --port 27017
xiaokang 10547 1 0 21:27 ? 00:00:03 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27018/mongod.conf
xiaokang 10630 1 0 21:27 ? 00:00:03 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27019/mongod.conf
xiaokang 10703 9560 0 21:33 pts/1 00:00:00 mongo --host hadoop --port 27018
xiaokang 10711 10209 0 21:36 pts/3 00:00:00 grep --color=auto mongo
[xiaokang@hadoop ~]$ kill -9 10547 10630
[xiaokang@hadoop ~]$ ps -ef | grep mongo
xiaokang 10126 10082 0 20:21 pts/2 00:00:00 mongo --host hadoop --port 27019
xiaokang 10424 1 0 21:09 ? 00:00:13 mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27017/mongod.conf
xiaokang 10508 9420 0 21:10 pts/0 00:00:00 mongo --host hadoop --port 27017
xiaokang 10703 9560 0 21:33 pts/1 00:00:00 mongo --host hadoop --port 27018
xiaokang 10715 10209 0 21:37 pts/3 00:00:00 grep --color=auto mongo
来到27017,发现27017自动降级为了副本节点,这里叫“服务降级”
myrs:PRIMARY>
2020-11-14T21:37:45.085+0800 I NETWORK [js] trying reconnect to hadoop:27017 failed
2020-11-14T21:37:45.086+0800 I NETWORK [js] reconnect hadoop:27017 ok
myrs:SECONDARY>
通俗地讲,就是副本集里只剩一个主节点了,主节点会降级为副本节点
10.关闭mongod服务
[xiaokang@hadoop]$ mongod --shutdown --dbpath /opt/software/mongodb-4.0.10/replica_sets/myrs_27017/data/db
[xiaokang@hadoop]$ mongod --shutdown --dbpath /opt/software/mongodb-4.0.10/replica_sets/myrs_27018/data/db
[xiaokang@hadoop]$ mongod --shutdown --dbpath /opt/software/mongodb-4.0.10/replica_sets/myrs_27019/data/db
11. 创建启动、关闭脚本(选学)
创建启动脚本
[xiaokang@hadoop ~]$ cd /opt/software/mongodb-4.0.10/bin/
# 直接复制上一次编写的脚本,然后修改
[xiaokang@hadoop bin]$ cp mongod-server-start.sh mongod-pra-start.sh
[xiaokang@hadoop bin]$ vim mongod-pra-start.sh
#进入脚本,插入以下内容
MONGODB_HOME=/opt/software/mongodb-4.0.10
ssh hadoop "${MONGODB_HOME}/bin/mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27017/mongod.conf & ${MONGODB_HOME}/bin/mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27018/mongod.conf & ${MONGODB_HOME}/bin/mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27019/mongod.conf"
#启动脚本
[xiaokang@hadoop ~]$ mongod-pra-start.sh
about to fork child process, waiting until server is ready for connections.
forked process: 9508
about to fork child process, waiting until server is ready for connections.
about to fork child process, waiting until server is ready for connections.
forked process: 9511
forked process: 9512
child process started successfully, parent exiting
child process started successfully, parent exiting
child process started successfully, parent exiting
[xiaokang@hadoop ~]$ ps -ef | grep mongo
xiaokang 9508 1 15 08:33 ? 00:00:02 /opt/software/mongodb-4.0.10/bin/mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27018/mongod.conf
xiaokang 9511 1 13 08:33 ? 00:00:02 /opt/software/mongodb-4.0.10/bin/mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27017/mongod.conf
xiaokang 9512 1 11 08:33 ? 00:00:02 /opt/software/mongodb-4.0.10/bin/mongod -f /opt/software/mongodb-4.0.10/replica_sets/myrs_27019/mongod.conf
xiaokang 9717 9417 0 08:34 pts/0 00:00:00 grep --color=auto mongo
创建关闭脚本
[xiaokang@hadoop bin]$ cp mongod-pra-start.sh mongod-pra-stop.sh
[xiaokang@hadoop bin]$ vim mongod-pra-stop.sh
#粘贴以下内容
MONGODB_HOME=/opt/software/mongodb-4.0.10
ssh hadoop "${MONGODB_HOME}/bin/mongod --shutdown --dbpath /opt/software/mongodb-4.0.10/replica_sets/myrs_27019/data/db & ${MONGODB_HOME}/bin/mongod --shutdown --dbpath /opt/software/mongodb-4.0.10/replica_sets/myrs_27018/data/db & ${MONGODB_HOME}/bin/mongod --shutdown --dbpath /opt/software/mongodb-4.0.10/replica_sets/myrs_27017/data/db"
[xiaokang@hadoop ~]$ mongod-pra-stop.sh
[xiaokang@hadoop ~]$ ps -ef | grep mongo
xiaokang 10474 10021 0 09:34 pts/3 00:00:00 grep --color=auto mongo