阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

如何监控MongoDB数据库性能

32次阅读
没有评论

共计 3768 个字符,预计需要花费 10 分钟才能阅读完成。

导读 最近项目在使用 MongoDB 作为图片和文档的存储数据库,为啥不直接存 MySQL 里,还要搭个 MongoDB 集群,麻不麻烦?让我们一起,一探究竟,继续学习 MongoDB 数据库性能监控,实现快速入门,丰富个人简历,提高面试 level,给自己增加一点谈资,秒变面试小达人,BAT 不是梦。

如何监控 MongoDB 数据库性能

一、MongoDB 启动慢
1、启动日常卡住

根本不用为了截屏而快速操作,MongoDB 启动真的超级慢。

如何监控 MongoDB 数据库性能

如何监控 MongoDB 数据库性能

2、启动 MongoDB 配置服务器,间歇性失败

如何监控 MongoDB 数据库性能

如何监控 MongoDB 数据库性能

3、查看 MongoDB 日志,分析“MongoDB 启动慢”的原因

如何监控 MongoDB 数据库性能

4、耗时“一小时”,MongoDB 启动成功!

如何监控 MongoDB 数据库性能

二、原因分析

在 MongoDB 关闭之前,有较大的索引建立的操作没有完成,MongoDB 就直接 shutdown 了,等 MongoDB 再次启动的时候,MongoDB 默认会将这个 index 重建好,重建期间处于 startup 状态。

由于不清楚重建索引需要多久,因此可以通过重启 mongod 时加上–noIndexBuildRetry 参数来跳过索引重建。等启动完成后,再创建这个索引。

下面从几方面,监控一下 MongoDB 的性能问题。

三、MongoDB 内存使用

如何监控 MongoDB 数据库性能

  • 常驻内存:常驻内存是 MongoDB 在 RAM 中显式拥有的内存。如果查询一个集合数据,MongoDB 会将其放入常驻内存中,MongoDB 会获得其地址,这个地址不是 RAM 中数据的真实地址,而是一个虚拟地址。MongoDB 可以将它传递给内核,内核会查找出数据的真实位置。如果内核需要从内存中清理缓存,MongoDB 仍然可以通过该地址对其进行访问。MongoDB 会向内核请求内存,然后内核会查看数据缓存,如果发现数据不存在,就会产生缺页错误并将数据复制到内存中,最后再返给 MongoDB。
  • 虚拟内存:操作系统提供的一种抽象,它对软件进程隐藏了物理存储的细节。每个进程都可以看到一个连续的内存地址空间。在 Ops Manager 中,MongoDB 的虚拟内存是映射内存的两倍。
  • 映射内存:包含 MongoDB 曾经访问过的所有数据。
  • 四、MongoDB 磁盘空间

    当磁盘空间不足时,可以进行如下操作:

  • 可以添加一个分片;
  • 删除未使用的索引;
  • 可以执行压缩操作;
  • 关闭副本集成员,将其数据复制到更大的磁盘中挂载;
  • 用较大驱动器的成员替换副本集中的成员;
  • 五、常用命令
    1、MongoDB 获取系统信息
    db.hostInfo()

    如何监控 MongoDB 数据库性能

    2、MongoDB 获取系统内存情况
    db.serverStatus().mem

    如何监控 MongoDB 数据库性能

    3、MongoDB 获取连接数信息
    db.serverStatus().connections

    如何监控 MongoDB 数据库性能

    4、MongoDB 获取全局锁信息
    db.serverStatus().globalLock

    如何监控 MongoDB 数据库性能

    5、MongoDB 获取操作统计计数器
    db.serverStatus().opcounters

    如何监控 MongoDB 数据库性能

    6、MongoDB 获取数据库状态信息
    db.stats()

    如何监控 MongoDB 数据库性能

    以上是 MongoDB 的重要指标,通过这些指标我们可以了解到 MongoDB 的运行状态,评估数据库的健康程度,并快速确定实际项目中遇到的性能瓶颈。

    比如项目中遇到的 Timeout 异常:

    com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message
      at com.mongodb.connection.InternalStreamConnection.translateReadException(InternalStreamConnection.java:475)
      at com.mongodb.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:226)
      at com.mongodb.connection.UsageTrackingInternalConnection.receiveMessage(UsageTrackingInternalConnection.java:105)
      at com.mongodb.connection.DefaultConnectionPool$PooledConnection.receiveMessage(DefaultConnectionPool.java:438)
      at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:112)
      at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:168)
      at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:289)
      at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:176)
      at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:216)
      at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:207)
      at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:113)
      at com.mongodb.operation.FindOperation$1.call(FindOperation.java:488)
      at com.mongodb.operation.FindOperation$1.call(FindOperation.java:1)
      at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:241)
      at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:214)
      at com.mongodb.operation.FindOperation.execute(FindOperation.java:483)
      at com.mongodb.operation.FindOperation.execute(FindOperation.java:1)
      at 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 会在 data 目录下创建一个 journal 的子目录,WiredTiger 日志文件的名称为 WiredTigerLog.。sequence 是一个从 0 000 000 001 开始的数字。

    如何监控 MongoDB 数据库性能

    MongoDB 会对写入的日志进行压缩,日志文件限制的最大大小为 100MB。如果大于 100MB,MongoDB 就会自动创建一个新的日志文件,由于日志文件只需在上次检查点之后恢复数据,因此在新的检查点写入完成时,旧的日志文件就会被删除。

    阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

    腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

    代金券:在阿里云专用满减优惠券

    正文完
    星哥说事-微信公众号
    post-qrcode
     0
    星锅
    版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计3768字。
    转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
    【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
    阿里云-最新活动爆款每日限量供应
    评论(没有评论)
    验证码
    【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中