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

快猫实习生 2024-11-13 17:15:03

MongoDB 监控

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

问题:MongoDB 安装

“我是 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 等琳琅满目,这些监控工具分别会采集哪些监控指标呢?咱们来问问:

问题:各类监控工具,比如 datadog、prometheus、zabbix 等,它们通常会采集 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 的高效运行和持续可用性。

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

问题:各类监控工具,比如 datadog、prometheus、zabbix 等,是如何采集到 MongoDB 这些监控数据的?

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

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 实例上,然后执行一些命令获取性能指标。

注意,如果你执行 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 采集一下,看看效果如何。

联系我们交流

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat