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