
这是 MongoDB 监控系列文章的第四篇,前面几篇文章的链接如下:
这篇开始咱们做个实操。根据前面的文章,要监控 MongoDB,需要创建一个账号并分配权限,咱也不知道咋搞,先问问,掌握个大概。
核心要点摘要
- 本文延续前一篇 README 阅读结果,实际创建 MongoDB Exporter 使用的监控用户。
- AIGC 给出的示例权限是
clusterMonitor+readAnyDatabase,本文实际采用 MongoDB Exporter README 中提到的clusterMonitor+local库read。 - 本地环境下载的是
mongodb_exporter-0.42.1.darwin-arm64.tar.gz,适配 MacBook M1。 - 启动 Exporter 后,通过
curl -s localhost:9216/metrics验证/metrics端点,并用grep mongodb查看 MongoDB 相关指标。 - 默认只看到
mongodb_up等少量指标时,可以使用--collect-all观察更多 collector 采集结果。
创建 MongoDB Exporter 用户
下面是我的 prompt:
我想使用 MongoDB Exporter 监控 MongoDB,需要创建一个用户并分配相关权限,这样 MongoDB Exporter 才能连接到 MongoDB 实例并获取监控数据。请问如何在 MongoDB 中创建用户并分配权限?
在 MongoDB 中创建用户并分配权限的步骤如下。您可以通过 MongoDB Shell 来执行这些操作。
1. 连接到 MongoDB
首先,使用 MongoDB Shell 连接到您的 MongoDB 实例。可以使用以下命令:
mongo --host <mongodb-host> --port <mongodb-port> -u <admin-username> -p <admin-password> --authenticationDatabase admin
确保将 <mongodb-host>、<mongodb-port>、<admin-username> 和 <admin-password> 替换为实际的值。
2. 选择数据库
在创建用户之前,您需要选择要为其创建用户的数据库。通常,为监控用途的用户可以在 admin 数据库中创建,但您也可以选择特定的数据库。
use admin
3. 创建用户
使用 db.createUser() 命令来创建用户并分配权限。以下是创建一个名为 monitoringUser 的用户的示例,该用户将被授予用于监控的权限:
db.createUser({
user: "monitoringUser",
pwd: "yourPassword", // 替换为您选择的密码
roles: [
{ role: "clusterMonitor", db: "admin" }, // 监控集群的权限
{ role: "readAnyDatabase", db: "admin" } // 读取任意数据库的权限
]
})
4. 验证用户创建
可以使用以下命令查看已创建的用户:
db.getUsers()
这将列出当前数据库中的所有用户。确保您看到刚刚创建的 monitoringUser。
5. 连接 MongoDB Exporter
在 MongoDB Exporter 的连接字符串中,使用刚创建的用户进行身份验证。例如:
docker run -d \
--name mongodb-exporter \
-e MONGODB_URI="mongodb://monitoringUser:yourPassword@<mongodb-host>:<mongodb-port>" \
-p 9216:9216 \
bitnami/mongodb-exporter
确保将 <mongodb-host> 和 <mongodb-port> 替换为实际的 MongoDB 实例信息。
上面的信息已经比较全面了,结合前面的系列文章,我做了如下实操:
test> use admin
switched to db admin
admin> db.createUser({
... user: "exporteruser",
... pwd: "MhxzKhl",
... roles: [
... { role: "clusterMonitor", db: "admin" },
... { role: "read", db: "local" }
... ]
... })
{ ok: 1 }
admin> db.getUsers()
{
users: [
{
_id: 'admin.exporteruser',
userId: UUID('5696bfbf-737c-4d99-8604-804a19c1f6a5'),
user: 'exporteruser',
db: 'admin',
roles: [
{ role: 'read', db: 'local' },
{ role: 'clusterMonitor', db: 'admin' }
],
mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
}
],
ok: 1
}
看起来创建用户的整个流程跑通了,接下来就是验证 MongoDB Exporter 是否能够连接到 MongoDB 实例并获取监控数据了。注意上面的 roles 部分,并没有按照 aigc 给的回复配置,而是根据 MongoDB Exporter README 中的说明来配置的。你也可以直接翻看前面的文章。
| 配置项 | 本文实操值 | 说明 |
|---|---|---|
| 用户所在库 | admin |
监控用户在 admin 中创建 |
| 用户名 | exporteruser |
本地测试用监控用户 |
| 角色 1 | { role: "clusterMonitor", db: "admin" } |
用于查看集群和实例状态 |
| 角色 2 | { role: "read", db: "local" } |
按 README 要求读取 local 库 |
安装 MongoDB Exporter
这里我不自己构建了,直接去 MongoDB Exporter 的 Github releases 页面下载他们打好的包,releases 页面地址如下:
https://github.com/percona/mongodb_exporter/releases
我的环境是 Macbook M1 所以下载下面这个发布包:
mongodb_exporter-0.42.1.darwin-arm64.tar.gz
解压缩:tar zxvf mongodb_exporter-0.42.1.darwin-arm64.tar.gz,然后进入解压后的目录,执行:
./mongodb_exporter --mongodb.uri=mongodb://exporteruser:MhxzKhl@127.0.0.1:27017 --web.listen-address=":9216"
上面的命令运行之后,没有任何输出,比较尴尬,应该是启动成功了,直接测试吧,使用 curl 命令:
curl -s localhost:9216/metrics
会打印出很多指标,因为 MongoDB Exporter 自身这个 Go 进程的指标也暴露出来了,所以你会看到很多 go_* 的指标,这些是 MongoDB Exporter 自身的指标,不是 MongoDB 的指标。这里我 grep 一下,只看 MongoDB 的指标:
$ curl -s localhost:9216/metrics | grep mongodb
collector_scrape_time_ms{collector="general",exporter="mongodb"} 0
# HELP mongodb_up Whether MongoDB is up.
# TYPE mongodb_up gauge
mongodb_up{cluster_role="mongod"} 1
看到 mongodb_up 了,用来表示 MongoDB 是否正常运行的。这里是 1,表示正常。没有更多指标了,按照前文提到的,MongoDB Exporter 类似 Node Exporter,会内置一堆 collector,咱就直接全部启用所有 Collector,看看有哪些指标:
# 增加 --collect-all 参数,重新启动 MongoDB Exporter
./mongodb_exporter --mongodb.uri=mongodb://exporteruser:MhxzKhl@127.0.0.1:27017 --web.listen-address=":9216" --collect-all
稍等片刻,让 Exporter 收集一些数据,然后再次 curl 就可以看到采集了非常多的数据。篇幅所限,就不全部贴出了:
# HELP mongodb_asserts_msg asserts.
# TYPE mongodb_asserts_msg untyped
mongodb_asserts_msg{cl_id="",cl_role=""} 0
# HELP mongodb_asserts_regular asserts.
# TYPE mongodb_asserts_regular untyped
mongodb_asserts_regular{cl_id="",cl_role=""} 0
# HELP mongodb_asserts_rollovers asserts.
# TYPE mongodb_asserts_rollovers untyped
mongodb_asserts_rollovers{cl_id="",cl_role=""} 0
...
上例中的指标有两个标签,cl_id 和 cl_role,都是空字符串,还记得之前文章的说明么?
如果你的 server type 是 standalone,那么 cl_role 将是 (empty string)。
实操结论和注意点
这次实操至少验证了三件事:
- MongoDB Exporter 可以使用单独的监控用户连接 MongoDB。
/metrics端点可以正常暴露 Prometheus 格式指标。--collect-all会启用更多采集项,指标数量明显增加。
生产环境里不要把真实用户名和密码直接写在命令行中,因为进程参数可能被 ps 或 top 看见。前一篇 README 里也提到,可以使用 MONGODB_USER 和 MONGODB_PASSWORD 环境变量来传递凭据。
总结
本文介绍了如何在 MongoDB 中创建监控用户、分配权限,以及如何安装和启动 MongoDB Exporter。通过访问 Exporter 的 /metrics 端点,可以确认 MongoDB 指标已经被暴露出来。
下一篇文章我会使用 Prometheus 抓取这些指标,然后找个 Grafana 仪表盘来展示一下。
FAQ
Q1:为什么本文没有使用 AIGC 示例里的 readAnyDatabase?
A:因为前一篇阅读的 MongoDB Exporter README 中给出的权限是 clusterMonitor 和 local 库 read。本文实操按 README 配置,避免给监控用户过大的权限。
Q2:只看到 mongodb_up 是否表示采集失败?
A:不一定。本文实操中默认输出里可以看到 mongodb_up,说明 Exporter 已经能连接 MongoDB。想观察更多指标,可以尝试 --collect-all。
Q3:生产环境可以把密码写在启动命令里吗?
A:不建议。命令行参数可能被系统命令看到。更稳妥的方式是使用环境变量、配置管理或密钥管理工具。
