MongoDB 监控(二)探索 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:
- 打开 MongoDB Compass,并连接到您的 MongoDB 实例。
- 选择您要创建集合的数据库。
- 点击 “Create Collection” 按钮。
- 输入集合的名称,然后点击 “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 采集一下,看看效果如何。