本文因学习和工作需要,经常部署mongodb数据库,将不定期更新或修复。
环境说明
系统centos7.9
自建服务器或云服务器,硬件要求不低于2核2G内存,20G硬盘,文件系统默认是ext4即可。
生产环境最好单独一个磁盘存放数据库,方便数据备份和还原,避免干扰到其他磁盘的运作。
mongodb 4.4.27 属于该4.4版本最后一个小版本
升级系统
检查所有已安装包的更新,并自动升级它们。这有助于保证系统安全和软件功能的最新性。
安装指定的软件包
yum -y install: 这个命令用于安装指定的软件包。-y参数意味着对所有提示自动回答“是”,从而避免了安装过程中的交互式提示。
gcc: GNU 编译器集合,一个编译C语言的工具。
gcc-c++: GNU C++ 编译器。
openssl-devel: OpenSSL的开发包,用于提供安全通信功能。
zlib-devel: zlib库的开发包,用于数据压缩。
pcre-devel: PCRE(Perl 兼容正则表达式)库的开发包,用于实现正则表达式功能。
bzip2*: bzip2压缩工具的相关软件包。
make: 一个用于控制软件编译的工具。
这些安装包主要用于软件开发和构建,特别是在需要编译源代码或者开发需要这些依赖的软件时。例如,安装这些包是编译和安装一些从源代码安装的软件(如某些Web服务器或数据库服务器)的先决条件。
创建节点目录
进入系统目录
创建目录,使用mkdir -p命令来创建多层级的目录结构
目录说明
安装数据库
先进入 mongodbData 文件夹
执行下载
解压
安装
环境配置
使配置生效
查看安装情况
执行后,如果打印以下信息泽成功:
MongoDB shell version v4.4.27
Build Info: {
"version": "4.4.27",
"gitVersion": "2da9e4437d8c792c2b3c3aea62e284f801172a6b",
"openSSLVersion": "OpenSSL 1.0.1e-fips 11 Feb 2013",
"modules": [],
"allocator": "tcmalloc",
"environment": {
"distmod": "rhel70",
"distarch": "x86_64",
"target_arch": "x86_64"
}
}
3个节点配置文件
创建三个节点的配置文件,保存的地址如下
节点的端口
由下面不同节点的配置文件确定
第一次启动前的配置如下:
1.可以通过进入指定节点的conf目录,使用centos7.9 系统自带的vi工具复制下面的配置文件逐个编辑,如果文件不存在,会自动创建一个新的空文件,并将其打开以供编辑。你可以在该文件中添加文本内容,然后保存和退出编辑器
2.或者在电脑本地创建好mongod.conf,然后上传到centos7.9的指定目录中,
节点1的配置文件(无用户登录认证)
systemLog:
destination: file
path: "/mongodbData/node01/logs/mongod.log"
logAppend: true
verbosity: 1
logRotate: rename
storage:
dbPath: "/mongodbData/node01/data"
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 4
processManagement:
fork: true
pidFilePath: "/mongodbData/node01/mongod.pid"
net:
bindIpAll: true
port: 27017
#security:
# keyFile: "/mongodbData/node01/conf/access.key"
# authorization: enabled
#setParameter:
# authenticationMechanisms: SCRAM-SHA-1
replication:
oplogSizeMB: 50
replSetName: mongodbData
节点2的配置文件(无用户登录认证)
systemLog:
destination: file
path: "/mongodbData/node02/logs/mongod.log"
logAppend: true
verbosity: 1
logRotate: rename
storage:
dbPath: "/mongodbData/node02/data"
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 4
processManagement:
fork: true
pidFilePath: "/mongodbData/node02/mongod.pid"
net:
bindIpAll: true
port: 27018
#security:
# keyFile: "/mongodbData/node02/conf/access.key"
# authorization: enabled
#setParameter:
# authenticationMechanisms: SCRAM-SHA-1
replication:
oplogSizeMB: 50
replSetName: mongodbData
节点3的配置文件(无用户登录认证)
systemLog:
destination: file
path: "/mongodbData/node03/logs/mongod.log"
logAppend: true
logRotate: rename
storage:
dbPath: "/mongodbData/node03/data"
journal:
enabled: true
processManagement:
fork: true
pidFilePath: "/mongodbData/node03/mongod.pid"
net:
bindIpAll: true
port: 27019
#security:
# keyFile: "/mongodbData/node03/conf/access.key"
# authorization: enabled
#setParameter:
# authenticationMechanisms: SCRAM-SHA-1
replication:
oplogSizeMB: 50
replSetName: mongodbData
注意1
下面的配置是注释掉的,启用无用户登录认证
#security:
# keyFile: "/mongodbData/node03/conf/access.key"
# authorization: enabled
#setParameter:
# authenticationMechanisms: SCRAM-SHA-1
注意2
创建mongod.conf文件时,一定要注意文件内容是否按照上面每一行的空格严格编写,如果不是,则容易出现错误。
执行启动命令,启动三个数据库(无用户登录认证)
第一次启动后报错的解释
启动后,如果发生报错,需要检查
如果你是第一次启动该节点
1.三个节点的data文件夹和logs的文件夹创建是否成功
2.可能是某个节点的配置文件的空格缩进问题,一般上级和下级的缩进是4个空格,要严格执行
配置集群
进入shell
注意1:进入其中一个节点(主节点)的mongo控制台, 配置集群
注意2:务必保证节点防火墙关闭或开放mongo服务端口)
注意3:默认是27017,但是如果你的节点配置中不是27017 而是3717端口,上面的就必须改成3717
生成集群配置变量并加入3个节点配置,注意端口不是默认的就要改下面的端口了
下面的 id=mongodbData 就是我们的集群名称,和上面3个节点的配置必须是一致的。
根据变量配置集群
查看配置状态
退出shell
添加用户
集群配置完成后, 仍然在主节点的mongo控制台中添加三个用户:数据库管理员, 集群管理员和访问特定数据库的用户.
进入shell
切换当前会话到 admin 数据库
创建数据库管理员
user: 用户名,pwd: 用户的密码,
roles: 一个包含角色对象的数组,用于分配用户的权限。在这个数组中,用户被分配了三个不同的角色:
创建集群管理员
user: 用户名,pwd: 用户的密码,
roles: 一个包含角色对象的数组,用于分配用户的权限。在这个数组中,用户被分配了三个不同的角色:
切换到一个测试库(不用事先创建)
创建test角色
user: 用户名,pwd: 用户的密码,
roles: 一个包含角色对象的数组,用于分配用户的权限。在这个数组中,用户被分配了三个不同的角色:
切换回admin数据库
查看创建的用户 是否有3个
退出shell
注意事项:
关闭数据库(重点)
上面流程,用户添加完成后需要关闭所有节点(先关闭仲裁和从节点, 再关闭主节点, 避免主节点切换):
依次进入 节点的shell执行关闭流程
每次进入shell 后按顺序先执行
生成keyFile
仅在一个节点执行(本机执行),步骤如下:
生成keyFile并放入node01(主节点)
设置keyFile文件为只读
将keyFile复制到node02(从节点)
将keyFile复制到node03(仲裁节点)
修改mongod.conf文件,取消注释信息
完成上面流程后,取消三个节点mongod.conf文件中security与setParameter部分的注释,然后重新启动即是带权限的方式了,之前的都是没有权限的启动
用vi 工具编辑,
去掉三个配置文件的#号,并且确保空格缩进准确是4个
再次启动数据库,开启用户登录认证
依次启动主节点, 从节点和仲裁节点的mongod后台进程:
再次登录数据库,验证创建的用户
进入shell
切换当前会话到 admin 数据库
使用数据库管理员认证
使用集群管理员认证
切换当前会话到 test 数据库
使用数据库管理员认证
部署结束
至此, 单服务器下基于用户认证的MongoDB4.4.27三节点副本集集群环境已经搭建完成,
下面连接数据库方式
远程连接数据库
方法一:
使用Studio 3T可视化工具远程连接(超级管理员)配置如下,只需要连接单节点
方法二:
使用nodejs 代码链接
let MongoClient=require('mongodb').MongoClient;
let mongoUrl="mongodb://root:root_jY_2021@127.0.0.1:27017,127.0.0.1:27018/admin";
MongoClient.connect(mongoUrl,{ useNewUrlParser: true,useUnifiedTopology: true }, async function(err, pt_clientObj) {
if(err) {console.error("发生错误",err);}
let client = pt_clientObj.db();
console.log("连接成功");
});
使用过程问题
节点降权
在高并发数据操作时(如迁移数据库并发量过大),如果服务器或磁盘的性能比较差会出现数据库进程被杀死的情况,通常是主节点27017被杀,导致从节点变成主节点,然后手动重启了27017会被仲裁节点判成从节点,这时候要重新改成主节点时,必须按一下操作。
进入shell
切换当前会话到 admin 数据库
使用集群管理员认证
执行降权命令操作
在 MongoDB 中,主节点降权(step down)是一个谨慎的操作,通常由副本集的自动选举机制来触发新的主节点选举。但如果你希望手动将主节点降权,MongoDB 提供了 rs.stepDown() 命令来实现。如果你想直接降权主节点而不等待选举新主节点,可以使用 rs.stepDown() 命令并提供一个可选的参数,指定降权的秒数。
以下是一个示例,演示如何使用 rs.stepDown() 命令来直接降权主节点,并将主节点的降权时间设置为0秒(立即降权):
启动失败问题
如果你不是第一次启动该节点
1.你的目录里面缺少配置文件里面指定的启用的文件,如 access.key,也就是没注释掉 security 里面指向的文件和配置
2.可能是使用过程中pid 有问题,需要将3个节点的mongod.pid删除后重新启动创建新的pid文件
使用过程中报错问题日志过大需要轮换
手动执行日志轮转
进入shell
切换当前会话到 admin 数据库
使用集群管理员认证
手动执行日志轮转
这样表示修改成功,继续修改从节点的日志即可。
自动执行日志轮转
在 CentOS 7.9 上使用 logrotate 工具来自动管理 MongoDB 的日志文件。
以下是详细的步骤和说明:
确保 logrotate 安装。大多数 CentOS 系统默认安装了 logrotate。要检查是否已安装,请在终端中运行:
如果已安装,这将显示 logrotate 的版本号。
如果未安装,可以通过运行以下命令来安装它:
创建 MongoDB 的 logrotate 配置文件
首先,你需要为 MongoDB 的日志文件创建一个 logrotate 配置文件。这个文件定义了如何轮转日志、何时轮转、执行哪些额外操作等。
打开文本编辑器以创建新的配置文件。使用 vi 没有就自动创建:
这将创建一个名为 mongodb 的新配置文件。
在编辑器中,添加以下内容(注意空格缩进):
# MongoDB日志轮转配置node01
/mongodbData/node01/logs/mongod.log {
daily
rotate 31
compress
missingok
notifempty
create 640 root root
postrotate
/bin/systemctl reload mongod.service > /dev/null 2>/dev/null || true
endscript
}
# MongoDB日志轮转配置node02
/mongodbData/node02/logs/mongod.log {
daily
rotate 31
compress
missingok
notifempty
create 640 root root
postrotate
/bin/systemctl reload mongod.service > /dev/null 2>/dev/null || true
endscript
}
# MongoDB日志轮转配置node03
/mongodbData/node03/logs/mongod.log {
daily
rotate 31
compress
missingok
notifempty
create 640 root root
postrotate
/bin/systemctl reload mongod.service > /dev/null 2>/dev/null || true
endscript
}
这段配置的意义如下:
上面的 create 配置如果是不是root的话,需要执行 以下命令,看mongodb是以什么身份运行
测试 logrotate 配置.为了确保你的配置文件没有错误,你可以用 logrotate 的测试模式来检查:
-d 参数表示“调试模式”,它将显示 logrotate 将执行的操作,但不会真正执行它们
这个输出表明你的 logrotate 配置文件被正确读取并且没有错误,但由于当前条件没有满足轮转的需求(比如时间还没到),所以没有执行实际的轮转操作。
上面截图,这里是关键信息的解释:
上面的 logrotate 命令输出来看,现在 logrotate 已经正确地读取了 /etc/logrotate.d/mongodb 配置文件,并且对其中定义的日志文件进行了处理。
Handling 2 logs: 表明 logrotate 正在处理两个日志文件的轮转,这与你的配置文件中定义的日志路径数量相符。
rotating pattern: 这部分描述了轮转的模式。例如,/mongodbData/node01/logs/mongod.log 在每天之后轮转,并且保留 31 个轮转的副本。这意味着每天检查一次是否需要轮转,并且最多保留 31 天的日志。
empty log files are not rotated, old logs are removed: 这表示如果日志文件是空的,则不会进行轮转。此外,超出保留期限的旧日志将被删除。
log does not need rotating (log has been already rotated): 对于每个考虑的日志文件,logrotate 判断它们目前不需要轮转。这可能是因为它们已经在之前被轮转过,或者还没达到定义的轮转条件(例如,还没有过一天)。
重要的是,这次执行是在“调试模式”下进行的(由 -d 参数指定),所以实际上并没有执行任何轮转操作。调试模式仅用于检查配置是否正确和 logrotate 将要执行哪些操作,而不会真正地轮转日志或更改任何文件。
启动自动轮转
使用crontab命令将logrotate定时任务添加到系统中,以便每天自动运行。可以运行以下命令来编辑当前用户的定时任务:
然后在打开的编辑器中添加以下行,以使logrotate每天自动轮转日志文件:
每天
每小时
每分钟
这个定时任务将在每天的午夜(00:00)执行logrotate命令,强制执行指定的配置文件/etc/logrotate.d/mongodb中的日志轮转。
最后,保存并退出编辑器。
现在,您已经设置了一个定时任务,logrotate将每天自动轮转指定的日志文件,并根据配置文件中的设置进行管理。您可以根据需要自定义配置文件和定时任务的时间以满足您的需求。
以下是效果
自执行说明
自动执行 logrotate。在 CentOS 上,logrotate 通常由 cron 作业自动运行。你可以检查 /etc/crontab 文件或 /etc/cron.* 目录来确认 logrotate 的运行频率。
一般来说,不需要额外的步骤来自动执行 logrotate,因为它已被系统的 cron 作业所配置。
通过这些步骤,你就可以设置 MongoDB 的日志文件自动轮转了。这样可以帮助管理日志文件的大小,防止它们占用过多的磁盘空间。