本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
亚马逊 DocumentDB 中的垃圾收集
Amazon DocumentDB 实现了多版本并发控制 (MVCC) 数据库架构,该架构可为每次更新操作创建新版本的文档和索引条目。这种架构允许读取查询使用版本化文档而无需锁定,从而提供读取隔离。
了解 Amazon DocumentDB 中的垃圾收集
垃圾收集 (GC) 是一个自动后台进程,可在 Amazon DocumentDB 中保持最佳的系统性能和可用性。与覆盖现有数据的传统数据库不同,Amazon DocumentDB 的 MVCC 架构每次更新操作都会创建新版本的文档和索引条目。生成新文档版本的每个写入操作都会消耗有限计数器中的唯一 MVCC ID,因此高效的清理至关重要。随着时间的推移,这些旧版本会不断积累,必须对其进行清理以防止性能下降。
垃圾收集的功能
垃圾收集器有三个基本功能:
回收存储空间 — 它会删除活动查询不再需要的过时文档和索引版本,从而为将来的写入操作腾出空间。
防止 MVCC ID 溢出 — 它通过管理 MVCC 的有限计数器来防止 MVCC ID 溢出。 IDs如果没有这种管理,计数器最终将达到其极限,从而迫使数据库进入临时的只读模式,直到 IDs 被回收为止。
保持查询性能-它通过消除失效的文档版本来保持最佳的查询性能,否则这些版本会累积并减慢查询处理速度。
垃圾收集流程
GC 进程对每个集合进行操作,并且可以在不同的集合上同时运行多个进程。该过程由四个连续阶段组成:
识别-系统识别活动事务或查询不再引用的文档和索引版本。
内存加载-如果旧文档和索引条目尚不存在,则会加载到内存中。
删除-永久删除过时的版本以回收存储空间。
MVCC ID 回收 — 系统 IDs 从已删除的版本中回收 MVCC 以进行新操作。
当垃圾收集完成对旧文档版本的处理后,它会 IDs 从系统中删除最旧的 MVCC。这种清理对于通过回收 MVCC 来防止 MVCC ID 溢出至关重要 IDs,使它们可用于集群中的新写入操作。如果没有这种回收过程,系统最终将耗尽其有限的 MVCC ID 计数器并进入只读状态。
垃圾收集计划
垃圾收集会定期在后台自动运行。定时和频率会根据系统负载、可用资源、写入量和 MVCC ID 消耗水平进行动态调整。在高写入活动期间,GC 进程的执行频率会更高,以管理不断增加的文档版本。
监控垃圾收集
集群级别指标
AvailableMVCCIds
地点-亚马逊 CloudWatch
描述-一个计数器,显示在达到零之前剩余的可用写入操作数。当此计数器达到零时,您的集群将进入只读模式,直到 IDs 被回收和回收。计数器会随着每次写入操作而减少,并随着垃圾收集回收旧的 M IDs VCC 而增加。
建议-当价值跌至13亿以下时设置警报。此预警允许您采取稍后讨论的建议步骤。
LongestRunningGCProcess
地点-亚马逊 CloudWatch
描述-最长活动垃圾收集过程的持续时间(以秒为单位)。每分钟更新一次,仅跟踪活动操作,不包括在一分钟窗口内完成的进程。
建议 —
集合级别指标
MVCCIDStats: MvccIdAgeScale
位置-数据库 collStats 命令
描述 — 以 0 到 1 的等级衡量 MVCC ID 年龄,其中 1 表示集群进入只读状态之前的最大年龄。同时使用此指标
AvailableMVCCIds
来识别包含使集群老化的最旧 MVCC IDs 的集合。建议-将每个集合的值保持在 0.3 以下。
GCRuntimeStats
位置-数据库 collStats 命令
描述-提供两个月的垃圾收集指标历史记录,包括总运行次数、平均持续时间和最长持续时间。仅包括持续时间超过五分钟的垃圾收集操作,以确保有意义的统计数据。
UnusedStorageSize
(集合级别)
位置-数据库 collStats 命令
描述-根据抽样统计数据估算集合中未使用的存储空间。它包括已删除文档和空白段落的空间。
索引级别指标
UnusedStorageSize
(索引级别)
位置-数据库 IndexStats 命令
描述-根据采样统计数据估算索引中未使用的存储空间。它包括过时的索引条目和空段的空间。
建议-使用
reIndex
命令在不停机的情况下重建索引并回收未使用的空间。有关更多详细信息,请参阅管理索引。
collStats
输出示例
{
"ns": "xid_consumption_test_db.xid_test_collection",
"MVCCIdStats": {
"MVCCIdScale": 0.03
},
"gcRuntimeStats": {
"numRuns": 1,
"historicalAvgRuntime": 3295,
"historicalMaxRuntime": 3295,
"lastRuntime": 3295,
"lastRuntimeStart": ISODate("2025-06-24T08:47:14Z")
},
"collScans": 14,
"count": 30000000,
"size": 1320000000,
"avgObjSize": 44,
"storageSize": 6461497344,
"capped": false,
"nindexes": 2,
"totalIndexSize": 9649553408,
"indexSizes": {
"_id_": 1910661120,
"c_1": 7738892288
},
"unusedStorageSize": {
"unusedBytes": 4201881600,
"unusedPercent": 65.05
},
"cacheStats": {
"collBlksHit": 171659016,
"collBlksRead": 754061,
"collHitRatio": 99.5627,
"idxBlksHit": 692563636,
"idxBlksRead": 1177921,
"idxHitRatio": 99.8303
},
"idxScans": 41823984,
"opCounter": {
"numDocsIns": 0,
"numDocsUpd": 20911992,
"numDocsDel": 0
},
"lastReset": "2025-06-24 05:57:08.219711+00",
"ok": 1,
"operationTime": Timestamp(1750968826, 1)
}
常见问题
主题
如何识别垃圾收集是否效率不高?
监视这些表明垃圾收集效率低下的警告信号:
集合过度膨胀 — 在大量写入或批量删除期间,
UnusedStorageSize
指标会稳步增加,尤其是在索引较大的情况下查询延迟降低 — 由于累积的失效文档导致查询延迟增加
GC 持续时间延长 — 垃圾收集操作花费的时间比历史平均值长
GCRuntimeStats
GC 处理能力提高 — 高
LongestRunningGCProcess
表示垃圾收集器无法满足系统需求
垃圾收集会影响我的数据库性能吗?
在正常情况下,垃圾收集对性能的影响微乎其微。但是,当垃圾收集落后时,你可能会遇到:
积累的失效文档导致存储成本增加。
由于索引条目过时,查询性能降低。
如果 MVCC 已耗尽,则 IDs 为临时只读模式。
在密集收集运行期间,资源使用量更高,尤其是在较小的实例上。
我可以手动触发垃圾回收吗?
不可以,无法手动触发亚马逊文档数据库中的垃圾回收。作为内部维护操作的一部分,系统会自动管理垃圾收集。
作为操作最佳实践,我应该设置哪些警报?
我们建议在集群和馆藏级别设置监控,以确保您的 Amazon DocumentDB 系统获得最佳性能。
用于集群级监控
首先为阈值为 13 亿的AvailableMVCCId
指标创建 CloudWatch 警报。这使您有足够的时间在指标达到零之前采取行动,届时您的集群将进入只读模式。请记住,此指标可能会根据您的特定使用模式而波动。一些客户认为它降至13亿以下,然后随着垃圾收集工作的完成,恢复到15亿以上。
通过监控LongestRunningGCProcess
指标也很重要 CloudWatch。此指标以及可GCRuntimeStats
帮助您了解整个系统中垃圾回收的执行效率。
用于馆藏级监控
重点关注两个关键指标。首先,我们建议您查看每个集合的MvccIdAgeScale
价值。值的增加表明 MVCC IDs 正在老化,可能需要注意。其次,监控GCRuntimeStats
以识别任何耗时异常长或持续多天的垃圾收集过程。需要特别注意具有频繁写入操作的集合,因为它们会为垃圾收集器生成更多工作。我们建议更频繁地检查写入活动繁重的集合的这些指标,以确保垃圾收集跟上您的工作负载。
请注意,这些监控建议仅作为起点。随着您对系统的行为越来越熟悉,您可能需要调整这些阈值,以更好地匹配您的特定使用模式和要求。
如果我的收入AvailableMVCCId
跌至13亿以下,我该怎么办?
如果您的AvailableMVCCId
指标降至13亿以下,我们建议您立即采取措施以防止您的集群进入只读模式。我们建议先扩大实例大小,为垃圾收集器提供更多计算资源。这使您的应用程序能够继续正常运行,同时为垃圾收集器提供 catch 所需的额外功能。
如果仅靠向上扩展并不能改善这种情况,我们建议您考虑减少写入操作。使用该MvccIdAgeScale
指标来确定哪些特定集合包含需要注意的较旧 MVCC IDs 。识别出这些集合后,可能需要暂时减少对它们的写入操作,以允许垃圾回收赶上。在恢复期间,我们建议您密切监视该AvailableMVCCId
指标,以确保您的操作达到预期的效果。一旦AvailableMVCCId
值恢复到 15 亿或更高,您的集群就会被视为运行状况良好。
请记住,这些步骤是预防措施,可帮助您的系统在达到临界状态之前恢复。在看到该指标降至13亿以下后,您越早采取行动,就越有可能避免对写入操作造成任何影响。