當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
命令刪除了大量數據或沒有整理過碎片,您可以回收磁盤碎片以提升磁盤利用率。