最近的项目都是用MongoDB作为图片和文档的存储数据库,为什么不直接存储在MySQL中,搭建一个MongoDB集群,是不是很麻烦?一起来一探究竟,继续学习MongoDB数据库性能监控,实现快速入门,丰富你的简历,提升你的面试水平,为自己加一点谈资,秒变面试高手。BAT不是梦。1.MongoDB启动慢1.如果你卡在日常启动中,你不需要快速操作来截图。MongoDB启动真的超级慢。2.启动MongoDB配置服务器,但间歇性失败。3、查看MongoDB日志,分析“MongoDBstartsslowly”的原因。4、“一小时”,MongoDB启动成功!2、原因分析MongoDB关闭前,如果有一个大的索引创建操作没有完成,MongoDB会直接关闭。当MongoDB再次启动时,MongoDB会默认重建索引,重建过程中处于启动状态。由于不清楚重建索引需要多长时间,可以在重启mongod时加入--noIndexBuildRetry参数跳过索引重建。启动完成后,创建这个索引。下面我们从几个方面来监控MongoDB的性能。3、MongoDB内存使用常驻内存:常驻内存是MongoDB在RAM中明确拥有的内存。如果查询一组数据,MongoDB会把它放在常驻内存中,MongoDB会得到它的地址,这个地址不是数据在RAM中的真实地址,而是一个虚拟地址。MongoDB可以将它传递给内核,内核会找出数据的真实位置。如果内核需要从内存中清除缓存,MongoDB仍然可以通过这个地址访问它。MongoDB会向内核申请内存,然后内核会检查数据缓存。如果发现数据不存在,就会产生一个pagefault并将数据复制到内存中,最后返回给MongoDB。虚拟内存:操作系统提供的一种抽象,它向软件进程隐藏了物理存储的细节。每个进程看到一个连续的内存地址空间。在OpsManager中,MongoDB的虚拟内存是映射内存的两倍。映射内存:包含MongoDB曾经访问过的所有数据。4、MongoDB磁盘空间当磁盘空间不足时,可以进行如下操作:可以添加分片;删除未使用的索引;您可以执行压缩操作;关闭副本集成员,将他们的数据复制到更大的磁盘挂载;用较大驱动器的成员替换副本集的成员;五、常用命令1、MongoDB获取系统信息db.hostInfo()2、MongoDB获取系统内存状态db.serverStatus().mem3、MongoDB获取连接数信息db.serverStatus().connections4、MongoDB获取全局锁信息db.serverStatus().globalLock5、MongoDB获取运行统计计数器db.serverStatus().opcounters6、MongoDB获取数据库状态信息db.stats()以上是MongoDB的重要指标,通过这些指标可以了解MongoDB的运行状态,评估数据库的健康状况,快速判断实际项目中遇到的性能瓶颈。比较项目中遇到的超时异常:com.mongodb.MongoSocketReadTimeoutException:Timeoutwhilereceivingmessageatcom.mongodb.connection.InternalStreamConnection.translateReadException(InternalStreamConnection.java:475)atcom.mongodb.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:226)在com.mongodb.connection.UsageTrackingInternalConnection.receiveMessage(UsageTrackingInternalConnection.java:105)在com.mongodb.connection.DefaultConnectionPool$PooledConnection.receiveMessage(DefaultConnectionPool.java:438)在com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:112)在com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:168)在com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:289)在com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:176)在com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:216)在com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:207)在com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper1monind1.goat:1$Operation.java:1$488)在com.mongodb.operation.FindOperation$1.call(FindOperation.java:1)在com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:241)在com.mongodb。operation.OperationHelper.withConnection(OperationHelper.java:214)在com.mongodb.operation.FindOperation.execute(FindOperation.java:483)在com.mongodb.operation.FindOperation.execute(FindOperation.java:1)在com.mongodb.Mongo.execute(Mongo.java:818)六、MongoDB持久化1、复制延迟复制延迟是指从节点跟不上主节点的速度复制延迟。延迟应尽可能接近于0,通常为毫秒级。2.备份备份操作通常是将所有数据读入内存。因此,备份操作通常应该在副本集的从节点上进行,而不是在主节点上进行。如果是单机的MongoDB,应该在深夜、清晨等时空备份。3.持久性持久性是数据库的基本特征。想象一下,如果数据库没有持久化,如果重启数据库,数据就会全部丢失。太可怕了,不敢想。为了在服务器发生故障时提供持久化,MongoDB使用了预写日志机制,英文简称为WAL。WAL是数据库系统中常用的持久化技术。这些更改在数据存储到数据库之前写入磁盘。从MongoDB4.0开始,MongoDB在执行写操作时,会创建与oplog格式相同的日志。oplog语句是幂等的,无论执行多少次,结果都是一样的。MongoDB还维护日志和数据库数据文件的内存视图。默认情况下,日志条目每50毫秒刷新一次磁盘,数据库文件每60秒刷新一次磁盘。刷新数据的60秒间隔称为检查点。日志用于为经过最后一个检查点的数据提供持久性。MongoDB的持久化是在出现故障时重启后重新执行日志中的语句,保证关机前丢失的数据重新刷新到MongoDB中。MongoDB会在数据目录下创建一个journal子目录,WiredTiger日志文件的名称为WiredTigerLog.
