MongoDB日常巡检命令总结

MongoDB日常巡检命令总结

查看系统日常运行状态

> rs.slaveOk()                  		// 允许从库可以进行查询操作,新版本命令更新为rs.secondaryOk()
> db.serverStatus()             		// 获取服务器的状态
> db.stats()                    		// 获取当前数据库的信息
> db.stats(1048576)             		// 返回MB单位
> db.stats(1073741824)          		// 返回GB单位
> db.集合名称.stats()           		        // 获取collection具体集合的信息
> db.集合名称.stats(1048576)    		        // 返回MB单位
> db.集合名称.stats(1073741824) 		        // 返回GB单位
> db.currentOp()                		// 获取当前正在执行的操作
> rs.status()
> rs.printReplicationInfo()
> sh.status()                   		// sh的命令需通过mongos来查看
> sh.status({"verbose":1})      		// 详细输出,会刷屏


- db.serverStatus()重点关注项:
...
...

// 查看当前连接数
rsB:PRIMARY> db.serverStatus().connections
{ "current" : 54, "available" : 81866, "totalCreated" : 561, "active" : 2 }
...
...
// asserts展示了服务器和客户端抛出异常或警告的数目。断言过多意味着系统存在一些问题
        "asserts" : {
                "regular" : 0,
                "warning" : 0,
                "msg" : 0,
                "user" : 27014,
                "rollovers" : 0
        },
...
...
// opcounters展示服务器上已经执行的每种操作的数目。可以看到更新/查询/插入等大致的比例
                "opcounters" : {
                "insert" : NumberLong(11660322),
                "query" : NumberLong(80420411),
                "update" : NumberLong(49059748),
                "delete" : NumberLong(110001),
                "getmore" : NumberLong(54813),
                "command" : NumberLong(187889461)
        },

- 查看方式:db.serverStatus().key
mongos> Object.keys(db.serverStatus())      	// 查看有哪些具体keys
[
        "host",
        "version",
        "process",
        "pid",
        "uptime",
        "uptimeMillis",
        "uptimeEstimate",
        "localTime",
        "asserts",
        "connections",
        "extra_info",
        "logicalSessionRecordCache",
        "network",
        "opcounters",
        "sharding",
        "shardingStatistics",
        "tcmalloc",
        "trafficRecording",
        "transactions",
        "transportSecurity",
        "mem",
        "metrics",
        "ok",
        "operationTime",
        "$clusterTime"
]

查看集合和索引状态

    > db.集合名称.find({条件}).count()       // 统计数目
    > db.集合名称.getIndexes()               // 查看已存在索引,会自动按照pretty()排列

查看副本集同步状态

> use local
> db.getReplicationInfo()
> rs.printReplicationInfo()

- oplog默认大小为990MB,如果小于12小时,则需要调大oplog,使用如下命令进行调整:

Step #1: > db.adminCommand({replSetResizeOplog: 1, size: 2048})
Step #2: 同步修改对应机器的mongod.conf配置文件

$ vi ../conf/mongod.conf

replication:
   oplogSizeMB: 2048	

查看副本集同步状态

> use local
> db.getReplicationInfo()
> rs.printReplicationInfo()

- oplog默认大小为990MB,如果小于12小时,则需要调大oplog,使用如下命令进行调整:

Step #1: > db.adminCommand({replSetResizeOplog: 1, size: 2048})
Step #2: 同步修改对应机器的mongod.conf配置文件

$ vi ../conf/mongod.conf

replication:
   oplogSizeMB: 2048	

查看分片状态

> use 数据库名称
> sh.status()                           // 查看sharding信息
> db.数据库.getShardDistribution()      // 查看数据库在所有分片上的分布情况及是否均衡

查看Balance状态

> sh.getBalancerState()     // 查看balance是否启用
> sh.isBalancerRunning()    // 查看balancer是否正在运行,返回true表示正在迁移数据
> sh.getBalancerWindow()    // 查看balance窗口,如果未设置则显示null

- 建议将负载均衡器的执行时间设置为业务低峰期,以免影响业务高峰期的性能。例如,可以设置为“23:00-04:00”。
- 另外注意:尽量避开在备份期间执行balance,否则会造成数据不一致
> db.settings.update({ _id :"balancer" }, { $set : { activeWindow : { start :"23:00", stop :"04:00" } } }, true )

查看系统运行性能

MongoDB 提供了两个内置的性能监控工具,分别是 mongostat 和 mongotop。这两个工具可以帮助实时监控 MongoDB 实例的性能和状态。

- mongostat 提供了对 MongoDB 实例的系统状态的实时监控,包括了各种性能指标。以下是 mongostat 的示例,表示每 10 秒刷新一次 MongoDB 实例中每个集合的读写操作情况。

- 重点关注dirty和used值,当dirty>20% 或者 used>95%,表示性能有问题;

> mongostat --port port --authenticationDatabase admin -u用户 -p密码 10 --discover      

host            insert query update delete getmore command dirty  used flushes mapped vsize   res faults qrw  arw net_in net_out conn set  repl         time
localhost:port     86   571     93     *0       2    42|0                   0     0B  1.08G   437M     0 0|0  0|0   406k  38.5m   332      RTR    Dec  8 11:21:08.175                                                                                      
db01:port          34   454   1063     *0     204   512|0  4.9% 80.0%       0         23.7G  17.0G   n/a 0|0  1|0  1.49m  57.9m    70 rsA  PRI    Dec  8 11:20:58.207                                                                                      
db01:port          *1    *0   *350     *0       9     6|0  1.7% 79.9%       1         25.1G  19.2G   n/a 0|0  1|0  6.85k  55.5k    79 rsC  SEC    Dec  8 11:20:58.333                                                                                      
db02:port         *36    *0   *472     *0     196   236|0  5.0% 79.9%       0         24.6G  16.7G   n/a 0|0  1|0   292k   607k    51 rsA  SEC    Dec  8 11:20:58.228                                                                                      
db02:port           1  1387   1028     *0     243   317|0  1.1% 79.9%       1         28.6G  23.0G   n/a 0|0  1|0  2.25m  60.0m   125 rsC  PRI    Dec  8 11:20:58.354                                                                                      
db03:port         *35    *0   *468     *0       6     5|0  4.4% 79.4%       0         24.6G  18.9G   n/a 0|0  1|0  4.90k  53.6k    51 rsA  SEC    Dec  8 11:20:58.249                                                                                      
db03:port          *1    *0   *346     *0       2     4|0  5.0% 79.7%       0         25.9G  18.1G   n/a 0|0  1|0  1.93k  52.0k    70 rsC  SEC    Dec  8 11:20:58.373                                                                                      
db04:port        *254    *0   *336     *0       1     4|0  5.1% 79.3%       0         23.5G  17.2G   n/a 0|0  1|0  1.53k  42.7k    44 rsB  SEC    Dec  8 11:20:58.271                                                                                      
db05:port         254   382   1019     *0     111   287|0  4.8% 80.0%       0         21.5G  17.1G   n/a 0|0  1|0  1.52m  52.6m    63 rsB  PRI    Dec  8 11:20:58.293                                                                                      
db06:port        *254    *0   *330     *0     107   138|0  5.0% 79.9%       0         24.1G  16.2G   n/a 0|0  1|0   167k   878k    45 rsB  SEC    Dec  8 11:20:58.315                                                                                      

说明:

column1	说明
insert	一秒内的插入数,如果是slave,数值前往往有一个*
query	一秒内的查询数,如果是slave,数值前往往有一个*
update	一秒内的更新数,如果是slave,数值前往往有一个*
delete	一秒内的删除数,如果是slave,数值前往往有一个*
getmore	查询时游标(cursor)的getmore操作,指标用处不大
command	一秒内执行的命令数。如果是slave,会显示两个值, local
dirty	WiredTiger存储引擎中dirty 数据占缓存百分比
used	WiredTiger存储引擎中引擎使用缓存占百分比,理想状态是让dirty和used保持差不多的比例。当used 远远大于dirty 工作集大小大于缓存大小,说明当前大批量数据写入,内存吃紧
flushes	一秒内flush的次数,一般都是0或者1,通过计算两个1之间的间隔时间,可以大致了解多长时间flush一次。flush开销是很大的,如果频繁的flush,需要分析原因
mapped/vsize/res	和top看到的一样,mapped和vsize一般不会有大的变动,res会慢慢的上升,如果res经常突然下降,去检查是否有程序占用大量内存
faults	系统压力较大的情况下,这个数值往往不为0。如果经常不为0,就需要增加内存了
qrw	queue lengths for clients waiting (read
arw	active clients (read
netIn/netOut	network traffic out - bits:网络带宽压力,一般MongoDB,网络不会成为瓶颈
conn	number of open connections:MongoDB为每一个连接创建一个线程,线程的创建和释放也是有开销的。尽量不要让这个数值很大
- mongotop 提供了对 MongoDB 实例中每个集合的读写操作的实时监控。它显示了每个集合的读写操作的数量和耗时情况。mongotop 只能连接具体 mongod 的端口,不支持 mongos
 
> mongotop --port port --authenticationDatabase admin -u用户 -p密码 10
2023-12-08T14:25:22.947+0800    connected to: mongodb://localhost:port/                                                         
                                                                                                                                 
                           ns    total    read    write    2023-12-08T14:25:32+08:00                                             
		db.collection    999ms     0ms    999ms                                                                          
		db.collection     36ms     0ms     36ms                                                                          
               local.oplog.rs     31ms    31ms      0ms                                                                          
		db.collection     31ms     0ms     31ms                                                                          
		db.collection     15ms     0ms     15ms                                                                          
		db.collection     10ms     0ms     10ms                                                                          
		db.collection      6ms     0ms      6ms                                                                          
		db.collection      2ms     0ms      2ms                                                                          
		db.collection      1ms     1ms      0ms                                                                          
		db.collection      1ms     1ms      0ms                      

查看MongoDB慢查询

建议:在生产环境MongoDB调试分析时,临时按需开启Profiling,收集足够的信息后再关闭,不建议长期开启,这样可以避免过多的性能开销。

> use admin 				
> db.getProfilingLevel()		    // 查看慢查询是否开启
> db.getProfilingStatus()

0:关闭,不收集任何数据
1:收集慢查询数据,默认是100毫秒
2:收集所有数据

- 临时开启慢查询Profile
> db.setProfilingLevel(1,2000) 		   // 启用慢查询,设置为2000毫秒,即2秒
> db.setProfilingLevel(0) 		   // 关闭慢查询profiler
> db.system.profile.find()

- 永久修改conf配置文件
...
...
profile = 1
slowms = 2000				

分析慢查询日志并优化

- 默认情况下,MongoDB 会将执行时间超过 100 毫秒的慢查询记录到 mongod.log 中。日志的位置取决于 --logpath 参数,我们可以针对 mongod.log 进行慢查询日志分析。

例子 #1:找到日志中存在扫表的操作,不包括oplog、getMore
$ tail mongod.log -n 1000000 | grep ms | grep COLLSCAN | grep -v "getMore" | grep -v "oplog.rs"

例子 #2:找到日志中所有的慢查询,不包括oplog、getMore
$ tail mongod.log -n 1000000 | grep ms | grep op_msg | grep -v "getMore" | grep -v "oplog.rs"

- 需确保nReturned、totalKeysExamined、totalDocsExamined三个保持一致,都都跟nReturned大小一样
- 如果出现:totalKeysExamined >= totalDocsExamined > nReturned的情况需要优化
- 复合索引的顺序很重要:先进行相等测试,之后再进行范围过滤

mongos> use 数据库名称
mongos> db.数据库.find({  "geometry" : { "$nearSphere" : { ...... }}).explain("executionStats")

......
"executionStats" : {
                "nReturned" : 1,                        // 返回的文档数
                "executionTimeMillis" : 1,              // 执行时间
                "totalKeysExamined" : 12,               // 索引整体扫描的文档个数,对应之前的nscanned
                "totalDocsExamined" : 2,                // 整体扫描的文档个数,对应之前的nscannedObjects
                "executionStages" : {
                        "stage" : "SINGLE_SHARD",       // 结合下面的Stage,详见下面列表


Stage	描述
COLLSCAN	全表扫描
IXSCAN	索引扫描
FETCH	根据索引去检索指定document
SHARD_MERGE	各个分片返回数据进行merge
SORT	表明在内存中进行了排序(与前期版本的scanAndOrder:true一致)
SORT_MERGE	表明在内存中进行了排序后再合并
LIMIT	使用limit限制返回数
SKIP	使用skip进行跳过
IDHACK	针对_id进行查询
SHARDING_FILTER	通过mongos对分片数据进行查询
COUNT	利用db.coll.count()之类进行count运算
COUNTSCAN	count不使用用Index进行count时的stage返回
COUNT_SCAN	count使用了Index进行count时的stage返回
SUBPLA	未使用到索引的$or查询的stage返回
TEXT	使用全文索引进行查询时候的stage返回

转自:
https://www.modb.pro/db/1732956943240208384

posted @ 2024-12-27 11:27  数据库小白(专注)  阅读(14)  评论(0编辑  收藏  举报