Skip to content
Go back

部署 MongoDB 并结合 Prometheus 和 Grafana 进行监控

| 0 Views Edit page

前言

在运行 Crawlab 之前,我需要先部署一个 MongoDB 数据库来存储爬虫数据。
依然不在 Docker 中部署,而是直接在物理机(虚拟机)上部署。


方案概述

  1. 搭建 Prometheus + Grafana 监控平台
  2. 部署和配置 MongoDB 数据库
    1. 安装 MongoDB
    2. 配置 MongoDB 允许远程访问与身份验证
    3. 初始化副本集(单节点副本集)
    4. 创建用于监控的专用用户
  3. 安装 mongodb_exporter 抓取 MongoDB 数据库指标
  4. 配置 Prometheus 抓取 mongodb_exporter 的指标
  5. Grafana 中创建 Dashboard 展示 MongoDB 数据库指标
  6. 针对低负载环境的轻量化配置优化

操作步骤

一、搭建 Prometheus + Grafana 监控平台

直接参考我的另一篇文章:搭建 Prometheus + Grafana 监控平台并使用 Node Exporter 监测服务器状态

二、部署和配置 MongoDB 数据库

1、安装 MongoDB 数据库

主要参考的文章:安装 MongoDB Community Edition

从官方源安装最新的稳定版本(以 Ubuntu 22.04 环境为例):

sudo apt-get install gnupg curl
# 导入仓库签名密钥
curl -fsSL https://pgp.mongodb.com/server-8.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg \
   --dearmor

# 创建仓库配置文件
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/8.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.2.list

# 更新包列表并安装
sudo apt-get update
sudo apt-get install -y mongodb-org

安装完成后,启动并设置开机自启:

sudo systemctl start mongod
sudo systemctl enable mongod
sudo systemctl status mongod

2、配置 MongoDB 允许远程访问与身份验证

默认情况下,MongoDB 仅绑定到本地环回地址 127.0.0.1 且没有开启任何身份认证保护。
编辑配置文件:

sudo nano /etc/mongod.conf

修改 netsecurity 部分:

net:
  port: 27017
  bindIp: 0.0.0.0  # 允许所有 IP 访问(请一定确保云服务器的防火墙 / 安全组已做好来源 IP 限制)

security:
  authorization: "enabled"  # 开启密码认证

重启服务以生效:

sudo systemctl restart mongod

3、初始化副本集(单节点副本集)

Prisma 等 ORM 依赖事务来保证写操作的原子性,而 MongoDB 事务要求数据库以副本集(Replica Set)模式运行。即使只有单个节点,也必须将其初始化为单节点副本集,否则执行写操作时会报错:Prisma needs to perform transactions, which requires your MongoDB server to be run as a replica set

注意MongoDB 在同时启用 authorizationreplication 时,强制要求配置 keyFile(用于副本集节点间的内部认证),单节点副本集也不例外。若缺少 keyFilemongod 启动时会报错:security.keyFile is required when authorization is enabled with replica sets

首先生成 keyFile

sudo mkdir -p /etc/mongodb
# 生成 756 字节的随机 Base64 内容作为共享密钥
sudo openssl rand -base64 756 | sudo tee /etc/mongodb/keyfile > /dev/null
# keyFile 权限必须为 400,且归属于运行 mongod 的用户
sudo chmod 400 /etc/mongodb/keyfile
sudo chown mongodb:mongodb /etc/mongodb/keyfile

编辑配置文件,将 keyFile 路径加入 security 节点,并在末尾追加 replication 配置:

sudo nano /etc/mongod.conf
security:
  authorization: "enabled"
  keyFile: /etc/mongodb/keyfile  # 副本集模式下必须指定

replication:
  replSetName: "rs0"  # 副本集名称,可自定义

重启服务以生效:

sudo systemctl restart mongod
sudo systemctl status mongod

连接本地 mongosh 初始化副本集(此时尚未创建用户,本地连接无需认证):

mongosh
rs.initiate()

初始化成功后,等待数秒,命令行提示符会从 test> 变为 rs0 [direct: primary]>,表示当前节点已成为主节点。
执行以下命令确认副本集状态,看到 "stateStr" : "PRIMARY" 即为成功:

rs.status()

退出(后续步骤继续在新的 mongosh 会话中创建用户):

exit

4、创建用于监控的专用用户

由于刚才开启了认证,我们需要先创建一个管理员账户,然后再创建用于 Prometheus 抓取的监控用户。 先通过本地直接登录 mongosh

mongosh

mongosh 中进入 admin 数据库,并执行以下命令创建管理员和监控专用用户:

use admin
// 1. 创建超级管理员
db.createUser({
  user: "admin",
  pwd: "<your_password>",
  roles: [ { role: "userAdminAnyDatabase", db: "admin" }, { role: "readWriteAnyDatabase", db: "admin" } ]
})

// 2. 身份验证:后续操作前需要先通过认证
db.auth("admin", "<your_password>")
db.grantRolesToUser("admin", [{ role: "root", db: "admin" }])

// 3. 创建 Prometheus 监控专用用户
db.createUser({
  user: "prometheus",
  pwd: "<prometheus_password>",
  roles: [ { role: "clusterMonitor", db: "admin" }, { role: "readAnyDatabase", db: "admin" } ]
})

退出:

exit

三、安装 mongodb_exporter 抓取 MongoDB 数据库指标

通过官方推荐的 mongodb_exporter,它是 Percona 维护的。
发布页:mongodb_exporter Releases

cd /tmp
curl -L -O https://github.com/percona/mongodb_exporter/releases/download/v0.49.0/mongodb_exporter-0.49.0.linux-amd64.tar.gz
tar -xzf mongodb_exporter-0.49.0.linux-amd64.tar.gz
sudo cp mongodb_exporter-0.49.0.linux-amd64/mongodb_exporter /usr/local/bin/

创建 systemd 服务文件来管理:

sudo nano /etc/systemd/system/mongodb_exporter.service
[Unit]
Description=Prometheus MongoDB Exporter
After=network.target mongod.service

[Service]
Type=simple
User=mongodb
# 配置刚才创建的 prometheus 用户的连接信息
Environment="MONGODB_URI=mongodb://prometheus:prometheus_password@localhost:27017/admin"

ExecStart=/usr/local/bin/mongodb_exporter \
    --web.listen-address=:9216 \
    --collect-all

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

保存后,重载 systemd 并启动:

sudo systemctl daemon-reload
sudo systemctl start mongodb_exporter
sudo systemctl enable mongodb_exporter

验证是否成功获取到了指标:

curl http://localhost:9216/metrics

四、配置 Prometheus 抓取 mongodb_exporter 的指标

编辑 Prometheus 配置 prometheus.yml,增加抓取 job:

sudo nano /opt/prometheus/prometheus.yml
  - job_name: 'mongodb-exporter'
    static_configs:
      - targets:
        # 这里填 mongodb_exporter 所在服务器的内网或外网 IP
        - 'your-mongodb-exporter-server-ip:9216'

重载配置生效:

curl -X POST http://localhost:9090/-/reload

五、在 Grafana 中创建 Dashboard 展示 MongoDB 指标

直接使用社区完善的面版,例如 MongoDB Exporter Dashboard (ID: 16490)。 在 Dashboards > Import dashboard 中输入 16490 直接导入即可。
Grafana 面板

六、针对低负载环境的轻量化配置优化

默认情况下,MongoDB 会占用近一半的系统内存作为缓存。
由于我的这个数据库主要是为了跑小型应用,负荷会很小,因此我还要手动压低它的资源占用。
打开配置文件:

sudo nano /etc/mongod.conf

storage 节点中,新增 wiredTiger 参数对缓存大小进行硬限制:

storage:
  dbPath: /var/lib/mongodb
  wiredTiger:
    engineConfig:
      # 限制为 0.5GB 的内存缓存(最小可设为 0.25GB),避免过度消耗宿主机性能
      cacheSizeGB: 0.5

修改完后,重启一下 MongoDB 让其以轻量模式运行:

sudo systemctl restart mongod
sudo systemctl status mongod

结束。


Edit page