文档数据库服务 DDS-磁盘使用率高问题排查:解决方案
解决方案
- 对于集群实例,可能是因为选择和设置的分片不合理导致数据分布不均衡,从而引起磁盘空间使用率高的情况。
此时,可以对数据库集合进行合适的分片,具体操作请参见设置数据分片以充分利用分片性能。
- 随着业务数据的增加,原来申请的数据库磁盘容量不足。此时建议扩容磁盘空间,确保磁盘空间足够。
- 集群实例,请参见扩容集群实例的磁盘空间。
- 副本集实例,请参见扩容副本集实例的磁盘空间。
- 单节点实例,请参见扩容单节点实例的磁盘空间。
如果原有实例规格的磁盘已是最大的,请先升级规格。
- 集群实例,请参见变更集群实例的CPU和内存规格。
- 副本集实例,请参见变更副本集实例的CPU和内存规格。
- 单节点实例,请参见变更单节点实例的CPU和内存规格。
- 存在大量过期的数据文件占用磁盘空间,此时需要及时处理过期数据文件。例如:如果整个库不需要了,则可以执行dropDatabase命令进行删除,从而快速释放磁盘空间。
- 后台数据处理机制原因。
无论写入、更新或删除(包括索引插入和删除)等操作,在后台实际上都会转成写入。实例在使用过程中,删除数据并不会回收磁盘空间,这些未被回收的磁盘空间被称为磁盘碎片。磁盘碎片会被数据库继续使用,当有新数据插入时,会重复利用这些碎片,而不需要新申请磁盘空间。根据底层存储引擎的不同(RocksDB和WiredTiger),又会有不同的具体表现。
RocksDB在删除数据后,将删除操作直接转化为追加写,在积攒了一定数据量的冗余数据后,会自动触发后台compact线程对同一数据的多版本进行归并聚合,从而释放多余的磁盘空间,因此建议等待系统自动回收。当磁盘空间使用率较高,接近只读状态阈值时,请联系华为工程师处理。
WiredTiger在删除数据,进行数据多版本归并聚合后,也会空余出磁盘空间碎片,但wiredTiger并不会将这部分磁盘空间返还给操作系统,而是打上标记预留给当前collection后续的写入,此collection后续的写入会优先使用这部分预留的磁盘空间,如果需要释放这部分磁盘空间,可以尝试通过执行compact命令进行释放(注:此命令会阻塞正常业务,因此默认情况下是禁用状态)。