0
点赞
收藏
分享

微信扫一扫

mongoDB 4.2: 探索数据库分析器的强大功能,实现先进的监控和优化

kiliwalk 2023-04-18 阅读 60

如果您有一个现有的MongoDB数据库,您可以学习如何将其迁移到Atlas以获取Performance Advisor和其他仅限Atlas的功能。

数据库探查器收集有关正在运行的mongod实例执行的数据库命令的详细信息。 这包括CRUD操作以及配置和管理命令。 分析器将收集的所有数据写入system.profile集合,即admin数据库中的上限集合 。 有关概要分析器创建的system.profile文档的概述,请参见Database Profiler输出 。

默认情况下,profiler处于off 。 您可以在每个数据库或每个实例的基础上,在多个分析级别之一启用profiler。

本文档概述了数据库分析器的许多关键管理选项。 有关其他相关信息,请考虑以下资源:

a.Database Profiler输出
b.Profile命令
c.db.currentOp()

1.Profiling Levels

可以使用以下分析级别:

mongoDB 4.2: 探索数据库分析器的强大功能,实现先进的监控和优化_数据

2.启用数据库的Profiling

您可以为mongod实例启用数据库分析。

本节使用mongo shell helper db.setProfilingLevel()帮助程序来启用分析。

为mongod实例启用分析时,将分析级别设置为大于0的值。分析器将记录system.profile集合中的数据。 在为该数据库启用分析后,MongoDB会在数据库中创建system.profile集合。

要启用性能分析并设置性能分析级别,请将性能分析级别传递给db.setProfilingLevel()帮助程序。 例如,要为所有数据库操作启用分析,请考虑mongo shell中的以下操作:

db.setProfilingLevel(2)

shell返回一个显示上一级分析的文档。 "ok" : 1键值对表示操作成功:

{ "was" : 0, "slowms" : 100, "sampleRate" : 1.0, "ok" : 1 }

要验证新设置,请参阅检查性能分析级别部分。

(1).设置慢查询操作的阈值

默认情况下,慢速操作阈值为100毫秒。 要更改慢速操作阈值,请使用以下方法之一指定所需的阈值:

a.使用profile命令或db.setProfilingLevel() shell帮助程序方法设置slowms的值。
b.在启动时从命令行设置--slowms的值。
c.在配置文件中设置slowOpThresholdMs的值。

例如,以下代码将当前mongod实例的分析级别设置为1 ,并将mongod实例的慢速操作阈值设置为20毫秒:

db.setProfilingLevel(1, { slowms: 20 })

分析级别1将分析操作慢于阈值。

重要:慢操作阈值适用于mongod实例中的所有数据库。它由数据库事件探查器和诊断日志使用,应设置为最高有用值以避免性能下降。

从MongoDB 4.0开始,您可以使用db.setProfilingLevel()为mongos配置slowms和sampleRate 。 对于mongos , slowms和sampleRate配置设置仅影响诊断日志,而不影响分析器,因为mongos上没有分析。

例如,以下设置mongos实例的慢速操作阈值,用于记录慢速操作:

db.setProfilingLevel(0, { slowms: 20 })

从MongoDB 4.2开始,用于读/写操作的探查器条目和诊断日志消息(即mongod / mongos日志消息)包括:

a.queryHash有助于识别具有相同查询形状的慢查询。
b.planCacheKey为慢查询提供更深入的查询计划缓存。

从版本4.2开始(也可从4.0.6开始),副本集的辅助成员现在记录需要比慢速操作阈值更长的oplog条目 。 在REPL组件下的diagnostic log为辅助节点记录这些慢速oplog消息,其中applied op: <oplog entry> took <num>ms了文本applied op: <oplog entry> took <num>ms 。 这些缓慢的oplog条目仅取决于慢速操作阈值。 它们不依赖于日志级别(系统级别或组件级别),分析级别或慢速操作采样率。 探查器不捕获慢速oplog条目。

(2).描述慢速操作的随机样本

版本3.6中的新功能。

要仅分析所有慢速操作的随机采样子集,请通过以下方式之一指定所需的采样率:

a.使用profile命令或db.setProfilingLevel() shell辅助方法设置sampleRate的值。
b.在启动时--slowOpSampleRate为mongod设置--slowOpSampleRate的值或为mongos设置--slowOpSampleRate的值。
c.在配置文件中设置slowOpSampleRate的值。

默认情况下, sampleRate设置为1.0 ,表示所有慢速操作都已分析。 当sampleRate设置在0和1之间时,具有分析级别1数据库将仅根据sampleRate分析随机采样的慢速操作百分比。

例如,以下方法将mongod的分析级别设置为1 ,并将分析器设置为对所有慢速操作的42%进行采样:

db.setProfilingLevel(1, { sampleRate: 0.42 })

修改后的采样率值也适用于系统日志。

从MongoDB 4.0开始,您可以使用db.setProfilingLevel()为mongos配置slowms和sampleRate 。 对于mongos , slowms和sampleRate配置设置仅影响诊断日志,而不影响分析器,因为mongos上没有分析。

例如,以下设置mongos实例的记录慢速操作的采样率:

db.setProfilingLevel(0, { sampleRate: 0.42 })

重要:当logLevel设置为0 ,MongoDB以slowOpSampleRate确定的速率记录诊断日志的慢速操作。 从MongoDB 4.2开始,副本集的副本记录所有需要长于慢操作阈值的oplog条目消息,无论采样率如何都应用 。

在较高的logLevel设置下,所有操作都显示在诊断日志中,而不考虑其延迟,但存在以下异常: 辅助节点记录慢速oplog条目消息 。 辅助节点仅记录慢速oplog条目; 增加logLevel不会记录所有oplog条目。

(3).检查分析级别

要查看分析级别 ,请从mongo shell发出以下命令:

db.getProfilingStatus()

mongoDB 4.2: 探索数据库分析器的强大功能,实现先进的监控和优化_数据库_02

shell返回类似于以下内容的文档:

was字段表示当前的分析级别。

slowms字段指示操作时间阈值(以毫秒为单位),超过该阈值操作被认为是慢的 。

sampleRate字段指示应分析的慢速操作的百分比。

要仅返回分析级别,请在mongo shell中使用db.getProfilingLevel()帮助程序,如下所示:

db.getProfilingLevel()

mongoDB 4.2: 探索数据库分析器的强大功能,实现先进的监控和优化_数据_03

(4).禁用Profiling

要禁用Profiling,请在mongo shell中使用以下帮助程序:

db.setProfilingLevel(0)

(5).为整个mongod实例启用Profiling

为了在测试环境中进行开发,可以为整个mongod实例启用数据库分析。 分析级别适用于mongod实例提供的所有数据库。

要为mongod实例启用分析,请在启动时将以下选项传递给mongod 。

mongod --profile 1 --slowms 15 --slowOpSampleRate 0.5

或者,您可以在配置文件中指定operationProfiling

这将分析级别设置为1 ,将慢速操作定义为持续时间超过15毫秒的操作,并指定仅应分析50%的慢速操作。  

当logLevel设置为0时, slowms和slowOpSampleRate也会影响将哪些操作记录到诊断日志中。 slowms和slowOpSampleRate也可用于配置mongos诊断日志记录。  

另参见:mode, slowOpThresholdMs, and slowOpSampleRate.  

(6).数据库Profiling 和 Sharding

您无法在mongos实例上启用分析。 要在分片群集中启用分析,必须为群集中的每个mongod实例启用分析。

但是,从MongoDB 4.0开始,您可以在mongos上设置--slowms和slowOpSampleRate ,以便为慢速操作配置诊断日志。

3.查看Profiler数据

数据库分析器记录的数据库操作信息都在system.profile集合中。

要查看分析信息,请查询system.profile集合。 要查看示例查询,请参阅示例Profiler数据查询 。 有关输出数据的说明,请参见Database Profiler输出 。

小技巧:您可以使用$comment将数据添加到查询谓词,以便更轻松地分析来自探查器的数据$comment运算符的格式为:

db.collection.find( { <query>, $comment: <comment> } )

例子:

db.bar.find( { content:'aaa15', $comment: 'this is demo' } )

(1).示例Profiler数据查询

本节显示system.profile集合的示例查询。 有关查询输出的说明,请参阅Database Profiler输出 。

要返回system.profile集合中最新的10个日志条目,请运行类似于以下内容的查询:

db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty()

要返回除命令操作( $ cmd )以外的所有操作,请运行类似于以下内容的查询:

db.system.profile.find( { op: { $ne : 'command' } } ).pretty()

要返回特定集合的操作,请运行类似于以下内容的查询。 此示例返回mydb数据库的test集合中的操作:

db.system.profile.find( { ns : 'mydb.test' } ).pretty()

要返回大于5毫秒的操作,请运行类似于以下内容的查询:

db.system.profile.find( { millis : { $gt : 5 } } ).pretty()

要从特定时间范围返回信息,请运行类似于以下内容的查询:

db.system.profile.find({
  ts : {
    $gt: new ISODate("2012-12-09T03:00:00Z"),
    $lt: new ISODate("2012-12-09T03:40:00Z")
  }
}).pretty()

以下示例查看时间范围,从输出中抑制user字段以使其更易于阅读,并根据每个操作运行的时间对结果进行排序:

db.system.profile.find({
  ts : {
    $gt: new ISODate("2011-07-12T03:00:00Z"),
    $lt: new ISODate("2011-07-12T03:40:00Z")
  }
}, { user: 0 }).sort( { millis: -1 } )

(2).显示五个最新事件

在启用了性能分析的数据库上, mongo shell中的show profile helper显示最近执行至少1毫秒的5个操作。 问题show profile来自mongo shell的show profile ,如下所示:

show profile

4.Profiler开销

启用后,分析对性能的影响很小。 system.profile集合是一个上限集合 ,默认大小为1M字节。 此大小的集合通常可以存储数千个配置文件,但是某些应用程序可能会在每个操作中使用更多或更少的配置文件数据。

(1).更改Primary上system.profile集合的大小,要更改system.profile集合的大小,您必须:

a.禁用分析。
b.删除system.profile集合。
c.创建一个新的system.profile集合。
d.重新启用分析。

例如,要创建一个4000000字节的新system.profile集合,请在mongo shell中使用以下操作序列:

db.setProfilingLevel(0)
db.system.profile.drop()
db.createCollection( "system.profile", { capped: true, size:4000000 } )
db.setProfilingLevel(1)

(2).更改Secondary上system.profile集合的大小

要更改辅助服务器上system.profile集合的大小,必须停止辅助服务器,将其作为独立服务器运行,然后执行上述步骤。 完成后,重新启动独立作为副本集的成员。 有关更多信息,请参阅对副本集成员执行维护 。

5.Database Profiler 输出

database profiler捕获有关读写操作,游标操作和数据库命令的数据信息。 要配置数据库配置文件并设置捕获配置文件数据的阈值,请参阅Database Profiler部分。

database profiler将数据写入system.profile集合,该集合是一个上限集合 。 要查看探查器的输出,请在system.profile集合上使用常规MongoDB查询。

注意:由于数据库探查器将数据写入数据库中的system.profile集合,因此探查器将分析一些写入活动,即使对于其他只读的数据库也是如此。

示例system.profile文档

下面介绍了system.profile集合中的一些示例文档,find操作

{
   "op" : "query",
   "ns" : "test.report",
   "command" : {
      "find" : "report",
      "filter" : { "a" : { "$lte" : 500 } },
      "lsid" : {
         "id" : UUID("5ccd5b81-b023-41f3-8959-bf99ed696ce9")
      },
      "$db" : "test"
   },
   "cursorid" : 33629063128,
   "keysExamined" : 101,
   "docsExamined" : 101,
   "fromMultiPlanner" : true,
   "numYield" : 2,
   "nreturned" : 101,
   "queryHash" : "811451DD",
   "planCacheKey" : "759981BA",
   "locks" : {
      "Global" : {
         "acquireCount" : {
            "r" : NumberLong(3),
            "w" : NumberLong(3)
         }
      },
      "Database" : {
         "acquireCount" : { "r" : NumberLong(3) },
         "acquireWaitCount" : { "r" : NumberLong(1) },
         "timeAcquiringMicros" : { "r" : NumberLong(69130694) }
      },
      "Collection" : {
         "acquireCount" : { "r" : NumberLong(3) }
      }
   },
   "storage" : {
      "data" : {
         "bytesRead" : NumberLong(14736),
         "timeReadingMicros" : NumberLong(17)
      }
   },
   "responseLength" : 1305014,
   "protocol" : "op_msg",
   "millis" : 69132,
   "planSummary" : "IXSCAN { a: 1, _id: -1 }",
   "execStats" : {
      "stage" : "FETCH",
      "nReturned" : 101,
      "executionTimeMillisEstimate" : 0,
      "works" : 101,
      "advanced" : 101,
      "needTime" : 0,
      "needYield" : 0,
      "saveState" : 3,
      "restoreState" : 2,
      "isEOF" : 0,
      "docsExamined" : 101,
      "alreadyHasObj" : 0,
      "inputStage" : {
         ...
      }
   },
   "ts" : ISODate("2019-01-14T16:57:33.450Z"),
   "client" : "127.0.0.1",
   "appName" : "MongoDB Shell",
   "allUsers" : [
      {
         "user" : "someuser",
         "db" : "admin"
      }
   ],
   "user" : "someuser@admin"
}

对于任何单个操作,数据库探查器创建的文档将包含以下字段的子集。 这些文档中字段的精确选择取决于操作类型。 从MongoDB 4.2(和4.0.9)开始,对于慢速操作, 探查器条目和诊断日志消息包括storage信息。 system.profile.op,可能的值是: 

command
count
distinct
geoNear
getMore
group
insert
mapReduce
query
remove
update

举报

相关推荐

0 条评论