目录

1 MongoDB-4.4.2的单机安装

1.1 软件包的下载

1.2 安装MongoDB-4.4.2

1.2.1 解压

1.2.2 重命名

1.2.3 配置环境变量

1.3 启动MongoDB

1.3.1 编辑配置文件

1.3.3 执行如下命令使用指定的配置来启动 MongoDB

1.3.4 本机连接测试

1.4 关闭MongoDB

1.5 设置MongoDB以systemctl的方式启动

2 MongoDB的副本集部署

2.1 副本集的介绍

2.2 副本集配置

2.2.1 修改配置文件

2.2.2 启动节点

2.2.3 副本集初始化

2.2.4 副本集更新

2.2.5 查看副本集状态信息

2.2.6 测试副本集

3 开启数据库的安全认证

3.1 登陆主节点创建超级用户

3.2 创建副本集认证的key文件

3.3 更新MongoDB的配置文件

3.4 测试副本集的权限认证

数据库权限总结


本教程都是在关闭Linux服务器防火墙的基础上进行的安装配置,如果在参考过程中,遇到连接不上的问题,请检查防火墙,以CentOS7为例:systemctl status firewalld,关闭指令为:systemctl stop firewalld,禁止开机自启动:systemctl disable firewalld

1 MongoDB-4.4.2的单机安装

1.1 软件包的下载

下载地址:https://www.mongodb.com/try/download/community

附MongoDB-4.4.2的下载链接:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.2.tgz

在服务器直接下载:wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.2.tgz

1.2 安装MongoDB-4.4.2

1.2.1 解压

# 解压到当前文件
tar -xzvf mongodb-linux-x86_64-rhel70-4.4.2.tgz# 解压到指定的文件
tar -xzvf mongodb-linux-x86_64-rhel70-4.4.2.tgz -C /home

1.2.2 重命名

# 解压后的名字太长,这里我们重命名
cd /home
mv mongodb-linux-x86_64-rhel70-4.4.2 mongodb-4.4.2

1.2.3 配置环境变量

# 配置环境变量,使MongoDB指令可以全局执行,下面使用两种方式进行设置,随意选择# 方式一:在/usr/bin文件下(该文件夹可以繁殖后期安装的一些软件运行脚本)建立软连接
ln -s /home/mongodb-4.4.2/bin/mongod /usr/bin/mongod
ln -s /home/mongodb-4.4.2/bin/mongo /usr/bin/mongo# 方式二:在 /etc/profile 配置文件的最后添加 MongoDB 环境变量
vim /etc/profile
export PATH=$PATH:/home/mongodb-4.4.2/bin
# 保存退出加载配置,使之生效
source /etc/profile

1.3 启动MongoDB

1.3.1 编辑配置文件

在编辑配置文件之前,先创建data 和 logs 两个文件夹,分别用来存放 MongoDB 的数据和日志文件。一定要提前创建好!!!!

# 创建存储数据库的文件夹,这里根据服务器的硬盘分配情况自己规划
mkdir -p /data/mongodb/data# 创建存储日志的文件夹
mkdir -p /data/mongodb/logs

正式开始编写配置文件

自己定义配置文件的存储位置,一般放置在安装时的文件夹下

cd /home/mongodb-4.4.2

vi mongodb.conf

将下面的配置文件复制过去即可,如果数据库跟日志文件不同的话,修改即可!!

port=27017  #端口,MongoDB默认端口为27017,注意防火墙的设置
dbpath= /data/mongodb/data      #数据库存文件存放目录
logpath= /data/mongodb/logs/mongodb.log    #日志文件存放路径
logappend=true     #使用追加的方式写日志
fork=true  #以守护进程的方式运行,创建服务器进程
maxConns=1000  #最大同时连接数
# noauth=true  #不启用验证,默认不启用验证,这里也可以不用写
journal=true   #每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
bind_ip = 0.0.0.0      #这样就可外部访问

1.3.3 执行如下命令使用指定的配置来启动 MongoDB

# 启动MongoDB
mongod --config /home/mongodb-4.4.2/mongodb.conf# 或者
mongod -f /home/mongodb-4.4.2/mongodb.conf

看到如下结果,说明启动成功

也可以查看进程

1.3.4 本机连接测试

直接输入:mongo

1.4 关闭MongoDB

# 关闭服务器指令
mongod --shutdown --dbpath /data/mongodb/data

1.5 设置MongoDB以systemctl的方式启动

vi /usr/lib/systemd/system/mongodb.service

[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target  [Service]
Type=forking
# 根据自己的配置文件位置进行修改
ExecStart=/home/mongodb-4.4.2/bin/mongod --config /home/mongodb-4.4.2/mongodb.conf
ExecReload=/bin/kill -s HUP $MAINPID
# 根据自己的配置文件位置进行修改
ExecStop=/home/mongodb-4.4.2/bin/mongod --shutdown --config /home/mongodb-4.4.2/mongodb.conf
PrivateTmp=true  [Install]
WantedBy=multi-user.target

重新加载systemctl:systemctl daemon-reload

设置完成后就可以使用systemctl的方式启动了:systemctl start mongodb

至此MongoDB的单机安装就介绍完了,增加认证的方式,会在后面进行统一介绍。

MongoDB配置文件解读:参考https://blog.csdn.net/ningjiebing/article/details/90607803?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162253367016780262587400%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162253367016780262587400&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-90607803.first_rank_v2_pc_rank_v29&utm_term=mongodb%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6&spm=1018.2226.3001.4187

# 数据文件位置
dbpath = /opt/module/mongoData
# 日志文件位置
logpath = /opt/module/mongoLog/mongodb.log
# 以追加方式写入日志,true为追加。false是覆盖
logappend = true
# 日志输出都发送到主机的syslog系统,而不是标准输出到logpath指定日志文件。syslog和logpath不能一起用,会报错:Cant use both a logpath and syslog
# syslog = true
# 绑定地址。默认127.0.0.1,只能通过本地连接。进程绑定和监听来自这个地址上的应用连接。要是需要给其他服务器连接,则需要注释掉这个或则 把IP改成本机地址,
# 如192.168.200.201[其他服务器用 mongo --host=192.168.200.201 连接] ,可以用一个逗号分隔的列表绑定多个IP地址。
# 远程访问则配置为0.0.0.0
# bind_ip = 127.0.0.1
# 默认端口27017
port = 27017
# 是否后台运行,设置为true 启动 进程在后台运行的守护进程模式。默认false。
fork = true
# 安静模式。这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet = false
# 启用日志文件,默认启用
journal = true
# 刷写提交机制,默认是30ms或则100ms。较低的值,会更消耗磁盘的性能。此选项接受2和300毫秒之间的值:
# 如果单块设备提供日志和数据文件,默认的日记提交时间间隔为100毫秒。如果不同的块设备提供的日志和数据文件,默认的日记提交的时间间隔为30毫秒。
# journalCommitInterval=100
# 启用定期记录CPU利用率和 I/O 等待,设置为true会强制mongodb每4s报告cpu利用率和io等待,把日志信息写到标准输出或日志文件。
# 默认为false。开启日志会出现:1.Mon Jun 10 10:21:42.241 [snapshotthread] cpu: elapsed:4000 writelock: 0%
# cpu = true
# 用户认证,默认false。不需要认证。当设置为true时候,进入数据库需要auth验证,当数据库里没有用户,则不需要验证也可以操作。直到创建了第一个用户,之后操作都需要验证。
# noauth = true
# auth = true
# 详细记录输出
# verbose = true
# 设置oplog记录等级 0=off (default) 1=W 2=R 3=both 7=W+some reads
# diaglog = 0
# 动态调试项
# nocursors = true
# 忽略查询提示
# nohints = true
# 指定的复制操作日志(OPLOG)的最大大小。mongod创建一个OPLOG的大小基于最大可用空间量。对于64位系统,OPLOG通常是5%的可用磁盘空间。
# 一旦mongod第一次创建OPLOG,改变oplogSize将不会影响OPLOG的大小。
# oplogSize = 1024
# 指定存储身份验证信息的密钥文件的路径,默认缺省
# keyFile = /path/to/keyfile
# 最大连接数。默认值:取决于系统(即的ulimit和文件描述符)限制。MongoDB中不会限制其自身的连接。当设置大于系统的限制,则无效,以系统限制为准。这对于客户端创建很多“表”,
# 允许连接超时而不关闭“表”的时候很有用。设置该值的高于连接池和总连接数的大小,以防止尖峰时 候的连接。注意:不能设置该值大于20000。
# maxConns = 100
# 强制验证客户端请求。2.4的默认设置为objcheck成为true,在早期版本objcheck默认为false。因为它强制验证客户端请求,确保客户端绝不插入无效文件到数据库中。
# 对于嵌套文档的对象,会有一点性能影响。设置noobjcheck 关闭。
# objcheck = true
# 同上,默认false
# noobjcheck = false
# 进程ID,没有指定则启动时候就没有PID文件。默认缺省。
# pidfilepath = /var/run/mongo.pid
# 套接字文件,默认为false,有生成socket文件。当设置为true时,不会生成socket文件
# nounixsocket = false
# 套接字文件路径,默认/tmp
# unixSocketPrefix = /tmp
# 设置为true,修改数据目录存储模式,每个数据库的文件存储在DBPATH指定目录的不同的文件夹中。使用此选项,可以配置的MongoDB将数据存储在不同的磁盘设备上,以提高写入吞吐量或磁盘容量。默认为false。
# 注意:要是在运行一段时间的数据库中,开启该参数,会导致原始的数据都会消失(注释参数则会回来)。因为数据目录都不同了,除非迁移现有的数据文件到directoryperdb产生的数据库目录中
# directoryperdb = false
# 是否支持ipv6,默认false
# ipv6 = false
# 是否允许JSONP访问通过一个HTTP接口,默认false。
# jsonp = false
# 是否禁止http接口,即28017 端口开启的服务。默认false,支持
# nohttpinterface = false
# 预分配方式。默认false:使用预分配方式来保证写入性能的稳定,预分配在后台进行,并且每个预分配的文件都用0进行填充。这会让MongoDB始终保持额外的空间和空余的数据文件,
# 从而避免了数据增长过快而带来的分配磁盘空间引起的阻塞。设置noprealloc= true来禁用预分配的数据文件,会缩短启动时间,但在正常操作过程中,可能会导致性能显著下降。
# noprealloc = false
# 是否禁止脚本引擎。默认是false:不禁止。ture:禁止。
# 要是设置成true:运行一些脚本的时候会出现:JavaScript execution failed: group command failed: { "ok" : 0, "errmsg" : "server-side JavaScript execution is disabled" }
# noscripting = false
# 是否禁止表扫描操作。默认false:不禁止,ture:禁止
# 禁止要是执行表扫描会出现:error: { "$err" : "table scans not allowed:test.emp", "code" : 10111 }
# notablescan = false
# 命名空间的文件(即NS)的默认大小,默认16M,最大2G。所有新创建的默认大小命名空间的文件(即NS)。
# 此选项不会影响现有的命名空间的文件的大小。默认值是16M字节,最大大小为2 GB。让小数据库不让浪费太多的磁盘空间,同时让大数据在磁盘上有连续的空间。
# nssize = 16
# 数据库分析等级设置。记录一些操作性能到标准输出或则指定的logpath的日志文件中,默认0:关闭。
# 数据库分析可以影响数据库的性能,因为分析器必须记录和处理所有的数据库操作。所以在需要的时候用动态修改就可以了
# 0:关,无分析。 1:开,仅包括慢操作。 2:开,包括所有操作。
# 控制 Profiling  的开关和级别:2种
# 第一种是直接在启动参数里直接进行设置或则启动MongoDB时加上–profile=级别,其信息保存在 生成的system.profile 中。
# profile = 0
# 记录profile分析的慢查询的时间,默认是100毫秒
# slowms = 100
# 配额,默认false。是否开启配置每个数据库的最多文件数的限制。当为true则用quotaFiles来配置最多文件的数量。
# quota = false
# 配额数量。每个数据库的数据文件数量的限制。此选项需要quota为true。默认为8
# quotaFiles = 8
# 使一个简单的 REST API,默认false,设置为true。
# rest = true
# 修复数据库操作,默认是false。设置为true时,启动后修复所有数据库,设置这个选项最好在命令行上,而不是在配置文件或控制脚本。
# repair = true
# 修复路径,默认是在dbpath路径下的_tmp 目录。
# repairpath
# 是否使用较小的默认文件。默认为false,不使用。设置为true,使用较小的默认数据文件大小。smallfiles减少数据文件的初始大小,并限制他们到512M,
# 也减少了日志文件的大小,并限制他们到128M。如果数据库很大,各持有少量的数据,会导致mongodb创建很多文件,会影响性能。
# smallfiles = true
# 刷写数据到日志的频率,通过fsync操作数据。默认60秒。
# 警告:如果设置为0,SYNCDELAY 不会同步到磁盘的内存映射文件。在生产系统上,不要设置这个值。
# syncdelay = 60
# 系统信息,默认false。设置为true,mongod会诊断系统有关的页面大小,数量的物理页面,可用物理??页面的数量输出到标准输出。
# 当开启sysinfo参数的时候,只会打印信息,不会启动mongodb的程序。所以要关闭该参数,才能开启mongodb。
# sysinfo = false
# 升级。默认为false。当设置为true,指定DBPATH,升级磁盘上的数据格式的文件到最新版本。会影响数据库操作,更新元数据。大部分情况下,不需要设置该值。
# upgrade = false
# 是否使用内部诊断。默认false。
# traceExceptions = false
# 2.4的新参数,指定启动选项配置。想设置多个选项则用一个setParameter选项指定,可以setParameter的参数请见这里。
# 声明setParameter设置在这个文件中,使用下面的格式:setParameter = <parameter>=<value>
# 例如: setParameter = syncdelay= 55,notablescan = true,journalCommitInterval = 50,traceExceptions = true
# setParameter =
# 使用此设置来配置复制副本集。指定一个副本集名称作为参数,所有主机都必须有相同的名称作为同一个副本集。
# replSet =
# 默认为false。在副本集下,设置为true,从一个dbpath里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步,
# 否则的mongod将尝试执行初始同步。注意:如果数据不完全同步,mongod指定fastsync开启,secondary或slave与主永久不同步,这可能会导致显着的一致性问题。
# fastsync =
# 2.2版本出现的新参数,默认是all。可以设置的值有:all, none, and _id_only。只能在副本集(replSet)中使用。默认情况下,
# secondary副本集的成员将加载所有索引到内存中(从OPLOG之前的操作有关的)。您可以修改此行为,使secondary只会加载_id索引。指定id或none,防止mongod的任何索引加载到内存。
# replIndexPrefetch =
# 主从复制的相关设置
# master:默认为false,当设置为true,则配置当前实例作为主实例。
# master = false
# slave:默认为false,当设置为true,则配置当前实例作为从实例。
# slave = true
# 设置从库同步主库的延迟时间,用于从设置,默认为0。
# slavedelay = 0
# 是否自动重新同步.默认为false,用于从设置。设置为true,如果落后主超过10秒,会强制从自动重新同步。
# 如果oplogSize太小,此设置可能有问题。如果OPLOG大小不足以存储主的变化状态和从的状态变化之间的差异,这种情况下强制重新同步是不必要的。
# 当设置autoresync选项设置为false,10分钟内从不会进行大于1次的自动重新同步。
# autoresync = false
# 默认为空,格式为:<host><:port>。用于从实例的复制:设置从的时候指定该选项会让从复制指定主的实例
# source = 127.0.0.1:30001
# 默认为空,用于从选项,指定一个数据库进行复制。
# only =

针对副本集遇到故障,自动切换的的问题说明一下:https://segmentfault.com/q/1010000022143836/a-1020000022144441

自动切换后,程序如何识别新的ip地址:以 Java 举例,new MongoClient(addrs) 的时候第一个参数是一个数组,你应该把这个副本集的所有节点都传进去。

2 MongoDB的副本集部署

2.1 副本集的介绍

MongoDB副本集(Replica Set)其实就是具有自动故障恢复功能的主从集群,和主从复制最大的区别就是在副本集中没有固定的“主节点;整个副本集会选出一个节点作为“主节点”,当其挂掉后,再在剩下的从节点中选举一个节点成为新的“主节点”,在副本集中总有一个主节点(primary)和一个或多个备份节点(secondary)。

除了primary和secondary之外,副本集中的节点还可以是以下角色:

关于副本集的基础概念,可以参考:https://blog.csdn.net/pengjunlee/article/details/83958794

官方帮助文档:https://docs.mongodb.com/manual/replication/

官方推荐的副本集最小配置需要有三个节点:一个主节点接收和处理所有的写操作,两个备份节点通过复制主节点的操作来对主节点的数据进行同步备份。

2.2 副本集配置

2.2.1 修改配置文件

副本集各节点IP如下:

192.168.171.10

192.168.171.11

192.168.171.12

首先参考上面的单机安装,对三台服务器安装MongoDB

然后,依次修改各个节点的 mongodb.conf 配置文件,三个节点都做如下配置,增加副本集相关配置,内容如下:

port=27017  #端口,MongoDB默认端口为27017,注意防火墙的设置
dbpath= /data/mongodb/data      #数据库存文件存放目录
logpath= /data/mongodb/logs/mongodb.log    #日志文件存放路径
logappend=true     #使用追加的方式写日志
fork=true  #以守护进程的方式运行,创建服务器进程
maxConns=1000  #最大同时连接数
# noauth=true  #不启用验证,默认不启用验证,这里也可以不用写
journal=true   #每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
bind_ip = 0.0.0.0      #这样就可外部访问# 设置副本集名称,在各个配置文件中,其值必须相同
replSet=rs0oplogSize = 1024        # 指定的复制操作日志(OPLOG)的最大大小

2.2.2 启动节点

使用如下三种方式启动节点:

  1. mongod -f /home/mongodb-4.4.2/mongodb.conf
  2. mongod --config /home/mongodb-4.4.2/mongodb.conf
  3. systemctl start mongodb

至此,3个MongoDB实例都已经以副本集方式启动,但它们彼此之间现在还不会进行通信,仍需要进行一些配置。

2.2.3 副本集初始化

通过 Shell 连接到三个节点中的随意一个MongoDB实例,执行 rs.initiate() 方法对副本集进行初始化。

[root@mongodb01 mongodb-4.4.2]# mongo 192.168.171.10:27017
> conf={"_id" : "rs0","members" : [{ "_id" : 0, "host" : "192.168.171.10:27017" },{ "_id" : 1, "host" : "192.168.171.11:27017" },{ "_id" : 2, "host" : "192.168.171.12:27017" }]}
> rs.initiate(conf)
{"ok" : 1,"operationTime" : Timestamp(1542247326, 1),"$clusterTime" : {"clusterTime" : Timestamp(1542247326, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}
rs0:SECONDARY>

如果在执行 rs.initiate() 方法时不传入任何参数,MongoDB 将以默认的配置文档对副本集进行初始化,后续可以再通过 rs.add() 方法来向副本集中添加成员。

2.2.4 副本集更新

# 向副本集中添加成员
rs.add("192.168.171.15:27017")# 从副本集中删除成员
rs.remove("192.168.171.15:27017")# 向副本集中添加仲裁
rs.addArb("192.168.171.16:27017")# 向副本集中添加备份节点
rs.add({"_id":3,"host":"192.168.171.17:27017","priority":0,"hidden":true})

更改配置:

# 更改副本集配置
rs0:PRIMARY> var conf=rs.conf()
rs0:PRIMARY> conf.members[1].priority = 5
5# PRIMARY节点上执行如下命令
rs0:PRIMARY> rs.reconfig(conf)
{"ok" : 1,"operationTime" : Timestamp(1542248518, 1),"$clusterTime" : {"clusterTime" : Timestamp(1542248518, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}# SECONDARY节点上执行如下命令,需增加 force 参数
rs0:SECONDARY> rs.reconfig(conf,{force:true})
{"ok" : 1,"operationTime" : Timestamp(1542248726, 1),"$clusterTime" : {"clusterTime" : Timestamp(1542248726, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}

强制让一个节点成为Primary,可以将该节点的优先级设置成最高。

cfg = rs.conf()
cfg.members[0].priority = 5
cfg.members[1].priority = 1
cfg.members[2].priority = 1
rs.reconfig(cfg)

2.2.5 查看副本集状态信息

1.查看配置文件

rs0:PRIMARY> rs.config()
{"_id" : "rst0","version" : 1,"term" : 11,"protocolVersion" : NumberLong(1),"writeConcernMajorityJournalDefault" : true,"members" : [{"_id" : 0,"host" : "192.168.171.10:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 1,"host" : "192.168.171.11:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 2,"host" : "192.168.171.11: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("60b6070505cbf0635371a224")}
}

2.查看是否是主节点

rs0:PRIMARY> rs.isMaster()
{"topologyVersion" : {"processId" : ObjectId("60b758c010a964d654243d01"),"counter" : NumberLong(6)},"hosts" : ["192.168.171.10:27017","192.168.171.11:27017","192.168.171.12:27017"],"setName" : "rst0","setVersion" : 1,"ismaster" : true,    # 是主节点"secondary" : false,"primary" : "188.2.138.33:27017","me" : "188.2.138.33:27017","electionId" : ObjectId("7fffffff000000000000000b"),"lastWrite" : {"opTime" : {"ts" : Timestamp(1622629065, 1),"t" : NumberLong(11)},"lastWriteDate" : ISODate("2021-06-02T10:17:45Z"),"majorityOpTime" : {"ts" : Timestamp(1622629065, 1),"t" : NumberLong(11)},"majorityWriteDate" : ISODate("2021-06-02T10:17:45Z")},"maxBsonObjectSize" : 16777216,"maxMessageSizeBytes" : 48000000,"maxWriteBatchSize" : 100000,"localTime" : ISODate("2021-06-02T10:17:50.350Z"),"logicalSessionTimeoutMinutes" : 30,"connectionId" : 14,"minWireVersion" : 0,"maxWireVersion" : 9,"readOnly" : false,"ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1622629065, 1),"signature" : {"hash" : BinData(0,"eT3i1BmMWoZHWh1S0EBs7W8IDn0="),"keyId" : NumberLong("6968765238703292419")}},"operationTime" : Timestamp(1622629065, 1)
}

3.查看备份节点对的信息,在任何一个节点查看都可以

rs0:PRIMARY> db.printSecondaryReplicationInfo()
source: 192.168.171.11:27017syncedTo: Wed Jun 02 2021 18:20:05 GMT+0800 (CST)0 secs (0 hrs) behind the primary
source: 192.168.171.12:27017syncedTo: Wed Jun 02 2021 18:20:05 GMT+0800 (CST)0 secs (0 hrs) behind the primary

2.2.6 测试副本集

1.在主节点插入数据,从节点观察

rs0:PRIMARY> db.test.insert({"name":"mongodb中文网"})
WriteResult({ "nInserted" : 1 })
rs0:SECONDARY> db.test.find()
{ "_id" : ObjectId("60b75909a25d1962b9e06a17"), "name" : "mongodb中文网" }

2.主节点删除数据,从节点观察

rs0:PRIMARY> db.test.remove({'name': 'mongodb中文网'})
WriteResult({ "nRemoved" : 1 })
# 主节点删除数据后,再次观察,无数据
rs0:SECONDARY> db.test.find()
rs0:SECONDARY>

故障转移测试:

1.停掉主节点,登陆主节点,使用rs.isMaster()命令或者rs.status()查看节点信息。

3 开启数据库的安全认证

MongoDB用户和身份验证详细内容,传送门:

https://blog.csdn.net/pengjunlee/article/details/84106877

3.1 登陆主节点创建超级用户

创建用户参考:https://blog.csdn.net/weixin_34332905/article/details/88759759

创建用户时需要注意,如果只想要创建一个超级用户来管理所有的数据库,一定要按照如下指令进行创建:db.createUser({user:"root",pwd:"password",roles:["root"]})

不要将用户绑定admin,roles就设置为root就可以了,否则创建完成后,虽然是超级用户,但是不能操作除admin以外的其他库,只有读权限:

        如果创建的时候还是出错了,直接使用指令进行删除即可:db.system.users.remove({user:"root"}),如果用户已经创建,并且配置文件已经开启了访问权限,将所有的mongodb停掉(先停从库,最后停主库),停掉后,将配置文件中的访问权限关闭,再重新启动(先启主库,再启从库),完成后,执行删除指令即可;

        如果是单机的话,直接启动删除即可!!!

一定要在主节点进行创建,从节点会自动同步,切记,切记,切记!!!!!!

rs0:PRIMARY> use admin
switched to db admin
rs0:PRIMARY> db.createUser({user:"root",pwd:"password",roles:["root"]})
Successfully added user: { "user" : "root", "roles" : [ "root" ] }

3.2 创建副本集认证的key文件

先停掉所有SECONDARY节点的MongoDB服务,然后再停掉PRIMARY节点的MongoDB服务,并在PRIMARY节点所在服务器上创建keyFile文件。

# 将认证文件,放在跟配置文件,同一级目录
openssl rand -base64 90 -out /home/mongodb-4.4.2/mongo.keyfile

这里有个坑,请注意,在认证文件创建完成后,他的文件属性为默认的644,这里要将该文件更改为600,或者400,有读权限即可,我这里使用的root用户登陆的系统进行配置的,直接设置为600,如果不进行设置,启动时会报错。一定要设置、一定要设置、一定要设置。。。。。。。。。。。。。。。。

chmod 600 /home/mongodb-4.4.2/mongo.keyfile或者
chmod 400 /home/mongodb-4.4.2/mongo.keyfile

所有副本集节点都必须要用同一份keyfile,一般是在一台机器上生成,然后拷贝到其他机器上,且必须有读的权限,否则将来会报错: permissions on /mongodb/replica_sets/myrs_27017/mongo.keyfile are too open
一定要保证密钥文件一致,文件位置随便。但是为了方便查找,建议每台机器都放到一个固定的位置,都放到和配置文件一起的目录中。
这里将该文件分别拷贝到多个节点中。

scp /home/mongodb-4.4.2/mongo.keyfile  root@192.168.171.11:/home/mongodb-4.4.2/scp /home/mongodb-4.4.2/mongo.keyfile  root@192.168.171.12:/home/mongodb-4.4.2/

3.3 更新MongoDB的配置文件

所有的节点统一添加如下配置

# 用户认证,默认false。不需要认证。当设置为true时候,进入数据库需要auth验证
auth=true# 副本集节点配置,keyfile文件要一致
keyFile=/home/mongodb-4.4.2/mongo.keyfile

3.4 测试副本集的权限认证

更改完成后,重新启动即可,(先关从库,再关主库,先启主库,再启从库)

全部重新后,使用mongo指令,直接登陆数据库,插入数据,需要权限认证

进行权限认证

# 权限认证时,要先切换到admin集合
rs0:PRIMARY> use admin
switched to db admin
rs0:PRIMARY> db.auth("root", "password")
1
rs0:PRIMARY> 

认证之后,再次插入数据,没有问题:

rs0:PRIMARY> db.test.insert({"name":"mongodb中文网"})
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY>

或者登陆时,直接使用超级用户登陆,登陆后,直接可以操作数据库,不用再进行权限认证:

mongo -u "root" --authenticationDatabase "admin" -p'password'
[root@mongodb01 mongodb-4.4.2]# mongo -u "root" --authenticationDatabase "admin" -p'password'
MongoDB shell version v4.4.2
connecting to: mongodb://127.0.0.1:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("3f7368d5-c556-4714-88d6-5a14837001cf") }
MongoDB server version: 4.4.2
---
The server generated these startup warnings when booting: 2021-06-02T18:09:05.472+08:00: You are running this process as the root user, which is not recommended2021-06-02T18:09:05.473+08:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'2021-06-02T18:09:05.473+08:00: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. We suggest setting it to 'never'2021-06-02T18:09:05.473+08:00: Soft rlimits too low2021-06-02T18:09:05.473+08:00:         currentValue: 10242021-06-02T18:09:05.473+08:00:         recommendedMinimum: 64000
---
---Enable MongoDB's free cloud-based monitoring service, which will then receive and displaymetrics about your deployment (disk utilization, CPU, operation statistics, etc).The monitoring data will be available on a MongoDB website with a unique URL accessible to youand anyone you share the URL with. MongoDB may use this information to make productimprovements and to suggest MongoDB products and deployment options to you.To enable free monitoring, run the following command: db.enableFreeMonitoring()To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
rs0:PRIMARY> db.test.insert({"name":"mongodb中文网"})       # 插入成功
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY> 

登陆从库查看数据时,报下面的错误,直接输入:rs.secondaryOk() 即可解决

从库查看数据,正常

rs0:SECONDARY> rs.secondaryOk()
rs0:SECONDARY> db.test.find()
{ "_id" : ObjectId("60b768ab5d120f3e93c58668"), "name" : "mongodb中文网" }
rs0:SECONDARY> 

副本集创建成功

搭建副本集参考:https://blog.csdn.net/pengjunlee/article/details/84101732?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162251553016780357228258%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162251553016780357228258&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-84101732.first_rank_v2_pc_rank_v29&utm_term=MongoDB%E5%89%AF%E6%9C%AC%E9%9B%86&spm=1018.2226.3001.4187

数据库权限总结

MongoDB 中内置角色说明:
read:提供读取所有非系统的集合(数据库)
readWrite:提供读写所有非系统的集合(数据库)和读取所有角色的所有权限
dbAdmin:提供执行管理任务的功能,例如与架构相关的任务,索引编制,收集统计信息。此角色不授予用户和角色管理权限。
dbOwner:提供对数据库执行任何管理操作的功能。此角色组合了readWrite,dbAdmin 和 userAdmin 角色授予的权限。
userAdmin :提供在当前数据库上创建和修改角色和用户的功能。由于 userAdmin 角色允许用户向任何用户(包括他们自己)授予任何权限,因此该角色还间接提供对数据库的超级用户访问权限,或者,如果作用于管理数据库,则提供对群集的访问权限。
clusterAdmin :提供最佳的集群管理访问。此角色组合了 clusterManager,clusterMonitor 和 hostManager 角色授予的权限。此外,该角色还提供了 dropDatabase 操作。
readAnyDatabase :仅在 admin 数据库中使用,提供所有数据库的读权限。
readWriteAnyDatabase :仅在 admin 数据库中使用,提供所有数据库的读写权限
userAdminAnyDatabase :仅在 admin 数据库中使用,提供与 userAdmin 相同的用户管理操作访问权限,允许用户向任何用户(包括他们自己)授予任何权限,因此该角色还间接提供超级用户访问权限。
dbAdminAnyDatabase :仅在 admin 数据库中使用,提供与 dbAdmin 相同的数据库管理操作访问权限,该角色还在整个群集上提供 listDatabases 操作。
root:仅在 admin 数据库中使用,提供超级权限原文出自:www.hangge.com  转载请保留原文链接:https://www.hangge.com/blog/cache/detail_2613.html

附,用户权限参考:https://blog.csdn.net/Abel_Liujinquan/article/details/90732388

MongoDB-4.4.2单机安装以及副本集配置相关推荐

  1. MongoDB安装与副本集配置

    副本集是一组,由N个mongo节点组成并协同工作的,提供自动的故障集群转移. 建立一个副本集需要步骤,1.需要启动每个节点,2.然后进行初始化设置.在这里,我们将配置一组(三个节点),这是标准设置. ...

  2. linux下mongdb绑定ip,Linux下MongoDB安装及副本集配置 | 聂扬帆博客

    最近开始接触了MongoDB的安装配置,易部署.易使用,存储数据非常方便是它的特点. 0x00  副本集原理 MongDB副本集故障转移功能得益于它的选举机制.选举机制采用了Bully算法,可以很方便 ...

  3. MongoDB学习2 - 账号密码登录、副本集配置

    文章目录 1. 高级 1.1 用户账号密码登陆.集群机器使用Key文件 - 安全认证 1.1.1 概述 1.1.1.1 内置角色 - 用于普通用户登录 1.1.1.2 内置语法 - 用于普通用户登录 ...

  4. MongoDB 3.0副本集配置

    请先阅读我之前的文章<MongoDB 3.0的在CentOS6.5上的安装>  一.创建副本集须知: 1.存在一台有超级管理员的mongod服务器,可以有数据库,其他所有的服务器都必须是全 ...

  5. MongoDB之副本集配置

    MongoDB主从复制 主从复制是 MongoDB 最早使用的复制方式, 该复制方式易于配置,并且可以支持任意数量的从节点服务器,与使用单节点模式相比有如下优点: 在从服务器上存储数据副本,提高了数据 ...

  6. MongoDB 3.2.7 for rhel6.4 副本集-分片集群部署

    今天,一同事反映,他安装部署mongodb副本集--分片集群,初始化分片时遇到问题:初始化分片必须使用主机名(也就是必须有相当于DNS服务的解析),这样以来,mongo副本集--分片集群就 会出现DN ...

  7. Mongodb副本集配置

    为什么80%的码农都做不了架构师?>>>    ###环境 操作系统:win7 64位<br /> MongoDB version: 2.6.5 ###配置mongodb ...

  8. MongoDB副本集配置系列二:配置MongoDB副本集

    接上一篇博客: http://www.cnblogs.com/xiaoit/p/4479066.html 1:首先创建3台虚拟机作为配置环境 IP1:192.168.91.128 IP2:192.16 ...

  9. 全网最细最全OLAP之clickhouse笔记|clickhouse文档|clickhouse揭秘文档(三)--clickhouse单机安装和clickhouse集群安装

    免费视频教程 https://www.51doit.com/ 或者联系博主微信 17710299606 https://apppunf4gqb9193.h5.xiaoeknow.com/v1/cour ...

最新文章

  1. 算法导论中求解时间复杂度的三种方法
  2. idea中自定义修改jdk源码,加注释
  3. ebtables安装和使用
  4. 树莓派(Raspberry Pi)修改时区
  5. 中间表增加额外字段_如何定制分表中间件
  6. Spring Boot 使用Redis
  7. bootstrap 2021-04-20
  8. pickle使用实例
  9. 感悟较多影响较多的心理效应
  10. MacOS 使用SwitchHosts修改 hosts 不生效的原因及解决方法
  11. floyed 4.9
  12. 七牛云上传资源和拉取
  13. SCAU 2022 Java综合性实验
  14. AOV网络——初了解
  15. FastReport .NET2022.2x,完整的源代码可用
  16. Web开发和WSGI
  17. 以太网(ethernet)通信。DSP开发板28388D发送数据,电脑接收数据。使用的是UDP协议
  18. hadoop 2.7.7 百度网盘下载链接
  19. k2698场效应管参数电流_常用场效应管参数
  20. 浮动,高度塌陷,清除浮动

热门文章

  1. subl: 手动安装package
  2. SPL MTC MK2新一代监听控制器已发布
  3. linux如何给windows传文件,教你如何实现Linux与windows文件互传
  4. 如何创建公网NAT网关
  5. 关于为什么出现粘包问题及如何解决!
  6. 车载通讯模组的“进阶战”
  7. android 常用的listview管理示例
  8. unity串口 连接多个串口崩溃_7个经典问答!10分钟带你了解串口服务器(RS232,RS485,RS422)...
  9. 解决X-Shell 6强制更新的问题
  10. Flutter2的新功能