MongoDB 监控(二)探索 MongoDB 的安装和基础使用

MongoDB 监控系列第二篇:在 MacBook M1 上用 Homebrew 安装 MongoDB,使用 mongosh 验证服务,并通过 db.serverStatus()、db.currentOp()、db.collection.stats() 等命令理解监控数据的来源,为后续接入 Exporter 做准备。

作者 快猫实习生

MongoDB 监控

MongoDB 是一个非常流行的 NoSQL 数据库,这是 MongoDB 监控系列文章的第二篇,探索 MongoDB 的安装和基础使用,为后面 MongoDB 的监控做准备。

核心要点摘要

  • 本文用 MacBook M1 + Homebrew 的方式安装 MongoDB,并用 mongosh 验证本地实例是否正常启动。
  • 安装流程包括安装 Homebrew、添加 MongoDB Tap、安装 mongodb-community、启动服务和连接 MongoDB。
  • 监控 MongoDB 时,采集器本质上也是客户端,会连接 MongoDB 并执行状态命令或读取日志、统计信息。
  • db.serverStatus()db.currentOp()db.collection.stats() 是理解 MongoDB 监控数据来源时非常重要的基础命令。
  • 如果直接执行 db.collection.stats()Collection not found,需要把 collection 换成真实集合名,或先创建集合再查看统计信息。

安装目标和环境

本文的问题是:“我是 Macbook,M1 芯片,想要使用 Homebrew 安装 MongoDB,应该如何安装?”

在 MacBook M1 芯片上使用 Homebrew 安装 MongoDB 的步骤如下。

1. 安装 Homebrew

如果尚未安装 Homebrew,可以通过终端运行以下命令进行安装:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

根据提示完成安装过程。

2. 添加 MongoDB Tap

由于 MongoDB 在 Homebrew 的默认仓库中不再提供,您需要添加 MongoDB 的官方 Tap:

brew tap mongodb/brew

3. 安装 MongoDB

接下来,您可以使用以下命令安装 MongoDB:

brew install mongodb-community

4. 启动 MongoDB 服务

安装完成后,可以使用 Homebrew 启动 MongoDB 服务:

brew services start mongodb/brew/mongodb-community

5. 连接到 MongoDB

首先通过 ps 看看 MongoDB 进程是否启动:

ulric@bogon links % ps aux|grep mongo
ulric            13917   1.2  0.0 410723808   1488 s002  S+    5:18下午   0:00.01 grep --color mongo
ulric             7880   0.1  0.2 411843232  35712   ??  S     4:57下午   0:08.63 /opt/homebrew/opt/mongodb-community/bin/mongod --config /opt/homebrew/etc/mongod.conf

MongoDB 启动后,可以使用 MongoDB Shell 连接到数据库:

ulric@bogon links % mongosh
Current Mongosh Log ID:	67346f4a51f2e8861d17f188
Connecting to:		mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.3
Using MongoDB:		8.0.1
Using Mongosh:		2.3.3

For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/

------
   The server generated these startup warnings when booting
   2024-11-13T16:57:28.811+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
------

test>

得到上面的类似输出,就说明一切正常。

6. 停止 MongoDB 服务

如果需要停止 MongoDB 服务,可以运行:

brew services stop mongodb/brew/mongodb-community

获取 MongoDB 的监控指标

在上一篇文章中,GPT 告诉我们有两个命令可以查看 MongoDB 的状态:db.serverStatus()db.currentOp(),现在咱们有环境了,可以试试了。使用 mongosh 进入 MongoDB 命令行,执行这两个命令即可。这俩命令都是好使的,但是输出太多了,不太方便查看,我这里就不展示了。

监控工具挺多的,除了 Nightingale 之外,Prometheus、Zabbix、Datadog 等琳琅满目,这些监控工具分别会采集哪些监控指标呢?咱们来问问:

常见监控工具通常会采集哪些 MongoDB 指标

各类监控工具,如 Datadog、Prometheus、Zabbix 等,通常会采集 MongoDB 的一系列关键指标,以帮助用户监控数据库的性能和健康状况。以下是一些常见的监控指标:

1. 连接数相关指标

  • 当前连接数:监控当前连接到 MongoDB 的客户端数量。
  • 最大连接数:配置的最大连接数限制。

2. 操作统计

  • 读操作数:每秒处理的读取操作数量。
  • 写操作数:每秒处理的写入操作数量。
  • 命令执行时间:执行命令所花费的时间,包括平均值和最大值。

3. 内存使用

  • 内存使用量:MongoDB 使用的内存总量。
  • 缓存命中率:监控内存中缓存的命中率,以评估内存的效率。

4. CPU 使用率

  • CPU 使用率:监控 MongoDB 进程的 CPU 使用情况,识别潜在的性能瓶颈。

5. 磁盘 I/O

  • 磁盘读取速率:每秒读取的字节数。
  • 磁盘写入速率:每秒写入的字节数。
  • 磁盘使用情况:监控 MongoDB 数据存储所在磁盘的使用情况。

6. 慢查询

  • 慢查询数量:执行时间超过预定阈值的查询数量。
  • 慢查询详情:捕获和分析执行时间较长的查询,以进行优化。

7. 副本集状态

  • 主节点状态:监控主节点的健康状况。
  • 从节点状态:监控从节点的健康状况和延迟。
  • 复制延迟:从节点与主节点之间的复制延迟时间。

8. 集合和数据库统计

  • 集合数量:数据库中的集合数量。
  • 文档数量:每个集合中的文档数量。
  • 数据大小:每个集合占用的存储空间。

9. 触发器和索引

  • 索引使用情况:监控索引的使用频率,以评估索引的有效性。
  • 触发器活动:监控触发器的执行情况和性能。

10. 网络流量

  • 网络输入/输出流量:监控 MongoDB 的网络流量,包括发送和接收的数据量。

总结

通过采集这些指标,监控工具能够提供有关 MongoDB 实例的全面视图,帮助用户识别性能瓶颈、监控系统健康状况以及进行容量规划。选择适合的监控工具,并定期审查和优化这些指标,将有助于确保 MongoDB 的高效运行和持续可用性。

大概有个了解就行。目前还不用深究,咱们继续问问这些指标是通过什么方式采集的。

MongoDB 监控数据是怎么被采集到的

监控工具采集 MongoDB 数据的方式通常包括以下几种方法:

采集方式 典型数据来源 说明
MongoDB 命令 db.serverStatus()db.currentOp()db.collection.stats() 采集实例状态、当前操作、集合统计等信息
监控代理或 Exporter MongoDB Exporter 作为客户端连接 MongoDB,再把指标暴露给 Prometheus 等系统
日志分析 慢查询日志、操作日志 从日志里识别慢查询和数据库活动
API 或平台集成 Datadog、New Relic 等集成 通过平台能力定期获取指标
自定义脚本 Python、Bash 等脚本 自行执行命令并写入监控系统
集成插件或模板 Zabbix、Nagios 等插件 使用现成监控项和触发器

1. 使用 MongoDB 自带的监控接口

MongoDB 提供了一系列命令和接口,可以通过其 Shell 或 REST API 获取性能和状态信息。常用的命令包括:

  • db.serverStatus():提供关于服务器状态的全面视图,包括连接数、操作统计、内存使用等。
  • db.currentOp():显示当前正在执行的操作,有助于识别长时间运行的查询和锁争用。
  • db.collection.stats():获取集合的统计信息,包括文档数、数据大小、索引使用情况等。

监控工具可以通过执行这些命令来定期收集和记录相关指标。

2. 监控代理

许多监控工具使用代理或导出器来采集数据。例如:

  • Prometheus Exporter:MongoDB Exporter 是一个专门的工具,用于从 MongoDB 实例中收集指标并将其暴露为 Prometheus 可抓取的格式。它可以配置为定期查询 MongoDB 的状态并将数据发送到 Prometheus。

3. 日志分析

一些监控工具可以通过分析 MongoDB 的日志文件来获取性能指标:

  • 慢查询日志:MongoDB 可以配置为记录慢查询,监控工具可以定期分析这些日志,以识别性能问题。
  • 操作日志:通过分析操作日志,可以收集关于数据库活动和性能的额外信息。

4. API 集成

  • REST API:许多监控工具(如 Datadog 和 New Relic)提供 REST API,可以从 MongoDB 实例中获取实时监控数据。这些工具通常会定期调用这些 API 来获取最新的指标。

5. 自定义脚本

用户可以编写自定义脚本(使用 Python、Bash 等语言)来执行 MongoDB 命令并将结果发送到监控系统。例如,可以编写一个定时作业,定期执行 db.serverStatus() 并将结果发送到 Grafana 或其他数据存储。

6. 集成工具

一些监控平台(如 Zabbix 和 Nagios)提供了 MongoDB 的集成插件或模板。这些集成通常会包括设置好的监控项和触发器,用户只需配置 MongoDB 的连接信息,即可开始收集数据。

总结

监控工具通过执行 MongoDB 提供的监控命令、使用监控代理、分析日志文件、调用 API、运行自定义脚本以及利用集成工具来采集数据。这些方法相结合,使得监控工具能够实时收集和分析 MongoDB 的性能和健康状况。选择合适的采集方式可以确保监控数据的全面性和准确性。

看起来,采集器是作为一个 client,直接连到 MongoDB 实例上,然后执行一些命令获取性能指标。

验证 collection stats 的一个小坑

注意,如果你执行 db.collection.stats() 命令时,出现以下错误:

test> db.collection.stats()
MongoServerError[NamespaceNotFound]: PlanExecutor error during aggregation :: caused by :: Unable to retrieve storageStats in $collStats stage :: caused by :: Collection [test.collection] not found.

这个报错很明显,说 Collection [test.collection] not found,我猜测:默认登录的 DB 是 test,test 里没有名称为 collection 的 Collection,所以报错了,咱们创建一个 Collection,再试试:

如何在 MongoDB 中创建一个 Collection

在 MongoDB 中创建一个集合(Collection)相对简单,通常可以通过 MongoDB Shell、MongoDB 驱动程序或图形化管理工具来完成。以下是几种常见的方法:

1. 使用 MongoDB Shell

在 MongoDB Shell 中,您可以通过以下命令创建一个集合:

use myDatabase
db.createCollection("myCollection")

步骤说明:

  • use myDatabase:切换到您要创建集合的数据库。如果该数据库不存在,MongoDB 会在插入数据时自动创建该数据库。
  • db.createCollection("myCollection"):创建名为 myCollection 的集合。

2. 自动创建集合

在 MongoDB 中,当您插入第一个文档到一个不存在的集合时,该集合会自动创建。例如:

use myDatabase
db.myCollection.insert({ name: "Alice", age: 30 })

在执行插入操作时,如果 myCollection 不存在,它将被自动创建。

3. 使用 MongoDB 驱动程序

如果您使用的是编程语言的 MongoDB 驱动程序,例如 Python、Node.js 等,可以通过相应的驱动程序创建集合。以下是使用 Python 驱动程序 PyMongo 的示例:

from pymongo import MongoClient

# 连接到 MongoDB
client = MongoClient('mongodb://localhost:27017/')

# 选择数据库
db = client['myDatabase']

# 创建集合
collection = db['myCollection']

4. 使用 MongoDB Compass

如果您更喜欢图形化界面,可以使用 MongoDB Compass:

  1. 打开 MongoDB Compass,并连接到您的 MongoDB 实例。
  2. 选择您要创建集合的数据库。
  3. 点击 “Create Collection” 按钮。
  4. 输入集合的名称,然后点击 “Create Collection”。

5. 集合选项

在创建集合时,您还可以指定一些选项,例如:

  • 最大文档数:使用 createCollection 方法时,可以设置最大文档数。
  • 最大存储大小:限制集合的存储大小。

例如:

db.createCollection("myCollection", { capped: true, size: 10000 })

这将创建一个限制为 10,000 字节的固定大小集合。

总结

在 MongoDB 中创建集合可以通过多种方式进行,包括使用 MongoDB Shell、编程语言的驱动程序、图形化管理工具等。了解这些方法可以帮助您根据需要灵活选择。

这效率大幅提升啊。根据上面的回答,我计划来做如下测试:

db.createCollection("users")
db.users.insert({ name: "Alice", age: 30 })

测试结果如下:

test> db.createCollection("users")
{ ok: 1 }

test> db.users.insert({ name: "Alice", age: 30 })
DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.
{
  acknowledged: true,
  insertedIds: { '0': ObjectId('673473ad51f2e8861d17f189') }
}

test> db.users.stats()
{
  ok: 1,
  capped: false,
  wiredTiger: {
    metadata: { formatVersion: 1 },
...
}

OK,验证符合预期,不能直接执行 db.collection.stats(),应该把 collection 换成真实的 Collection 的名称。

结语

今天我们又前进了一步,对 MongoDB 的监控有了一个基本的想法,下一节咱们搞一个 Exporter 采集一下,看看效果如何。

FAQ

Q1:MongoDB 采集器为什么需要连接数据库?

A:因为很多监控数据来自 MongoDB 自身命令和状态接口。采集器通常作为客户端连接 MongoDB,定期执行相关命令,再把结果转成监控指标。

Q2:为什么 db.collection.stats() 会报 Collection not found?

A:这里的 collection 不是固定命令名,而是集合名占位。默认 test 数据库里没有名为 collection 的集合时,就会报错。应该替换成真实集合名,例如 db.users.stats()

Q3:这篇文章是否已经完成生产级监控配置?

A:没有。本文只是安装 MongoDB、验证基础命令和理解监控数据来源,后续还需要 Exporter、采集配置、指标存储、仪表盘和告警规则。

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云