监控 MongoDB
监控是所有数据库管理的关键组成部分。牢牢掌握 MongoDB 的报告将使您能够评估数据库的状态并在没有危机的情况下维护您的部署。此外,了解 MongoDB 的正常操作参数将使您能够在问题升级为故障之前对其进行诊断。
本文档概述了 MongoDB 中可用的监控实用程序和报告统计信息。它还介绍了监控副本集和分片集群的诊断策略和建议。
监控策略
MongoDB 提供了各种方法来收集有关正在运行的 MongoDB 实例状态的数据:
- 从版本 4.0 开始,MongoDB 为独立版本和副本集提供免费的云监控。
- MongoDB 分发了一组实用程序,可提供数据库活动的实时报告。
- MongoDB 提供各种数据库命令,以更高的保真度返回有关当前数据库状态的统计信息。
- MongoDB 阿特拉斯 是一个云托管的数据库即服务,用于运行、监控和维护 MongoDB 部署。
- MongoDB 云管理器是一项托管服务,用于监视正在运行的 MongoDB 部署以收集数据并根据该数据提供可视化和警报。
- MongoDB Ops Manager 是MongoDB Enterprise Advanced 中提供的本地解决方案 它监视正在运行的 MongoDB 部署以收集数据并根据该数据提供可视化和警报。
每种策略都可以帮助回答不同的问题,并且在不同的情况下都很有用。这些方法是互补的。
MongoDB 报告工具
本节概述了随 MongoDB 一起分发的报告方法。它还提供了每种方法最适合帮助您解决的问题类型的示例。
免费监控
4.0版本中的新功能。
MongoDB 为独立或副本集提供免费的云监控。
默认情况下,您可以使用 db.enableFreeMonitoring()
和启用/禁用运行时期间的免费监控db.disableFreeMonitoring()
。
免费监控提供长达24小时的数据。更多详情,请参阅 免费监控。
实用工具
MongoDB 发行版包含许多实用程序,可以快速返回有关实例性能和活动的统计信息。通常,这些对于诊断问题和评估正常操作最有用。
mongostat
mongostat
按类型(例如插入、查询、更新、删除等)捕获并返回数据库操作的计数。这些计数报告服务器上的负载分布。
使用mongostat
了解运营类型的分布并为容量规划提供信息。请参阅mongostat
详细信息请参考页面。
mongotop
mongotop
跟踪并报告 MongoDB 实例的当前读写活动,并按集合报告这些统计信息。
使用mongotop
检查您的数据库活动和使用是否符合您的期望。请参阅mongotop
详细信息请参考页面。
HTTP 控制台
版本3.6中的更改:MongoDB 3.6 删除了已弃用的 HTTP 接口和 MongoDB 的 REST API。
命令
MongoDB 包含许多报告数据库状态的命令。
这些数据可以提供比上面讨论的实用程序更精细的粒度。考虑在脚本和程序中使用它们的输出来开发自定义警报,或修改应用程序的行为以响应实例的活动。该db.currentOp()
方法是识别数据库实例正在进行的操作的另一个有用工具。
serverStatus
该serverStatus
命令或db.serverStatus()
来自 shell,返回数据库状态的总体概述,详细说明磁盘使用情况、内存使用情况、连接、日志记录和索引访问。该命令返回很快,并且不影响 MongoDB 性能。
serverStatus
输出 MongoDB 实例状态的帐户。该命令很少直接运行。在大多数情况下,数据在汇总后更有意义,正如人们通过监控工具看到的那样,包括MongoDB 云管理器和运营经理。尽管如此,所有管理员都应该熟悉 serverStatus
.
dbStats
该dbStats
命令或db.stats()
来自 shell,返回一个解决存储使用和数据量问题的文档。它们 dbStats
反映了所使用的存储量、数据库中包含的数据量以及对象、集合和索引计数器。
使用此数据来监视特定数据库的状态和存储容量。此输出还允许您比较数据库之间的使用情况并确定 数据库中的平均文档大小。
collStats
或来自 shell,它提供类似于集合级别的统计信息,包括集合中对象的计数、集合的大小、集合使用的磁盘空间量以及有关其索引的信息collStats
。db.collection.stats()
dbStats
replSetGetStatus
该replSetGetStatus
命令(rs.status()
来自 shell)返回副本集状态的概述。replSetGetStatus文档详细介绍了副本集的状态和配置以及有关其成员的统计信息。
使用此数据可确保复制配置正确,并检查当前主机与副本集其他成员之间的连接。
托管 (SaaS) 监控工具
这些是作为托管服务提供的监控工具,通常通过付费订阅来提供。
名称 | 笔记 |
---|---|
MongoDB cloud manager | MongoDB Cloud Manager是一套基于云的服务,用于管理 MongoDB 部署。MongoDB Cloud Manager提供监控、备份和自动化功能。对于本地解决方案,另请参阅 Ops Manager,可在 MongoDB Enterprise Advanced 中使用。 |
VividCortex | VividCortex 提供对 MongoDB 的深入见解生产数据库工作负载和查询性能——以一秒的分辨率。跟踪延迟、吞吐量、错误等,以确保 MongoDB 上的应用程序的可扩展性和卓越性能。 |
Scout | 几个插件,包括MongoDB监控, MongoDB 慢查询, 和MongoDB 副本集监控。 |
Server Density | MongoDB 仪表板、MongoDB 特定警报、复制故障转移时间表以及 iPhone、iPad 和 Android 移动应用程序。 |
Application Performance Management | IBM 拥有应用程序性能管理 SaaS 产品,其中包括 MongoDB 以及其他应用程序和中间件的监控器。 |
New Relic | New Relic 为应用程序性能管理提供全面支持。此外,New Relic 插件和见解使您能够在 New Relic 中查看来自 Cloud Manager 的监控指标。 |
Datadog | 基础设施监控可视化 MongoDB 部署的性能。 |
SPM Performance Monitoring | 监控、异常检测和警报SPM 监控所有关键 MongoDB 指标以及基础设施,包括。Docker 和其他应用程序指标,例如 Node.js、Java、NGINX、Apache、HAProxy 或 Elasticsearch。SPM 提供指标和日志的关联。 |
Pandora FMS | 潘多拉 FMS 提供PandoraFMS-mongodb-监控 监控 MongoDB 的插件。 |
过程记录
在正常操作期间,mongod
实例mongos
将所有服务器活动和操作的实时记录报告到标准输出或日志文件。以下运行时设置控制这些选项。
quiet
。限制写入日志或输出的信息量。verbosity
。增加写入日志或输出的信息量。您还可以在运行时使用shell 中的logLevel
参数或 方法修改日志记录的详细程度。db.setLogLevel()
path
。启用记录到文件,而不是标准输出。调整此设置时必须指定日志文件的完整路径。logAppend
。将信息添加到日志文件而不是覆盖该文件。
笔记
您可以将这些配置操作指定为mongod或mongos 的命令行参数
例如:
mongod -v --logpath /var/log/mongodb/server1.log --logappend
mongod
在模式下启动实例verbose
,将数据附加到位于 的日志文件中/var/log/mongodb/server1.log/
。
以下数据库命令也会影响日志记录:
日志编辑
仅适用于 MongoDB 企业版
或运行 with 在记录之前编辑伴随给定日志事件的任何消息,仅留下与事件相关的元数据、源文件或行号mongod
。防止潜在的敏感信息进入系统日志,但会牺牲诊断详细信息。mongos
redactClientLogData
redactClientLogData
例如,以下操作将文档插入到 mongod
正在运行的无日志编辑中。mongod
日志详细级别设置为 1
:
db.clients.insertOne( { "name" : "Joe", "PII" : "Sensitive Information" } )
此操作会产生以下日志事件:
2017-06-09T13:35:23.446-04:00 I COMMAND [conn1] command internal.clients
appName: "MongoDB Shell"
command: insert {
insert: "clients",
documents: [ {
_id: ObjectId('593adc5b99001b7d119d0c97'),
name: "Joe",
PII: " Sensitive Information"
} ],
ordered: true
}
...
当mongod
运行并redactClientLogData
执行相同的插入操作时,它会生成以下日志事件:
2017-06-09T13:45:18.599-04:00 I COMMAND [conn1] command internal.clients
appName: "MongoDB Shell"
command: insert {
insert: "###", documents: [ {
_id: "###", name: "###", PII: "###"
} ],
ordered: "###"
}
与静态加密和TLS/SSL(传输加密)redactClientLogData
结合 使用,以帮助遵守法规要求。
诊断性能问题
当您使用 MongoDB 开发和操作应用程序时,您可能希望分析数据库作为应用程序的性能。 MongoDB 性能讨论了一些可能影响性能的操作因素。
复制和监控
除了任何 MongoDB 实例的基本监控要求之外,对于副本集,管理员还必须监控复制延迟。“复制延迟”是指将主服务器上的写操作复制(即复制)到 辅助服务器所需的时间量。一些小的延迟时间可能是可以接受的,但随着复制滞后的增长,会出现严重的问题,包括:
- 主节点上的缓存压力越来越大。
- 滞后期间发生的操作不会复制到一个或多个辅助节点。如果您使用复制来确保数据持久性,则异常长的延迟可能会影响数据集的完整性。
- 如果复制延迟超过操作日志 ( oplog )的长度,那么 MongoDB 将必须在辅助数据库上执行初始同步,从主数据库复制所有数据并重建所有索引。[ 1 ]这在正常情况下并不常见,但如果您将 oplog 配置为小于默认值,则可能会出现问题。
笔记:
oplog 的大小只能在第一次运行期间使用命令
--oplogSize
的参数进行配置mongod
,或者最好oplogSizeMB
使用 MongoDB 配置文件中的设置。如果在使用该选项运行之前未在命令行上指定此项--replSet
,mongod
将创建默认大小的 oplog。默认情况下,oplog 占 64 位系统上总可用磁盘空间的 5%。有关更改 oplog 大小的更多信息,请参阅更改 Oplog 的大小。
流量控制
从 MongoDB 4.2 开始,管理员可以限制主数据库应用其写入的速率,以将延迟保持在majority committed
可配置的最大值以下flowControlTargetLagSeconds
。
缺省情况下,流量控制为enabled
。
笔记:
为了进行流量控制,副本集/分片集群必须具有:featureCompatibilityVersion (fCV) of
4.2
和 read Concernmajority enabled
。4.2
也就是说,如果 fCV 未启用或读关注多数被禁用,则启用的流控制无效。
另请参阅:检查复制延迟。
副本集状态
复制问题通常是由于成员之间的网络连接问题造成的,或者是由于主节点没有资源来支持应用程序和复制流量造成的。要检查副本的状态,请replSetGetStatus
在 shell 中使用以下帮助程序:
rs.status()
该replSetGetStatus
参考提供了此输出的更深入的概述。一般情况下,请注意的值 optimeDate
,特别要注意主次成员 之间的时间差。
oplog 可以增长超过其配置的大小限制,以避免删除majority commit point
.
免费监控
笔记
Oplog条目应用缓慢
从版本 4.2 开始,副本集的辅助成员现在会记录应用时间超过慢速操作阈值的oplog 条目。这些缓慢的 oplog 消息:
- 记录在 中的辅助节点
diagnostic log
。 - 记录在
REPL
带有文本的组件 下applied op: <oplog entry> took <num>ms
。 - 不依赖日志级别(无论是系统级别还是组件级别)
- 不依赖于分析级别。
- 可能会受到影响
slowOpSampleRate
,具体取决于您的 MongoDB 版本:- 在 MongoDB 4.2 中,这些慢速 oplog 条目不受
slowOpSampleRate
. 无论采样率如何,MongoDB 都会记录所有慢速 oplog 条目。 - 在 MongoDB 4.4 及更高版本中,这些缓慢的 oplog 条目受到
slowOpSampleRate
.
- 在 MongoDB 4.2 中,这些慢速 oplog 条目不受
探查器不会捕获慢速 oplog 条目。
分片和监控
在大多数情况下,分片集群的组件 受益于与所有其他 MongoDB 实例相同的监控和分析。此外,集群需要进一步监控,以确保数据在节点之间有效分布以及分片操作正常运行。
提示:
也可以看看:
有关更多信息,请参阅分片文档。
配置服务器
配置数据库维护一个映射,标识哪些文档位于哪些分片上。当块在分片之间移动时,集群会更新此映射 。当配置服务器无法访问时,某些分片操作将变得不可用,例如移动块和启动mongos
实例。但是,仍然可以从已运行的 mongos
实例访问集群。
由于无法访问的配置服务器可能会严重影响分片集群的可用性,因此您应该监控配置服务器以确保集群保持良好的平衡并且实例mongos
可以重新启动。
MongoDB 云管理器和运营经理监视配置服务器,并可以在配置服务器无法访问时创建通知。请参阅 MongoDB 云管理器文档和运营管理器文档了解更多信息。
平衡和块分配
最有效的分片集群部署可以均匀地平衡 分片之间的块。为了实现这一点,MongoDB 有一个后台平衡器进程,用于分配数据以确保块始终在分片之间最佳分配。
从内部 向发出db.printShardingStatus()
or命令sh.status()
mongos
mongosh
。这将返回整个集群的概述,包括数据库名称和块列表。
过时的锁
要检查数据库的锁定状态,请 mongos
使用以下命令连接到实例mongosh
。发出以下命令序列以切换到config
数据库并显示分片数据库上所有未完成的锁:
use config
db.locks.find()
平衡过程采用特殊的“平衡器”锁,以防止其他平衡活动发生。在config
数据库中,使用以下命令查看“balancer”锁。
db.locks.find( { _id : "balancer" } )
版本3.4中的更改:从 3.4 开始,CSRS 配置服务器的主服务器使用名为“ConfigServer”的进程 ID 持有“平衡器”锁。这个锁永远不会被释放。要确定平衡器是否正在运行,请参阅 检查平衡器是否正在运行。
存储节点看门狗
笔记
存储节点看门狗监视以下 MongoDB 目录以检测文件系统无响应:
- 目录
--dbpath
_ - 目录
journal
里面的目录--dbpath
--logpath
文件的目录--auditPath
文件的目录
笔记
从 MongoDB 6.1 开始,日志记录始终处于启用状态。因此,MongoDB 删除了该
storage.journal.enabled
选项以及相应的--journal
命令--nojournal
行选项。
默认情况下,存储节点看门狗处于禁用状态。您只能在mongod
启动时通过将watchdogPeriodSeconds
参数设置为大于或等于 60 的整数来启用存储节点看门狗。但是,一旦启用,您可以暂停存储节点看门狗并在运行时重新启动。watchdogPeriodSeconds
详情请参见 参数。
如果包含受监视目录的任何文件系统变得无响应,则存储节点看门狗将终止 mongod
并以状态代码 61 退出。如果 是 mongod
副本集的主成员,则终止将启动故障转移,允许另一个成员成为主成员。
一旦 amongod
终止,可能无法在同一台计算机上干净地重新启动它。
笔记
符号链接
如果其监视的任何目录是到其他卷的符号链接,则存储节点看门狗不会监视符号链接目标。
例如,如果
mongod
使用storage.directoryPerDB: true
(或--directoryperdb
) 并将数据库目录符号链接到另一个卷,则存储节点看门狗不会遵循符号链接来监视目标。
存储节点看门狗检测无响应的文件系统并终止所需的最长时间几乎是值的两倍watchdogPeriodSeconds
。
参见