当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控制台,查看到实例的状态处于锁定中。
说明由于分片集群架构的特殊性,当分片集群实例磁盘空间被占满后,实例不会显示为锁定中。
检查磁盘空间是否被耗尽
- 登录MongoDB管理控制台。
- 在页面左上角,选择实例所在的资源组和地域。
- 根据实例类型,在左侧导航栏单击副本集实例列表或分片集群实例列表。
- 找到目标实例,单击实例ID。
根据实例类型,选择下述步骤进行操作。
说明磁盘空间使用率的数据采集粒度为5分钟。
单节点或副本集实例
在基本信息页面,确认实例状态及磁盘空间的使用率信息。本案例中,实例状态为锁定中,同时查看到实例的磁盘空间使用率超过了100%,由此可判断磁盘空间被耗尽。
分片集群实例
单击左侧导航栏的监控信息。
在监控信息页面顶部,筛选所需查看的Shard节点。
说明以
d
开头的节点ID为Shard节点,以s
开头的节点ID为Mongos节点。查看磁盘空间使用率。本案例中,查看到Shard节点的磁盘空间的使用率超过了100%,由此可判断磁盘空间被耗尽。
解决方法
通过变更配置方案概览来提升实例的磁盘空间。
说明不同的实例规格对应的最大磁盘空间有所不同,详情请参见实例规格概述。
副本集实例的最高规格中,可配置的最大磁盘空间为3,000GB。如果您的业务预期会超过此限制,建议使用分片集群实例,通过扩展Shard节点的方式横向扩展磁盘空间,最高可扩展至96,000GB。
说明源实例的数据可通过DTS迁移至新的分片集群实例,详情请参见从MongoDB副本集实例迁移至分片集群实例。
优化建议
如果您的实例使用db.collection.remove
命令删除了大量数据或没有整理过碎片,您可以回收磁盘碎片以提升磁盘利用率。