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