Linux环境下 MongoDB-4.0.10 副本集架构搭建及简单测试

前置准备

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
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,以下是搭建 MongoDB 副本的步骤: 1. 准备工作 确保已经安装了 MongoDB,可以通过以下命令检查 MongoDB 是否已经安装: ``` mongod --version ``` 2. 创建数据目录 在创建副本之前,需要为每个 MongoDB 实例创建数据目录。可以通过以下命令创建数据目录: ``` mkdir -p /data/rs1 /data/rs2 /data/rs3 ``` 其中,`/data/rs1`、`/data/rs2` 和 `/data/rs3` 分别是三个 MongoDB 实例的数据目录。 3. 启动 MongoDB 实例 使用以下命令启动三个 MongoDB 实例: ``` mongod --port 27017 --dbpath /data/rs1 --replSet rs0 mongod --port 27018 --dbpath /data/rs2 --replSet rs0 mongod --port 27019 --dbpath /data/rs3 --replSet rs0 ``` 其中,`--port` 参数指定 MongoDB 实例的端口号,`--dbpath` 参数指定数据目录的路径,`--replSet` 参数指定副本的名称。 4. 连接到其中一个 MongoDB 实例 使用以下命令连接到其中一个 MongoDB 实例: ``` mongo --port 27017 ``` 5. 初始化副本MongoDB Shell 中执行以下命令初始化副本: ``` rs.initiate() ``` 6. 添加其他 MongoDB 实例 在 MongoDB Shell 中执行以下命令添加其他 MongoDB 实例: ``` rs.add("localhost:27018") rs.add("localhost:27019") ``` 其中,`localhost:27018` 和 `localhost:27019` 分别是其他两个 MongoDB 实例的地址。 7. 查看副本状态 在 MongoDB Shell 中执行以下命令查看副本状态: ``` rs.status() ``` 如果输出结果中的 `members` 数组中有三个成员,则说明副本搭建成功。 以上就是搭建 MongoDB 副本的步骤,希望对你有帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘新鲜事儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值