本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon DocumentDB 中的垃圾回收
Amazon DocumentDB 實作多版本並行控制 (MVCC) 資料庫架構,為每個更新操作建立新的文件和索引項目版本。此架構允許讀取查詢使用版本控制的文件,而不進行鎖定,以提供讀取隔離。
了解 Amazon DocumentDB 中的垃圾回收
垃圾回收 (GC) 是一種自動化背景程序,可在 Amazon DocumentDB 中維持最佳的系統效能和可用性。與覆寫資料的傳統資料庫不同,Amazon DocumentDB 的 MVCC 架構會在每次更新操作時建立新的文件版本和索引項目。每個產生新文件版本的寫入操作都會從有限計數器耗用唯一的 MVCC ID,因此需要有效率的清除。隨著時間的推移,這些舊版本會累積並必須清除,以防止效能降低。
垃圾回收的函數
垃圾收集器提供三個基本函數:
回收儲存空間 — 它移除作用中查詢不再需要的過時文件和索引版本,為未來的寫入操作釋放空間。
防止 MVCC ID 溢位 — 透過管理 MVCC ID 的有限計數器來防止 MVCC IDs 溢位。如果沒有此管理,計數器最終會達到其限制,強制資料庫進入暫時唯讀模式,直到 IDs回收為止。
維持查詢效能 — 它透過消除會累積和減慢查詢處理速度的無效文件版本,來維持最佳的查詢效能。
垃圾回收程序
GC 程序會依集合操作,並可在不同的集合上同時執行多個程序。程序包含四個循序階段:
識別 — 系統會識別作用中交易或查詢不再參考的文件和索引版本。
記憶體載入 — 如果舊文件和索引項目不存在,則會載入記憶體。
刪除 — 永久刪除過時的版本以回收儲存空間。
MVCC ID 回收 — 系統會從已刪除的版本回收 MVCC IDs 以進行新操作。
當垃圾收集完成處理舊文件版本時,它會從系統中移除最舊的 MVCC IDs。此清除對於透過回收 MVCC ID 來防止 MVCC IDs 溢位至關重要,使其可用於整個叢集的新寫入操作。如果沒有此回收程序,系統最終會耗盡其有限的 MVCC ID 計數器,並進入唯讀狀態。
垃圾回收排程
垃圾回收會定期在背景自動執行。時間和頻率會根據系統負載、可用資源、寫入磁碟區和 MVCC ID 耗用量層級動態調整。在高寫入活動期間,GC 程序會更頻繁地執行,以管理增加的文件版本數量。
監控垃圾回收
叢集層級指標
AvailableMVCCIds
位置 — Amazon CloudWatch
描述 — 顯示達到零之前可用的剩餘寫入操作數量的計數器。當此計數器達到零時,您的叢集會進入唯讀模式IDs直到 ID 回收和回收為止。計數器會隨著每次寫入操作而減少,並隨著垃圾回收回收舊的 MVCC IDs 而增加。
建議 — 當值低於 13 億時設定警示。此提早警告可讓您採取稍後討論的建議步驟。
LongestRunningGCProcess
位置 — Amazon CloudWatch
描述 — 最長作用中垃圾收集程序的持續時間,以秒為單位。每分鐘更新一次,並僅追蹤作用中的操作,不包括在一分鐘時段內完成的程序。
建議 —
集合層級指標
MVCCIDStats: MvccIdAgeScale
位置 — 資料庫 collStats 命令
描述 — 以 0 到 1 的規模測量 MVCC ID 存留期,其中 1 表示叢集進入唯讀狀態之前的最大存留期。同時使用此指標
AvailableMVCCIds
來識別包含正在使叢集老化之最舊 MVCC IDs集合。建議 — 將每個集合的值保持在 0.3 以下。
GCRuntimeStats
位置 — 資料庫 collStats 命令
描述 — 提供垃圾收集指標的兩個月歷史記錄,包括總執行次數、平均持續時間和最長持續時間。僅包含持續超過五分鐘的垃圾回收操作,以確保有意義的統計資料。
UnusedStorageSize
(集合層級)
位置 — 資料庫 collStats 命令
描述 — 根據取樣的統計資料,估計集合中未使用的儲存空間。它包含已刪除文件和空白區段的空間。
索引層級指標
UnusedStorageSize
(索引層級)
Location — 資料庫 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 中的垃圾回收無法手動觸發。系統會自動管理垃圾回收,做為其內部維護操作的一部分。
我應該將哪些警示設定為操作最佳實務?
我們建議在叢集和集合層級設定監控,以確保 Amazon DocumentDB 系統的最佳效能。
用於叢集層級監控
首先,為閾值為 13 億的AvailableMVCCId
指標建立 CloudWatch 警示。這可讓您有足夠的時間在指標達到零之前採取動作,此時您的叢集將進入唯讀模式。請記住,此指標可能會根據您的特定使用模式而波動。有些客戶看到它低於 13 億,然後隨著垃圾回收完成其工作而復原超過 15 億。
也請務必透過 CloudWatch 監控LongestRunningGCProcess
指標。此指標與 GCRuntimeStats
可協助您了解廢棄項目收集在系統中的效率。
用於集合層級監控
專注於兩個關鍵指標。首先,我們建議觀看每個集合MvccIdAgeScale
的值。增加值表示 MVCC IDs 正在老化,可能需要注意。其次,監控 GCRuntimeStats
以識別任何需要異常長時間或持續數天的垃圾收集程序。具有頻繁寫入操作的集合需要額外注意,因為它們為垃圾收集器產生更多工作。對於具有繁重寫入活動的集合,我們建議您更頻繁地檢查這些指標,以確保垃圾收集與您的工作負載保持一致。
請注意,這些監控建議做為起點。當您更熟悉系統的行為時,建議您調整這些閾值,以更符合您的特定使用模式和需求。
如果我的 AvailableMVCCId
低於 13 億,該怎麼辦?
如果您的AvailableMVCCId
指標低於 13 億,建議您立即採取行動,以防止您的叢集進入唯讀模式。我們建議您先擴展執行個體大小,為垃圾收集器提供更多運算資源。這可讓您的應用程式繼續正常操作,同時為垃圾收集器提供追上所需的額外能力。
如果單獨擴展無法改善情況,建議您考慮減少寫入操作。使用 MvccIdAgeScale
指標來識別哪些特定集合包含需要注意的較舊 MVCC IDs。識別這些集合之後,您可能需要暫時減少這些集合的寫入操作,以允許垃圾收集追上進度。在復原期間,我們建議您密切監控 AvailableMVCCId
指標,以確保您的動作具有所需的效果。一旦AvailableMVCCId
值回到 15 億或更高,您的叢集就會被視為正常運作。
請記住,這些步驟是預防措施,可協助您的系統在達到嚴重狀態之前復原。看到指標降到 13 億以下之後,您採取動作的速度越快,就越有可能避免對寫入操作造成任何影響。