前言
在运行 Crawlab 之前,我需要先部署一个 MongoDB 数据库来存储爬虫数据。
依然不在 Docker 中部署,而是直接在物理机(虚拟机)上部署。
方案概述
- 搭建
Prometheus+Grafana监控平台 - 部署和配置
MongoDB数据库- 安装
MongoDB - 配置
MongoDB允许远程访问与身份验证 - 初始化副本集(单节点副本集)
- 创建用于监控的专用用户
- 安装
- 安装
mongodb_exporter抓取MongoDB数据库指标 - 配置
Prometheus抓取mongodb_exporter的指标 - 在
Grafana中创建 Dashboard 展示MongoDB数据库指标 - 针对低负载环境的轻量化配置优化
操作步骤
一、搭建 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
修改 net 和 security 部分:
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 在同时启用 authorization 和 replication 时,强制要求配置 keyFile(用于副本集节点间的内部认证),单节点副本集也不例外。若缺少 keyFile,mongod 启动时会报错: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 直接导入即可。
六、针对低负载环境的轻量化配置优化
默认情况下,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
结束。