一、MongoDB 复制(副本)集
1. 介绍
-
MongoDB复制是将数据同步在多个服务器的过程。
-
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
-
复制还允许您从硬件故障和服务中断中恢复数据。
2.复制集的有点
- 保障数据的安全性
- 数据高可用性 (24*7)
- 灾难恢复
- 无需停机维护(如备份,重建索引,压缩)
- 分布式读取数据
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