2024年单服务器部署Mongodb三节点副本集保姆级教程

本文因学习和工作需要,经常部署mongodb数据库,将不定期更新或修复。

本教程自动化部署脚本链接,该部署脚本持续更新中,目前正常可正常部署

2024年单服务器部署Mongodb三节点副本集自动化部署脚本-CSDN博客

环境说明

系统centos7.9

自建服务器或云服务器,硬件要求不低于2核2G内存,20G硬盘,文件系统默认是ext4即可。

生产环境最好单独一个磁盘存放数据库,方便数据备份和还原,避免干扰到其他磁盘的运作。

mongodb 4.4.27 属于该4.4版本最后一个小版本

升级系统

检查所有已安装包的更新,并自动升级它们。这有助于保证系统安全和软件功能的最新性。

yum update

安装指定的软件包

yum -y install gcc gcc-c++ openssl-devel zlib-devel openssl-devel pcre-devel bzip2* make


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服务器或数据库服务器)的先决条件。

创建节点目录

进入系统目录

cd /

创建目录,使用mkdir -p命令来创建多层级的目录结构

mkdir -p /mongodbData/node01/{conf,data,logs}

mkdir -p /mongodbData/node02/{conf,data,logs}

mkdir -p /mongodbData/node03/{conf,data,logs}

目录说明

mongodbData 存放整个数据库相关的目录

node01 主节点(PRIMARY)

node02 从节点(SECONDARY)

node03 仲裁节点(ARBITER)

conf 存放配置

data 保存节点数据的目录

logs 存放节点日志

安装数据库

先进入 mongodbData 文件夹

cd /mongodbData

执行下载

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.27.tgz

解压

tar -zxvf mongodb-linux-x86_64-rhel70-4.4.27.tgz

安装

mv mongodb-linux-x86_64-rhel70-4.4.27 /usr/local/share/mongodb

环境配置

echo 'export PATH=/usr/local/share/mongodb/bin:$PATH' >> /etc/profile

使配置生效

source /etc/profile

查看安装情况

mongo --version

执行后,如果打印以下信息泽成功:

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个节点配置文件

创建三个节点的配置文件,保存的地址如下

/mongodbData/node01/conf/mongod.conf

/mongodbData/node02/conf/mongod.conf

/mongodbData/node03/conf/mongod.conf

节点的端口

由下面不同节点的配置文件确定

node01 节点 27017端口(默认)

node02 节点 27018端口(默认)

node03 节点 27019端口(默认)

第一次启动前的配置如下:

1.可以通过进入指定节点的conf目录,使用centos7.9 系统自带的vi工具复制下面的配置文件逐个编辑,如果文件不存在,会自动创建一个新的空文件,并将其打开以供编辑。你可以在该文件中添加文本内容,然后保存和退出编辑器

vi /mongodbData/node01/conf/mongod.conf

vi /mongodbData/node02/conf/mongod.conf

vi /mongodbData/node03/conf/mongod.conf

2.或者在电脑本地创建好mongod.conf,然后上传到centos7.9的指定目录中,

节点1的配置文件(无用户登录认证)

operationProfiling:
    mode: all                               # 设置性能分析模式为记录所有操作
    slowOpThresholdMs: 1000                 # 定义操作执行超过1000毫秒时被认为是慢操作
systemLog:
    destination: file                            # 日志输出目的地设置为文件
    path: /mongodbData/node01/logs/mongod.log    # 指定日志文件的路径
    logAppend: true                              # 启用日志追加模式,新日志将追加到现有文件中
    verbosity: 1                                 # 日志详细级别设置为1
    logRotate: rename                            # 日志轮转策略设置为重命名旧文件
storage:
    dbPath: /mongodbData/node01/data         # 数据库文件存储路
    directoryPerDB: true                     #是否分别为每个数据库创建相应的文件夹
    journal:
      enabled: true                          # 启用日志,以支持崩溃恢复
    wiredTiger:
      engineConfig:
        cacheSizeGB: 4                     # WiredTiger存储引擎的缓存大小设置为4GB
processManagement:
    fork: true                                       # 启用分叉模式运行MongoDB服务
    pidFilePath: /mongodbData/node01/mongod.pid      # 指定PID文件路径
net:
    bindIpAll: true                                  # 监听所有网络接口
    port: 27017                                      # MongoDB服务监听的端口
#security:
#    keyFile: /mongodbData/node01/conf/access.key    # 指定用于集群内部认证的密钥文件路径
#    authorization: enabled                          # 启用数据库访问控制
#setParameter:
#    authenticationMechanisms: SCRAM-SHA-1,SCRAM-SHA-256   # 设置认证机制为SCRAM-SHA-1和SCRAM-SHA-256
replication:
    oplogSizeMB: 500                        # 操作日志大小设置为500MB
    replSetName: mongodbData                # 指定复制集名称

节点2的配置文件(无用户登录认证)

operationProfiling:
    mode: all                               # 设置性能分析模式为记录所有操作
    slowOpThresholdMs: 1000                 # 定义操作执行超过1000毫秒时被认为是慢操作
systemLog:
    destination: file                            # 日志输出目的地设置为文件
    path: /mongodbData/node02/logs/mongod.log    # 指定日志文件的路径
    logAppend: true                              # 启用日志追加模式,新日志将追加到现有文件中
    verbosity: 1                                 # 日志详细级别设置为1
    logRotate: rename                            # 日志轮转策略设置为重命名旧文件
storage:
    dbPath: /mongodbData/node02/data         # 数据库文件存储路
    directoryPerDB: true                     #是否分别为每个数据库创建相应的文件夹
    journal:
      enabled: true                          # 启用日志,以支持崩溃恢复
    wiredTiger:
      engineConfig:
        cacheSizeGB: 4                     # WiredTiger存储引擎的缓存大小设置为4GB
processManagement:
    fork: true                                       # 启用分叉模式运行MongoDB服务
    pidFilePath: /mongodbData/node02/mongod.pid      # 指定PID文件路径
net:
    bindIpAll: true                                  # 监听所有网络接口
    port: 27018                                      # MongoDB服务监听的端口
#security:
#    keyFile: /mongodbData/node02/conf/access.key    # 指定用于集群内部认证的密钥文件路径
#    authorization: enabled                          # 启用数据库访问控制
#setParameter:
#    authenticationMechanisms: SCRAM-SHA-1,SCRAM-SHA-256   # 设置认证机制为SCRAM-SHA-1和SCRAM-SHA-256
replication:
    oplogSizeMB: 500                        # 操作日志大小设置为500MB
    replSetName: mongodbData                # 指定复制集名称

节点3的配置文件(无用户登录认证)

operationProfiling:
    mode: all                               # 设置性能分析模式为记录所有操作
    slowOpThresholdMs: 1000                 # 定义操作执行超过1000毫秒时被认为是慢操作
systemLog:
    destination: file                            # 日志输出目的地设置为文件
    path: /mongodbData/node03/logs/mongod.log    # 指定日志文件的路径
    logAppend: true                              # 启用日志追加模式,新日志将追加到现有文件中
    verbosity: 1                                 # 日志详细级别设置为1
    logRotate: rename                            # 日志轮转策略设置为重命名旧文件
storage:
    dbPath: /mongodbData/node03/data         # 数据库文件存储路
    journal:
      enabled: true                          # 启用日志,以支持崩溃恢复
processManagement:
    fork: true                                       # 启用分叉模式运行MongoDB服务
    pidFilePath: /mongodbData/node03/mongod.pid      # 指定PID文件路径
net:
    bindIpAll: true                                  # 监听所有网络接口
    port: 27019                                      # MongoDB服务监听的端口
#security:
#    keyFile: /mongodbData/node03/conf/access.key    # 指定用于集群内部认证的密钥文件路径
#    authorization: enabled                          # 启用数据库访问控制
#setParameter:
#    authenticationMechanisms: SCRAM-SHA-1,SCRAM-SHA-256   # 设置认证机制为SCRAM-SHA-1和SCRAM-SHA-256
replication:
    oplogSizeMB: 500                        # 操作日志大小设置为500MB
    replSetName: mongodbData                # 指定复制集名称

注意1

下面的配置是注释掉的,启用无用户登录认证

#security:
#    keyFile: /mongodbData/node03/conf/access.key
#    authorization: enabled
#setParameter:
#    authenticationMechanisms: SCRAM-SHA-1,SCRAM-SHA-256

注意2

创建mongod.conf文件时,一定要注意文件内容是否按照上面每一行的空格严格编写,如果不是,则容易出现错误。

注意3:

SCRAM-SHA-1,SCRAM-SHA-256 这两种协议都是用于MongoDB的密码认证方法,SCRAM-SHA-256 是一种比 SCRAM-SHA-1 更安全的加密方式。用逗号隔开是为了同时支持两种

不记录日志文件的设置

如果您想完全禁用日志记录,可以将 systemLog.destination 设置为 none。且没有其他配置。

这样做将导致 MongoDB 不生成任何日志文件。但请注意,完全禁用日志可能会在调试或监控数据库时带来不便。

systemLog:

    destination: none

日志级别说明

在 MongoDB 中,日志级别(verbosity levels)控制着日志输出的详细程度。不同的日志级别会输出不同数量和类型的信息,这有助于调试问题或详细跟踪 MongoDB 服务器的行为。以下是 MongoDB 中的几种常见日志级别:

0(默认级别):只记录关键信息,包括启动信息、关键错误、警告以及重要的服务器事件。这是默认的日志级别,适用于大多数生产环境,因为它平衡了信息量和日志文件大小。


1(详细):记录更多的信息,包括一般的数据库操作信息。在某些情况下,这个级别有助于调试一些不太清晰的问题。


2、3、4(更详细):随着级别的提高,MongoDB 会记录更加详细的信息。这包括查询优化器的决策、网络请求的详细信息等。
这些较高的日志级别通常仅用于调试目的,因为它们会生成大量的日志数据,可能会对服务器的性能产生影响。


5(调试):最高的日志级别,记录极其详细的信息,用于深入调试。
这个级别通常仅在 MongoDB 开发者指导下使用,以解决特定的复杂问题。

第一执行启动(无用户登录认证)

mongod -f /mongodbData/node01/conf/mongod.conf

mongod -f /mongodbData/node02/conf/mongod.conf

mongod -f /mongodbData/node03/conf/mongod.conf

第一次启动后报错的解释

启动后,如果发生报错,需要检查

如果你是第一次启动该节点

1.三个节点的data文件夹和logs的文件夹创建是否成功

2.可能是某个节点的配置文件的空格缩进问题,一般上级和下级的缩进是4个空格,要严格执行

配置集群

进入shell

mongo 127.0.0.1:27017

注意1:进入其中一个节点(主节点)的mongo控制台, 配置集群

注意2:务必保证节点防火墙关闭或开放mongo服务端口)

注意3:默认是27017,但是如果你的节点配置中不是27017 而是3717端口,上面的就必须改成3717

生成集群配置变量并加入3个节点配置,注意端口不是默认的就要改下面的端口了

下面的 id=mongodbData 就是我们的集群名称,和上面3个节点的配置必须是一致的。

cfg = {_id: 'mongodbData', members: [{_id: 1, host: '127.0.0.1:27017'},{_id: 2, host: '127.0.0.1:27018'},{_id: 3, host: '127.0.0.1:27019', arbiterOnly: true}]}

根据变量配置集群

rs.initiate(cfg)

查看配置状态

rs.status()

退出shell

同时按下Ctrl+C

添加用户

集群配置完成后, 仍然在主节点的mongo控制台中添加三个用户:数据库管理员, 集群管理员和访问特定数据库的用户.

进入shell

mongo 127.0.0.1:27017

切换当前会话到 admin 数据库

use admin

创建数据库管理员

db.createUser({user:"root",pwd:"root_jY_2021",roles:[{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"},{role:"userAdminAnyDatabase",db:"admin"}]})

user: 用户名,pwd: 用户的密码,

roles: 一个包含角色对象的数组,用于分配用户的权限。在这个数组中,用户被分配了三个不同的角色:

{role: "readWriteAnyDatabase", db: "admin"}:

数据库为 "admin"。这个角色允许用户在任何数据库上执行读写操作,相当于具有读写权限。

{role: "dbAdminAnyDatabase", db: "admin"}:

数据库为 "admin"。这个角色允许用户在任何数据库上执行数据库管理操作,如创建、删除数据库等。

{role: "userAdminAnyDatabase", db: "admin"}:

数据库为 "admin"。这个角色允许用户在任何数据库上执行用户管理操作,如创建、删除用户、分配角色等

创建集群管理员

db.createUser({user:"suroot",pwd:"suroot_jY_2021",roles:[{role:"clusterAdmin",db:"admin"},{role:"clusterManager",db:"admin"},{role:"clusterMonitor",db:"admin"}]})

user: 用户名,pwd: 用户的密码,

roles: 一个包含角色对象的数组,用于分配用户的权限。在这个数组中,用户被分配了三个不同的角色:

{role: "clusterAdmin", db: "admin"}: 这个角色是 "clusterAdmin",允许用户管理 MongoDB 集群,包括添加和删除节点等。该角色在 "admin" 数据库上。

{role: "clusterManager", db: "admin"}: 这个角色是 "clusterManager",允许用户管理 MongoDB 集群,包括监视集群状态等。该角色在 "admin" 数据库上。

{role: "clusterMonitor", db: "admin"}: 这个角色是 "clusterMonitor",允许用户监视 MongoDB 集群的性能和状态。该角色在 "admin" 数据库上。

切换到一个测试库(不用事先创建)

use test

创建test角色

db.createUser({user:"test",pwd:"test",roles:[{role:"readWrite",db:"test"},{role:"dbAdmin",db:"test"},{role:"userAdmin",db:"test"}]})

user: 用户名,pwd: 用户的密码,

roles: 一个包含角色对象的数组,用于分配用户的权限。在这个数组中,用户被分配了三个不同的角色:

{role:"readWrite",db:"test"}

允许用户读写test数据库

{role:"dbAdmin",db:"test"}

赋予用户管理test数据库的权限,比如创建索引和查看数据库统计信息。

{role:"userAdmin",db:"test"}

允许用户在test数据库中管理用户和角色。

切换回admin数据库

use admin

验证管理员

 db.auth('root', 'root_jY_2021')

查看创建的用户 是否有3个

db.system.users.find()

退出shell

同时按下Ctrl+C

注意事项:

MongoDB的用户和数据库是绑定的, 必须指定某个用户归属于哪个数据库, 即在roles字段的每个role中指定db字段.

数据库管理员通常需要具有读写,管理任意数据库和管理任意用户的role, 后续可以登录此用户进行数据库和用户的增删改查.

集群管理员通常需要具有集群管理和集群监控的role, 只有集群管理员可以关闭集群.

普通用户根据用途不同可以对特定或者多个数据库拥有各种不同的role, 本例中的test用户既可以读写test库, 同时也是test库的管理员.

主节点上添加的用户应该能够在从节点上查询到.

多服务器内网访问节点设置

如果有A(内网IP:172.18.251.95)和B(内网IP:172.18.251.96)两台服务器,
在A部署了3节点数据库,需要在B同时访问3个节点的数据库,
以下配置,保证A也能正常运行和访问3节点数据库

A就是上面已经部署的数据库,上面的节点配置是127.0.0.1,只要改成内网IP就行

注意:如果需要可被同时3个节点被外网访问,则设置下面的host的IP是你的服务器外网IP,然后开放端口。

进入shell

mongo 127.0.0.1:27017

切换当前会话到 admin 数据库

use admin

验证集群管理员

db.auth('suroot', 'suroot_jY_2021')  

逐行输入一下修改信息

var cfg = rs.conf();
cfg.members[0].host = "172.18.251.95:27017";
cfg.members[1].host = "172.18.251.95:27018";
cfg.members[2].host = "172.18.251.95:27019";
rs.reconfig(cfg);

查看配置状态

rs.status()

只要输出结果包含了已经修改好的内网IP,就可以让内网能够同时访问3个节点

{
    "ok": 1,
    "members": [{
        "_id": 1,
        "name": "172.18.251.95:27017",

        ……
    },
    {
        "_id": 2,
        "name": "172.18.251.95:27018",

       ……
    },
    {
        "_id": 3,
        "name": "172.18.251.95:27019",

       ……

    }],
}

关闭数据库(重点)

切记!日常使用时要关闭数据库,必须是在进入shell下进行按仲裁节点,从节点,主节点的顺序执行关闭,而不是通过ps aux的kill 杀死进程,否则可能造成数据丢失或损坏

上面流程,用户添加完成后需要关闭所有节点(先关闭仲裁和从节点, 再关闭主节点, 避免主节点切换):

依次进入 节点的shell执行关闭流程

1.仲裁节点: mongo 127.0.0.1:27019

2.从节点: mongo 127.0.0.1:27018

3.主节点: mongo 127.0.0.1:27017

每次进入shell 后按顺序先执行

1.切换数据库 use admin

2.使用集群管理员认证(仲裁节点不需要)  db.auth('suroot', 'suroot_jY_2021')  

3.关闭mongodb 进程 db.shutdownServer()

4.退出 shell 同时按下Ctrl+C

生成keyFile

keyFile的长度必须在6-1024个字符之间。

keyFile的用途是作为所有mongod后台进程允许加入集群的凭证, 所有集群中的节点共用一个keyFile, 避免其他mongod非法加入集群):

仅在一个节点执行(本机执行),步骤如下:

生成keyFile并放入node01(主节点)

openssl rand -base64 756 > /mongodbData/node01/conf/access.key

设置keyFile文件为只读

chmod 400 /mongodbData/node01/conf/access.key

将keyFile复制到node02(从节点)

cp /mongodbData/node01/conf/access.key /mongodbData/node02/conf/

将keyFile复制到node03(仲裁节点)

cp /mongodbData/node01/conf/access.key /mongodbData/node03/conf/

修改mongod.conf文件,取消注释信息

完成上面流程后,取消三个节点mongod.conf文件中security与setParameter部分的注释,然后重新启动即是带权限的方式了,之前的都是没有权限的启动

用vi 工具编辑,

vi /mongodbData/node01/conf/mongod.conf

vi /mongodbData/node02/conf/mongod.conf

vi /mongodbData/node03/conf/mongod.conf

去掉三个配置文件的#号,并且确保空格缩进准确是4个

#security:

# keyFile: /mongodbData/node03/conf/access.key

# authorization: enabled

#setParameter:

# authenticationMechanisms: SCRAM-SHA-1

再次启动数据库,开启用户登录认证

依次启动主节点, 从节点和仲裁节点的mongod后台进程:

mongod -f /mongodbData/node01/conf/mongod.conf

mongod -f /mongodbData/node02/conf/mongod.conf

mongod -f /mongodbData/node03/conf/mongod.conf

再次登录数据库,验证创建的用户

进入shell

mongo 127.0.0.1:27017

切换当前会话到 admin 数据库

use admin

使用数据库管理员认证

db.auth('root', 'root_jY_2021')

使用集群管理员认证

db.auth('suroot', 'suroot_jY_2021')

切换当前会话到 test 数据库

use test

使用数据库管理员认证

db.auth('test', 'test')

部署结束

至此, 单服务器下基于用户认证的MongoDB4.4.27三节点副本集集群环境已经搭建完成,
下面连接数据库方式

远程连接数据库

方法一:

使用Studio 3T  2019版本可视化工具远程连接(超级管理员)配置如下,只需要连接单节点

链接成功则出现一下信息

方法二:

使用nodejs 代码链接

mongodb://root:root_jY_2021@127.0.0.1:27017,127.0.0.1:27018/admin


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("连接成功");
});

使用过程问题

节点崩溃问题

在服务器内存不足的情况下容易导致节点崩溃,例如服务器内存只有8G。但是主从节点各设置了4g,导致后续使用情况下某个节点崩溃,例如从节点崩溃,然后无法启动,那么这时候,可以将原来node02/data的文件夹改名成data1,然后重新创建data目录,并且启动 node02的节点,

mongod -f /mongodbData/node02/conf/mongod.conf

进入shell

mongo 127.0.0.1:27018

这时候你回发现 节点的状态是  

OTHER

在 MongoDB 的复制集中,OTHER 状态表示该节点既不是主节点(PRIMARY)也不是从节点(SECONDARY),为了让该节点转换成从节点,必须执行以下操作,

切换当前会话到 admin 数据库

use admin

使用集群管理员认证

db.auth('suroot', 'suroot_jY_2021')

这时,节点状态变为

STARTUP2

在MongoDB复制集中,STARTUP2是一个特殊的节点状态,表示节点已经启动并正在尝试确定复制集的当前配置。它正处于初始化过程中,正在加载自己的配置信息,并尝试与其他复制集成员建立联系。在这个过程中,它还会加载自己的操作日志(oplog)。

具体来说,STARTUP2状态意味着:

  • 节点已经启动了MongoDB进程。
  • 节点正在尝试与复制集的其他成员通信,以便获取最新的配置信息。
  • 节点正在加载和应用oplog,以达到与复制集内其他节点相同的数据状态。

一旦节点完成了这些步骤,并且达到了与主节点同步的数据状态,它就会转变为SECONDARY状态,这时它就能接收客户端的读请求(如果允许读取从节点的话)并参与选举。

如果一个节点长时间处于STARTUP2状态,这可能是由于网络问题、配置错误,或者它正在进行一个非常大的初始同步操作。如果您遇到节点长时间卡在STARTUP2状态的情况,您应该检查节点的日志文件来获取更多信息。日志文件通常可以提供关于节点状态和任何遇到问题的详细信息。

节点降权

在高并发数据操作时(如迁移数据库并发量过大),如果服务器或磁盘的性能比较差会出现数据库进程被杀死的情况,通常是主节点27017被杀,导致从节点变成主节点,然后手动重启了27017会被仲裁节点判成从节点,这时候要重新改成主节点时,必须按一下操作。

进入shell(注意当前场景时27018是主节点)

mongo 127.0.0.1:27018

切换当前会话到 admin 数据库

use admin

使用集群管理员认证

db.auth('suroot', 'suroot_jY_2021')

执行降权命令操作

在 MongoDB 中,主节点降权(step down)是一个谨慎的操作,通常由副本集的自动选举机制来触发新的主节点选举。但如果你希望手动将主节点降权,MongoDB 提供了 rs.stepDown() 命令来实现。如果你想直接降权主节点而不等待选举新主节点,可以使用 rs.stepDown() 命令并提供一个可选的参数,指定降权的秒数。

以下是一个示例,演示如何使用 rs.stepDown() 命令来直接降权主节点,并将主节点的降权时间设置为0秒(立即降权):

rs.stepDown(0)

启动失败问题

如果你不是第一次启动该节点

1.你的目录里面缺少配置文件里面指定的启用的文件,如 access.key,也就是没注释掉 security 里面指向的文件和配置

2.可能是使用过程中pid 有问题,需要将3个节点的mongod.pid删除后重新启动创建新的pid文件

使用过程中报错问题日志过大需要轮换

手动执行日志轮转

进入shell

mongo 127.0.0.1:27017

切换当前会话到 admin 数据库

use admin

使用集群管理员认证

db.auth('suroot', 'suroot_jY_2021')

手动执行日志轮转

db.adminCommand({ logRotate : 1 })

这样表示修改成功,继续修改从节点的日志即可。

自动执行日志轮转

在 CentOS 7.9 上使用 logrotate 工具来自动管理 MongoDB 的日志文件。

以下是详细的步骤和说明:

确保 logrotate 安装。大多数 CentOS 系统默认安装了 logrotate。要检查是否已安装,请在终端中运行:

logrotate --version

如果已安装,这将显示 logrotate 的版本号。

如果未安装,可以通过运行以下命令来安装它:

yum install logrotate


创建 MongoDB 的 logrotate 配置文件
首先,你需要为 MongoDB 的日志文件创建一个 logrotate 配置文件。这个文件定义了如何轮转日志、何时轮转、执行哪些额外操作等。

打开文本编辑器以创建新的配置文件。使用 vi 没有就自动创建:

vi /etc/logrotate.d/mongodb

这将创建一个名为 mongodb 的新配置文件。

在编辑器中,添加以下内容(注意空格缩进):

# MongoDB日志轮转配置node01
 /mongodbData/node01/logs/mongod.log {
    daily
    maxsize 100M
    rotate 72
    copytruncate
    missingok
    notifempty
    compress
    delaycompress
    create 640 root root
 }
 
# MongoDB日志轮转配置node02
/mongodbData/node02/logs/mongod.log {
    daily
    maxsize  100M
    rotate 72
    copytruncate
    missingok
    notifempty
    compress
    delaycompress
    create 640 root root
}


# MongoDB日志轮转配置node03
/mongodbData/node03/logs/mongod.log {
    daily
    maxsize 100M
    rotate 72
    copytruncate
    missingok
    notifempty
    compress
    delaycompress
    create 640 root root

}

在这个配置中,日志文件将会在每天进行一次轮转,但如果文件大小在一天内达到了 100MB,它也会被轮转。

这段配置的意义如下:

/mongodbData/node01/logs/mongod.log:这是你的 MongoDB 日志文件的路径。
daily:每天轮转日志文件。 

maxsize 100M:当日志文件达到或超过 100MB 时触发轮转。
rotate 72:只保留72个旧日志文件。
copytruncate:复制并截断原始日志文件,而不需要关闭并重新打开日志文件(与 MongoDB 的 logRotate: rename 兼容)。
missingok:如果日志文件丢失,不报错。
notifempty:不轮转空文件。
compress 和 delaycompress:压缩旧日志文件。
create 640 root root:创建新日志文件的权限和所有者(根据 MongoDB 运行的用户和组来设置)。

日志轮转的频率取决于多个因素,包括应用程序的日志生成速率、磁盘空间限制、以及日志数据的重要性。在 logrotate 配置文件中,您可以根据实际需求来设置轮转的频率。常见的轮转频率设置有:

  1. 每天(daily): 对于产生大量日志或日志数据更新非常频繁的应用来说,每天轮转一次是一个常见的选择。

  2. 每周(weekly): 对于日志量适中的系统,每周轮转一次可能更为合适。

  3. 每月(monthly): 如果日志生成量不大,或者保存日志的磁盘空间较大,每月轮转一次可能足够。

  4. 自定义周期: 也可以根据特定的大小阈值(例如,使用 size 选项)来触发日志轮转,而不是基于时间。例如,您可以设置当日志文件达到一定大小(如 100MB)时进行轮转。

如果您希望在日志文件达到一定大小或者到达特定时间点时进行轮转,可以使用 maxsize 参数。这个参数与 dailyweeklymonthly 等时间参数结合使用时,会在日志文件达到指定大小或者到达设定的时间点时进行轮转,取先满足的条件。

例如:

/mongodbData/node01/logs/mongod.log {

  daily

  maxsize 100M

  rotate 5

  ...

}

在这个配置中,日志文件将会在每天进行一次轮转,但如果文件大小在一天内达到了 100MB,它也会被轮转。

上面的 create 配置如果是不是root的话,需要执行 以下命令,看mongodb是以什么身份运行

ps aux | grep mongod

测试 logrotate 配置.为了确保你的配置文件没有错误,你可以用 logrotate 的测试模式来检查:

logrotate /etc/logrotate.d/mongodb -d

-d 参数表示“调试模式”,它将显示 logrotate 将执行的操作,但不会真正执行它们

这个输出表明你的 logrotate 配置文件被正确读取并且没有错误,但由于当前条件没有满足轮转的需求(比如时间还没到),所以没有执行实际的轮转操作。

上面截图,这里是关键信息的解释:

reading config file /etc/logrotate.d/mongodb

Allocating hash table for state file, size 15360 B

上面的 logrotate 命令输出来看,现在 logrotate 已经正确地读取了 /etc/logrotate.d/mongodb 配置文件,并且对其中定义的日志文件进行了处理。

Handling 2 logs

Handling 2 logs: 表明 logrotate 正在处理两个日志文件的轮转,这与你的配置文件中定义的日志路径数量相符。

rotating pattern: /mongodbData/node01/logs/mongod.log after 1 days (31 rotations)

rotating pattern: 这部分描述了轮转的模式。例如,/mongodbData/node01/logs/mongod.log 在每天之后轮转,并且保留 31 个轮转的副本。这意味着每天检查一次是否需要轮转,并且最多保留 31 天的日志。

empty log files are not rotated, old logs are removed

considering log /mongodbData/node01/logs/mongod.log

empty log files are not rotated, old logs are removed: 这表示如果日志文件是空的,则不会进行轮转。此外,超出保留期限的旧日志将被删除。

log does not need rotating (log has been already rotated)

log does not need rotating (log has been already rotated): 对于每个考虑的日志文件,logrotate 判断它们目前不需要轮转。这可能是因为它们已经在之前被轮转过,或者还没达到定义的轮转条件(例如,还没有过一天)。

重要的是,这次执行是在“调试模式”下进行的(由 -d 参数指定),所以实际上并没有执行任何轮转操作。调试模式仅用于检查配置是否正确和 logrotate 将要执行哪些操作,而不会真正地轮转日志或更改任何文件。

启动自动轮转

使用crontab命令将logrotate定时任务添加到系统中,以便每天自动运行。可以运行以下命令来编辑当前用户的定时任务:

crontab -e

然后在打开的编辑器中添加以下行,以使logrotate每天自动轮转日志文件:

每天

0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/mongodb

每小时

0 * * * * /usr/sbin/logrotate -f /etc/logrotate.d/mongodb

每分钟

* * * * * /usr/sbin/logrotate -f /etc/logrotate.d/mongodb

这个定时任务将在每天的午夜(00:00)执行logrotate命令,强制执行指定的配置文件/etc/logrotate.d/mongodb中的日志轮转。

最后,保存并退出编辑器。

Cron 表达式含义

  1. 每小时的第15分钟:

    • 表达式:15 * * * *
    • 含义:
      • 分钟:15
      • 小时:每小时
      • 日期:每天
      • 月份:每月
      • 星期:每天
  2. 每小时的第30分钟:

    • 表达式:30 * * * *
    • 含义:
      • 分钟:30
      • 小时:每小时
      • 日期:每天
      • 月份:每月
      • 星期:每天

这两个表达式分别在每小时的15分钟和30分钟时执行定时任务。由于标准 Cron 表达式不包括秒字段,所以无法在同一分钟的特定秒数上执行任务。

现在,您已经设置了一个定时任务,logrotate将每天自动轮转指定的日志文件,并根据配置文件中的设置进行管理。您可以根据需要自定义配置文件和定时任务的时间以满足您的需求。

以下是效果

自执行说明

自动执行 logrotate。在 CentOS 上,logrotate 通常由 cron 作业自动运行。你可以检查 /etc/crontab 文件或 /etc/cron.* 目录来确认 logrotate 的运行频率。

一般来说,不需要额外的步骤来自动执行 logrotate,因为它已被系统的 cron 作业所配置。

通过这些步骤,你就可以设置 MongoDB 的日志文件自动轮转了。这样可以帮助管理日志文件的大小,防止它们占用过多的磁盘空间。

查看进程

ps aux | grep 'mongod'

根据 ps 命令输出,MongoDB 各个进程的内存使用情况(以 GB 为单位)大约如下:

第一个 mongod 进程(node01)大约使用了 5.29 GB 的内存。
第二个 mongod 进程(node02)大约使用了 6.12 GB 的内存。
第三个 mongod 进程(node03)大约使用了 0.074 GB 的内存。
这些数值反映了每个 MongoDB 实例的常驻集大小,即实际占用的物理内存量。这些信息对于理解每个 MongoDB 实例的内存需求非常有用,尤其是在调优和资源分配时。 ​

本教程发布于csdn,

链接
2024年单服务器部署Mongodb三节点副本集保姆级教程_mongodb三节点部署-CSDN博客

各种胡乱爬取技术网文章的站长请尊重原作者

  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值