解决因磁盘空间耗尽导致的锁定或无法写入问题

MongoDB实例的磁盘空间被耗尽后,实例的状态将转变为锁定中,处于该状态的实例将无法写入或删除数据。本文将介绍如何排查因磁盘空间耗尽导致的无法写入问题。

故障表现

  • 部署的应用程序突然无法将数据写入数据库,但是可以正常读取数据。

  • 管理人员通过Mongo Shell连接数据库进行排查时,测试写入一条数据,返回错误信息:not authorized on xxxx to execute command,例如:

    db.customer.insert({"name":"zhangsan"})
    WriteCommandError({
            "operationTime" : Timestamp(1563437183, 1),
            "ok" : 0,
            "errmsg" : "not authorized on db1 to execute command { insert: \"customer\", ordered: true, lsid: { id: UUID(\"8d43461c-5c51-49ef-b9b3-9xxxxxxxxf\") }, $clusterTime: { clusterTime: Timestamp(1563437183, 1), signature: { hash: BinData(0, 0C3FAAE747xxxxxx), keyId: 668293399xxxxxx } }, $db: \"db1\" }",
            "code" : 13,
            "codeName" : "Unauthorized",
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1563437183, 1),
                    "signature" : {
                            "hash" : BinData(0,"DD+q50dPTuIQKTzytT5SiTPYX4Q="),
                            "keyId" : NumberLong("66xxxxxxxx")
                    }
            }
    })
  • 管理人员通过MongoDB控制台,查看到实例的状态处于锁定中

    说明

    由于分片集群架构的特殊性,当分片集群实例磁盘空间被占满后,实例不会显示为锁定中

检查磁盘空间是否被耗尽

  1. 登录MongoDB管理控制台
  2. 在页面左上角,选择实例所在的资源组和地域。
  3. 根据实例类型,在左侧导航栏单击副本集实例列表分片集群实例列表
  4. 找到目标实例,单击实例ID。
  5. 根据实例类型,选择下述步骤进行操作。

    说明

    磁盘空间使用率的数据采集粒度为5分钟。

    • 单节点或副本集实例

      基本信息页面,确认实例状态及磁盘空间的使用率信息。本案例中,实例状态为锁定中,同时查看到实例的磁盘空间使用率超过了100%,由此可判断磁盘空间被耗尽。

      查看磁盘空间使用率

    • 分片集群实例

      1. 单击左侧导航栏的监控信息

      2. 监控信息页面顶部,筛选所需查看的Shard节点。选择Shard节点

        说明

        d开头的节点IDShard节点,以s开头的节点IDMongos节点。

      3. 查看磁盘空间使用率。本案例中,查看到Shard节点的磁盘空间的使用率超过了100%,由此可判断磁盘空间被耗尽。查看磁盘空间使用率

解决方法

优化建议

如果您的实例使用db.collection.remove命令删除了大量数据或没有整理过碎片,您可以回收磁盘碎片以提升磁盘利用率