MongoDB复制集部署及管理

一、MongoDB 复制(副本)集

1. 介绍

  • MongoDB复制是将数据同步在多个服务器的过程。

  • 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。

  • 复制还允许您从硬件故障和服务中断中恢复数据。

2.复制集的有点

  1. 保障数据的安全性
  2. 数据高可用性 (24*7)
  3. 灾难恢复
  4. 无需停机维护(如备份,重建索引,压缩)
  5. 分布式读取数据

3.MongoDB复制原理

  • mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

  • mongodb各个节点常见的搭配方式为:一主一从、一主多从。

  • 主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

在这里插入图片描述

4.副本集特点

  • 可以有N 个节点的集群
  • 任何节点可作为主节点
  • 所有写入操作都在主节点上
  • 支持自动故障转移
  • 支持自动恢复

二、构建MongoDB复制集

实验环境,就在一台虚拟机上模拟出4实例,进行操作

1.修改实例配置文件

[root@localhost logs]# vim /etc/mongod.conf 
 30   bindIp: 0.0.0.0      ##监听IP改成0.0.0.0,监听所有
 37   replication:           ##去掉注释,启用复制集
 38       replSetName: myinstance      ##在replication配置区域下插入这条语句,定义复制集名称,各节点要一致

2. 重启实例

[root@localhost logs]# mongod -f /etc/mongod.conf --shutdown      ##通过配置文件关闭实例
killing process with pid: 2171
[root@localhost logs]# mongod -f /etc/mongod.conf       ##再次启动
about to fork child process, waiting until server is ready for connections.
forked process: 4046
child process started successfully, parent exiting

3.创建另外3台实例的配置文件

[root@localhost logs]# cp -p /etc/mongod.conf /etc/mongod2.conf      ##复制生成实例2的配置文件
[root@localhost logs]# cp -p /etc/mongod.conf /etc/mongod3.conf     ##复制生成实例3的配置文件
[root@localhost logs]# cp -p /etc/mongod.conf /etc/mongod4.conf     ##复制生成实例4的配置文件

4.依次修改实例2,3,4的配置文件

修改实例2

[root@localhost ~]# vim /etc/mongod2.conf     ##修改实例2配置文件
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/logs/mongodb2.log       ##指定日志文件
  
storage:
  dbPath: /data/mongodb/mongodb2      ##指定数据存放目录
  journal:
    enabled: true
net:
  port: 27018         ##修改端口号,因为是在一台虚拟机上做的实验,因此不能冲突
  bindIp: 0.0.0.0 

修改实例3

[root@localhost ~]# vim /etc/mongod3.conf     ##修改实例3配置文件
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/logs/mongodb3.log       ##指定日志文件
  
storage:
  dbPath: /data/mongodb/mongodb3     ##指定数据存放目录
  journal:
    enabled: true
net:
  port: 27019         ##修改端口号,因为是在一台虚拟机上做的实验,因此不能冲突
  bindIp: 0.0.0.0 

修改实例4

[root@localhost ~]# vim /etc/mongod4.conf     ##修改实例4配置文件
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/logs/mongodb4.log       ##指定日志文件
  
storage:
  dbPath: /data/mongodb/mongodb4      ##指定数据存放目录
  journal:
    enabled: true
net:
  port: 27020         ##修改端口号,因为是在一台虚拟机上做的实验,因此不能冲突
  bindIp: 0.0.0.0 

5.创建实例2,3,4的数据目录及日志文件

[root@localhost ~]# mkdir -p /data/mongodb/mongodb{2..4}       ##创建3个实例的数据存放目录
[root@localhost ~]# mkdir -p /data/mongodb/logs               ##创建存放日志文件的目录
[root@localhost ~]# touch /data/mongodb/logs/mongodb{2,3,4}.log      ##创建3个实例的日志文件
[root@localhost ~]# chmod 777 /data/mongodb/logs/mongodb{2,3,4}.log      ##授予日志问价最高权限,一定要授权,否则会报错
[root@localhost ~]# cd /data/mongodb/ 
[root@localhost mongodb]# ls     ##查看工作目录是否全部创建
logs  mongo  mongodb2  mongodb3  mongodb4
[root@localhost mongodb]# cd /data/mongodb/logs/
[root@localhost logs]# ll           ##传看日志文件创建及权限
total 0
-rwxrwxrwx 1 root root 0 Nov  8 10:24 mongodb2.log
-rwxrwxrwx 1 root root 0 Nov  8 10:24 mongodb3.log
-rwxrwxrwx 1 root root 0 Nov  8 10:24 mongodb4.log

6.开启三台实例

[root@localhost ~]# mongod -f /etc/mongod2.conf
about to fork child process, waiting until server is ready for connections.
forked process: 4309
child process started successfully, parent exiting

[root@localhost ~]# mongod -f /etc/mongod3.conf
about to fork child process, waiting until server is ready for connections.
forked process: 4338
child process started successfully, parent exiting

[root@localhost ~]# mongod -f /etc/mongod4.conf
about to fork child process, waiting until server is ready for connections.
forked process: 4367
child process started successfully, parent exiting

[root@localhost ~]# netstat -anpt |grep mongod     ##查看服务,4台实例全部启动
tcp        0      0 0.0.0.0:27019           0.0.0.0:*               LISTEN      4338/mongod         
tcp        0      0 0.0.0.0:27020           0.0.0.0:*               LISTEN      4367/mongod         
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      4046/mongod         
tcp        0      0 0.0.0.0:27018           0.0.0.0:*               LISTEN      4309/mongod         

7.创建复制集

[root@localhost ~]# mongo    ##进入默认的27017端口的实例(4个实例任意进入都可以)

> rs.status()   ##查看复制集当前状态,此时状态为0,不OK状态,因为复制集还未开启

> rs.initiate(cfg)     ##启动复制集
{
	"ok" : 1,
	"operationTime" : Timestamp(1604806079, 1),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1604806079, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
####发现前缀名发生了改变##################
myinstance:PRIMARY> rs.status()     ##再次查看,就可以看出每个节点的状态

{
	"set" : "myinstance",
	"date" : ISODate("2020-11-08T03:33:00.184Z"),
	"myState" : 1,
 	……省略部分
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.10.10:27017",
			"health" : 1,     ##健康运行状态
			"state" : 1,      ##1为主,其余都为2
			"stateStr" : "PRIMARY",     ##主要地位
			"uptime" : 2865,
		……省略部分
		{
			"_id" : 1,
			"name" : "192.168.10.10:27018",
			"health" : 1,
			"state" : 2,    ##从的值都为2
			"stateStr" : "SECONDARY",     ##次要地位
			"uptime" : 300,
		……省略部分

		{
			"_id" : 2,
			"name" : "192.168.10.10:27019",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 300,
		……省略部分

		{
			"_id" : 3,
			"name" : "192.168.10.10:27020",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 300,
		……省略部分
		}
	],
	"ok" : 1,      ##开启完成
……省略部分
}

[root@localhost ~]# mongo --port 27018    ##进入实例2 查看
myinstance:SECONDARY>       ##根据前缀就可以看出是从

8.删除和添加节点

myinstance:PRIMARY> rs.remove("192.168.10.10:27020")     ##删除实例4

myinstance:PRIMARY> rs.status()    ##查看复制集状态信息,可以查看出复制集中的成员只有3个了,删除成功
{
	……省略部分
	"members" : [     ##成员信息
		{
			"_id" : 0,
			"name" : "192.168.10.10:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
……省略部分
		{
			"_id" : 1,
			"name" : "192.168.10.10:27018",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
……省略部分
		{
			"_id" : 2,
			"name" : "192.168.10.10:27019",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
……省略部分
	}
}

myinstance:PRIMARY> rs.add("192.168.10.10:27020")    ##添加实例

myinstance:PRIMARY> rs.status()    ##查看复制集状态信息,可以查看出复制集中的成员只有,实例4又添加回来了
{
	……省略部分
	"members" : [     ##成员信息
		{
			"_id" : 0,
			"name" : "192.168.10.10:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
……省略部分
		{
			"_id" : 1,
			"name" : "192.168.10.10:27018",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
……省略部分
		{
			"_id" : 2,
			"name" : "192.168.10.10:27019",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
……省略部分
	}
			{
			"_id" : 3,
			"name" : "192.168.10.10:27020",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
……省略部分
}


9.模拟故障,验证故障转移(自动切换)

[root@localhost ~]# ps aux |grep -v grep |grep mongod   ##查看mongod,4个实例的进程PID
root       4046  0.5  2.5 1601748 99016 ?       Sl   10:45   0:27 mongod -f /etc/mongod.conf
root       4309  0.5  2.6 1534092 102744 ?      Sl   11:03   0:19 mongod -f /etc/mongod2.conf
root       4338  0.5  2.6 1523108 103676 ?      Sl   11:03   0:18 mongod -f /etc/mongod3.conf
root       4367  0.5  2.5 1470808 98524 ?       Sl   11:03   0:18 mongod -f /etc/mongod4.conf

[root@localhost ~]# kill -9 4046     ##干掉主实例

[root@localhost ~]# ps aux |grep -v grep |grep mongod     ##主实例1 被干掉了
root       4309  0.5  2.6 1542288 102600 ?      Sl   11:03   0:20 mongod -f /etc/mongod2.conf
root       4338  0.5  2.7 1523108 105176 ?      Sl   11:03   0:20 mongod -f /etc/mongod3.conf
root       4367  0.5  2.6 1487200 103424 ?      Sl   11:03   0:20 mongod -f /etc/mongod4.conf

[root@localhost ~]# mongo --port 27018    ##进入任意一个节点实例,(除了主实例,已经被干掉了)
myinstance:SECONDARY> rs.status()       ##查看复制集信息
……省略部分
	"members" : [
		{
			"_id" : 0,      ##实例1
			"name" : "192.168.10.10:27017",
			"health" : 0,     ##状态为0,不健康宕机状态
			"state" : 8,      ##返回的状态码为8
			"stateStr" : "(not reachable/healthy)",     ##不可获取,不健康状态
                                   ……省略部分
			"_id" : 3,
			"name" : "192.168.10.10:27020",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",    ##实例3切换为新的主实例、
			
[root@localhost ~]# mongo --port 27020     ##进入实例4
myinstance:PRIMARY>        ##确实切换成PRIMARY主实例了
  

10. 故障切换转移(手动切换),在PRIMARY设置,主动让出主的地位

[root@localhost ~]# mongo --port 27020
myinstance:PRIMARY> rs.freeze(30)      ##暂停30秒不参与选举

myinstance:PRIMARY> rs.stepDown(60,30)  ##交出主节点的位置,位置从节点状态不少于60秒,等待30秒使主节点和从节点同步
run command 'replSetStepDown' on host '127.0.0.1:27020'  :
……省略部分
2020-11-08T12:20:54.780+0800 I NETWORK  [thread1] trying reconnect to 127.0.0.1:27020 (127.0.0.1) failed
2020-11-08T12:20:54.780+0800 I NETWORK  [thread1] reconnect 127.0.0.1:27020 (127.0.0.1) ok

myinstance:SECONDARY>      ##已经变成从节点了
  • 备注:让出了主节点的位置,并且设置了30秒不参与竞选,维持60秒从节点的状态,这段时间内主节点肯定已经被抢占了,相当于故障手动转移。
  • 注意:每个从节点尽量不要有数据写入,因为从节点同步主节点的数据,会删除不同步的部分,导致写入的数据丢失。

官方帮助文档:https://docs.mongodb.com/manual/reference/configuration-options/

三、构建选举复制集

1.创建多实例,同上个实验(这里就不详解了)

[root@localhost logs]# vim /etc/mongod.conf 
 30   bindIp: 0.0.0.0      ##监听IP改成0.0.0.0,监听所有
 37   replication:           ##去掉注释,启用复制集
 38       replSetName: myinstance      ##在replication配置区域下插入这条语句,定义复制集名称,各节点要一致

[root@localhost logs]# mongod -f /etc/mongod.conf --shutdown      ##通过配置文件关闭实例
killing process with pid: 2171
[root@localhost logs]# mongod -f /etc/mongod.conf       ##再次启动
about to fork child process, waiting until server is ready for connections.
forked process: 4046
child process started successfully, parent exiting


[root@localhost logs]# cp -p /etc/mongod.conf /etc/mongod2.conf      ##复制生成实例2的配置文件
[root@localhost logs]# cp -p /etc/mongod.conf /etc/mongod3.conf     ##复制生成实例3的配置文件
[root@localhost logs]# cp -p /etc/mongod.conf /etc/mongod4.conf     ##复制生成实例4的配置文件

[root@localhost ~]# vim /etc/mongod2.conf     ##修改实例2配置文件
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/logs/mongodb2.log       ##指定日志文件
  
storage:
  dbPath: /data/mongodb/mongodb2      ##指定数据存放目录
  journal:
    enabled: true
net:
  port: 27018         ##修改端口号,因为是在一台虚拟机上做的实验,因此不能冲突
  bindIp: 0.0.0.0 

[root@localhost ~]# vim /etc/mongod3.conf     ##修改实例3配置文件
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/logs/mongodb3.log       ##指定日志文件
  
storage:
  dbPath: /data/mongodb/mongodb3     ##指定数据存放目录
  journal:
    enabled: true
net:
  port: 27019         ##修改端口号,因为是在一台虚拟机上做的实验,因此不能冲突
  bindIp: 0.0.0.0 

[root@localhost ~]# vim /etc/mongod4.conf     ##修改实例4配置文件
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/logs/mongodb4.log       ##指定日志文件
  
storage:
  dbPath: /data/mongodb/mongodb4      ##指定数据存放目录
  journal:
    enabled: true
net:
  port: 27020         ##修改端口号,因为是在一台虚拟机上做的实验,因此不能冲突
  bindIp: 0.0.0.0 

[root@localhost ~]# mkdir -p /data/mongodb/mongodb{2..4}       ##创建3个实例的数据存放目录
[root@localhost ~]# mkdir -p /data/mongodb/logs               ##创建存放日志文件的目录
[root@localhost ~]# touch /data/mongodb/logs/mongodb{2,3,4}.log      ##创建3个实例的日志文件
[root@localhost ~]# chmod 777 /data/mongodb/logs/mongodb{2,3,4}.log      ##授予日志问价最高权限,一定要授权,否则会报错
[root@localhost ~]# cd /data/mongodb/ 
[root@localhost mongodb]# ls     ##查看工作目录是否全部创建
logs  mongo  mongodb2  mongodb3  mongodb4
[root@localhost mongodb]# cd /data/mongodb/logs/
[root@localhost logs]# ll           ##传看日志文件创建及权限
total 0
-rwxrwxrwx 1 root root 0 Nov  8 10:24 mongodb2.log
-rwxrwxrwx 1 root root 0 Nov  8 10:24 mongodb3.log
-rwxrwxrwx 1 root root 0 Nov  8 10:24 mongodb4.log

[root@localhost ~]# mongod -f /etc/mongod2.conf
about to fork child process, waiting until server is ready for connections.
forked process: 4309
child process started successfully, parent exiting

[root@localhost ~]# mongod -f /etc/mongod3.conf
about to fork child process, waiting until server is ready for connections.
forked process: 4338
child process started successfully, parent exiting

[root@localhost ~]# mongod -f /etc/mongod4.conf
about to fork child process, waiting until server is ready for connections.
forked process: 4367
child process started successfully, parent exiting

[root@localhost ~]# netstat -anpt |grep mongod     ##查看服务,4台实例全部启动
tcp        0      0 0.0.0.0:27019           0.0.0.0:*               LISTEN      4338/mongod         
tcp        0      0 0.0.0.0:27020           0.0.0.0:*               LISTEN      4367/mongod         
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      4046/mongod         
tcp        0      0 0.0.0.0:27018           0.0.0.0:*               LISTEN      4309/mongod         

2.根据创建带有优先级的复制集

1:优先级高的为“标准节点”;2:优先级低的为“被动节点”;3.arbiter为“仲裁节点”

[root@localhost ~]# mongo

> cfg={"_id":"myinstance","members":[{"_id":0,"host":"192.168.10.10:27017","priority":100},{"_id":1,"host":"192.168.10.10:27018","priority":100},{"_id":2,"host":"192.168.10.10:27019","priority":0},{"_id":3,"host":"192.168.10.10:27020","arbiterOnly":true}]}

> rs.initiate(cfg)     ##执行启动复制集
myinstance:PRIMARY>     ##执行完成后,随机分配主从(需要等待一些时间)

myinstance:SECONDARY> rs.isMaster()     ##查看个节点类型(标准节点,被动节点,仲裁节点)
{
	"hosts" : [                                          ##标准节点
		"192.168.10.10:27017",
		"192.168.10.10:27018"
	],
	"passives" : [                                 ##被动节点
		"192.168.10.10:27019"
	],
	"arbiters" : [                                   ##仲裁节点
		"192.168.10.10:27020"
	],

myinstance:PRIMARY> rs.status()     ##查看各自在主从中的身份,仲裁不参与复制集主从,就是“ARBITER”身份

3.进行一些数据库操作

myinstance:PRIMARY> use TEST      ##使用 TEST库
 
myinstance:PRIMARY> db.table.insert({"id":1,"name":"zhangsan"})     ##给集合table插入值
 
myinstance:PRIMARY> db.table.insert({"id":2,"name":"lisi"})
 
myinstance:PRIMARY> db.table.insert({"id":3,"name":"ABC"})
 
myinstance:PRIMARY> db.table.update({"id":3},{$set:{"name":"zhaoliu"}})    ##修改数据

myinstance:PRIMARY> db.table.find()      ##查看集合table
{ "_id" : ObjectId("5fa7f6187f61f1534c622114"), "id" : 1, "name" : "zhangsan" }
{ "_id" : ObjectId("5fa7f6237f61f1534c622115"), "id" : 2, "name" : "lisi" }
{ "_id" : ObjectId("5fa7f63f7f61f1534c622116"), "id" : 3, "name" : "zhaoliu" }

###可以到MongoDB自带的local库中oplog.rs日志集合中查看修改操作
myinstance:PRIMARY> use local    ##进入local库
 
myinstance:PRIMARY> show tables     ##查看集合
或者
myinstance:PRIMARY> show collections    ##查看集合
me
oplog.rs
replset.election
replset.minvalid
startup_log
system.replset
system.rollback.id

myinstance:PRIMARY> db.oplog.rs.find()    ##查看日志信息,可以在末尾找到之前的操作信息

4.模拟故障,测试主从切换

[root@localhost ~]# mongod -f /etc/mongod.conf --shutdown      ##关闭当前主节点27017

[root@localhost ~]# mongo --port 27018    ##进入节点27017
myinstance:PRIMARY>     ##成为了新的主节点

[root@localhost ~]# mongod -f /etc/mongod2.conf --shutdown    ##继续关闭新的主节点27018

[root@localhost ~]# mongo --port 27019   ##进入节点27019
myinstance:SECONDARY>     ##还是从节点,被动节点不参与竞选“PRIMARY”

5.从节点查看数据

[root@localhost ~]# mongo --port 27019    ##'进入从节点
myinstance:SECONDARY> show dbs      ##无法用show dbs命令直接读取信息
2020-11-08T22:11:13.481+0800 E QUERY    [thread1] Error: listDatabases failed:{

myinstance:SECONDARY> rs.slaveOk()     ##'执行这条语句,让从节点有查看数据的权限'
WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.

myinstance:SECONDARY> show dbs        ##'再次查看,可以看到数据库信息'
TEST    0.000GB
admin   0.000GB
config  0.000GB
local   0.000GB

[root@localhost ~]# mongo --port 27020    ##进入仲裁节点
myinstance:ARBITER> rs.slaveOk()
myinstance:ARBITER> show dbs     ##无法查看

6.其他相关操作

myinstance:SECONDARY> rs.printReplicationInfo()        ##打印出复制信息
configured oplog size:   4386.957421302795MB           ##操作日志文件大小
log length start to end: 2496secs (0.69hrs)
oplog first event time:  Sun Nov 08 2020 21:36:37 GMT+0800 (CST)
oplog last event time:   Sun Nov 08 2020 22:18:13 GMT+0800 (CST)
now:                     Sun Nov 08 2020 22:18:21 GMT+0800 (CST)

myinstance:SECONDARY> rs.printSlaveReplicationInfo()   ####'打印出同步复制节点信息,由此也可以看出仲裁节点不具备复制功能,只有两个从节点会复制主节点数据'
source: 192.168.10.10:27017
	syncedTo: Sun Nov 08 2020 22:21:03 GMT+0800 (CST)
	0 secs (0 hrs) behind the primary 
source: 192.168.10.10:27019
	syncedTo: Sun Nov 08 2020 22:21:13 GMT+0800 (CST)
	-10 secs (0 hrs) behind the primary 
	
myinstance:SECONDARY> rs.help()     ##查看复制集帮助手册
	rs.status()                                { replSetGetStatus : 1 } checks repl set status
	rs.initiate()                              { replSetInitiate : null } initiates set with default settings
	rs.initiate(cfg)                           { replSetInitiate : cfg } initiates set with configuration cfg
	rs.conf()                                  get the current configuration object from local.system.replset
……省略部分


7.修改同步复制日志的空间大小

先关闭实例服务

[root@localhost ~]# mongo --port 27018     ##进入从节点,关闭服务

myinstance:SECONDARY> rs.slaveOk()

myinstance:SECONDARY> show dbs
TEST    0.000GB
admin   0.000GB
config  0.000GB
local   0.000GB

myinstance:SECONDARY> use admin
 
myinstance:SECONDARY> db.shutdownServer()    ##关闭服务

然后需要从复制集中退出,并修改端口(不能是复制集中有的端口),成为了单实例而不再是整体中的一部分后,修改参数才不会影响其他实例

[root@localhost ~]# vim /etc/mongod2.conf

  port: 27028      ##修改端口号为27028(原为27018

#replication:        ##注释这两条配置,从复制集中退出
#  replSetName: myinstance

[root@localhost ~]# mongod -f /etc/mongod2.conf      ##启动实例

[root@localhost ~]# mongo --port 27028     ##从新端口进入,成为了单实例,而不是复制集的成员
> show dbs                          ##之前同步的数据还在
TEST    0.000GB
admin   0.000GB
config  0.000GB
local   0.000GB
> exit      ##退出
bye

之后对日志进行备份,因为修改日志大小需要删除原日志,所以实现做好备份

[root@localhost ~]# mongodump --port 27028 --db local --collection 'oplog.rs'      ##对日志进行备份
2020-11-08T22:53:05.144+0800	writing local.oplog.rs to 
2020-11-08T22:53:05.146+0800	done dumping local.oplog.rs (377 documents)


[root@localhost ~]# mongo --port 27028     ##进入27028节点
> use local    ##进入local库
 
> db.oplog.rs.drop()    ##删除原日志
 
> db.runCommand({create:"oplog.rs",capped:true,size:(2*1024*1024*1024)})    ##重新创建oplog.rs,并且重新限制大小

> use admin      ##新日志创建完成后再次进入admid库,关闭服务
> db.shutdownServer()      


[root@localhost ~]# vim /etc/mongod2.conf      ##再将配置修改回来,并添加一条指定大小的配置
  port: 27018       ##端口改回来
replication:             ##去掉这两条注释
  replSetName: myinstance
  oplogSizeMB: 2048      ##添加这条指定日志大小的配置

[root@localhost ~]# mongod -f /etc/mongod2.conf    ##再次启动实例

[root@localhost ~]# mongo --port 27018     ##从27018端口进入
myinstance:SECONDARY>      ##再次回到复制集中

myinstance:SECONDARY> rs.printReplicationInfo()     ##再次查看日志文件信息
configured oplog size:   2048MB      ##大小变为设置的2048MB

最后,进入主节点PRIMARY,让出选举权,让27018端口节点(标准节点)成为新的主节点,完成日志空间扩容

[root@localhost ~]# mongo --port 27017
myinstance:PRIMARY> rs.stepDown()
[root@localhost ~]# mongo --port 27018
myinstance:PRIMARY>      ##称为了新的主节点

8.部署认证复制

首先创建认证用户,并开启验证功能

[root@localhost ~]# mongo --port 27017
myinstance:PRIMARY> use admin     ##进入admin库,相当于root超级用户
switched to db admin

myinstance:PRIMARY> db.createUser({"user":"root","pwd":"123456","roles":["root"]})    ##创建认证用户
Successfully added user: { "user" : "root", "roles" : [ "root" ] }
[root@localhost bin]# vim /etc/mongod.conf
security:        ##开启验证功能
      keyFile: /usr/bin/authkey1     ##指定秘钥文件
      clusterAuthMode: keyFile     ##群集认证方式为秘钥认证

[root@localhost bin]# vim /etc/mongod2.conf
security:        ##开启验证功能
      keyFile: /usr/bin/authkey2
      clusterAuthMode: keyFile

[root@localhost bin]# vim /etc/mongod3.conf
security:        ##开启验证功能
      keyFile: /usr/bin/authkey3
      clusterAuthMode: keyFile

[root@localhost bin]# vim /etc/mongod4.conf
security:        ##开启验证功能
      keyFile: /usr/bin/authkey4
      clusterAuthMode: keyFile

创建秘钥文件

[root@localhost ~]# cd /usr/bin/
[root@localhost bin]# echo "auth key"> authkey1       ##写入一段话到秘钥文件,任意写,但是每个节点的秘钥文件内容必须相同
[root@localhost bin]# echo "auth key"> authkey2
[root@localhost bin]# echo "auth key"> authkey3
[root@localhost bin]# echo "auth key"> authkey4
[root@localhost bin]# chmod 600 authkey{1..4}             ##授权只有主人可以读写的权限

依次重启节点实例

[root@localhost bin]# mongod -f /etc/mongod.conf --shutdown
killing process with pid: 4068

[root@localhost bin]# mongod -f /etc/mongod2.conf --shutdown
killing process with pid: 3984

[root@localhost bin]# mongod -f /etc/mongod3.conf --shutdown
killing process with pid: 5063

[root@localhost bin]# mongod -f /etc/mongod4.conf --shutdown
killing process with pid: 2029

[root@localhost bin]# mongod -f /etc/mongod.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 5847
child process started successfully, parent exiting

[root@localhost bin]# mongod -f /etc/mongod2.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 5925
child process started successfully, parent exiting

[root@localhost bin]# mongod -f /etc/mongod3.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 6006
child process started successfully, parent exiting

[root@localhost bin]# mongod -f /etc/mongod4.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 6090
child process started successfully, parent exiting

验证认证关系

[root@localhost ~]# mongo --port 27018   ##进入到节点
myinstance:PRIMARY>

myinstance:PRIMARY> show dbs     ##这时候不能直接查看数据了,什么信息都看不了

myinstance:PRIMARY> use admin    ##进入到admin库

myinstance:PRIMARY> db.auth("root","123456")     ##进行身份验证,验证正确,返回值1,整个复制集节点想要获取数据都需要通过认证
1

myinstance:PRIMARY> show dbs      ##验证通过后就可以再次查看数据信息等
TEST    0.000GB
admin   0.000GB
config  0.000GB
local   0.000GB
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值