垃圾收集總覽

Bigtable 的垃圾收集功能可自動從資料表中移除過期和過時資料。設定這些政策有助於管理儲存空間費用,並維持讀取效能。

垃圾收集是自動執行的持續性程序,可從 Bigtable 資料表中移除過期和過時資料。垃圾收集政策是一組您建立的規則,用於指出特定資料欄系列中的資料何時不再需要。

「垃圾收集」是一項內建的非同步背景程序,會在壓縮期間執行。垃圾收集作業會按照固定時間表進行,不會因需要刪除的資料量而異。在資料刪除前,系統仍會在讀取結果中顯示資料。您可以篩選讀取作業,排除這項資料。

詳情請參閱本文的「資料刪除時機」一節。

垃圾收集政策的優點包括:

  • 將資料列大小降到最低 - 您總是希望防止資料列無限成長。大型資料列會對效能造成負面影響。理想情況下,您不應讓資料列大小超過 100 MB,上限為 256 MB。如果不需要保留歷來資料或目前資料的舊版,使用垃圾收集功能有助於盡量縮小每列的大小。
  • 降低費用:垃圾收集功能可確保您不會為不再需要或使用的資料支付儲存費用。系統會根據過期或過時資料的儲存空間計費,直到壓縮作業完成,並刪除符合垃圾收集條件的資料為止。這項程序通常需要幾天,但最多可能長達一週。

您可以透過程式輔助方式或使用 cbt CLI 設定垃圾收集政策。垃圾收集政策是在資料欄系列層級設定。

資料表中的每個資料欄系列都有自己的垃圾收集政策。垃圾收集程序會查詢每個資料欄系列的現行垃圾收集政策,然後根據政策中的規則刪除資料。

時間戳記

在 Bigtable 中,資料列與資料欄的交集可以有多個儲存格,其中包含該交集的值加上時間戳記的版本。每個儲存格都有時間戳記。時間戳記是指自 Unix 紀元 (1970-01-01 00:00:00 UTC) 起算的微秒數。您可以選擇使用預設時間戳記,或在傳送寫入要求時設定時間戳記。

傳送至 Bigtable 的時間戳記必須是微秒值,精確的位數只到毫秒。舉例來說,3023483279876543 這個微秒值會遭到拒絕。在本範例中,可接受的時間戳記值為 3023483279876000。

儲存格的時間戳記屬性可以是「實際」時間戳記,反映寫入儲存格值的實際時間,也可以是「人為」時間戳記。人為時間戳記包括連續數字、零,或格式為時間戳記的值,但並非寫入儲存格的實際時間。使用人工時間戳記前,請先瞭解人工時間戳記的用途,包括使用這類時間戳記的風險:

傳送寫入要求時,請務必設定預設時間戳記,除非您需要支援使用人工時間戳記的用途。

垃圾收集類型

本節說明 Bigtable 中可用的垃圾收集類型。如需各類型垃圾收集的程式碼範例,請參閱「設定垃圾收集」。

到期值 (以時間為基礎)

您可以根據每個儲存格的時間戳記設定垃圾收集規則。例如,您可能並不想保留時間戳記在目前日期與時間前 30 天以上的任何儲存格。使用這類垃圾收集規則時,您可以設定資料的存留時間 (TTL)。Bigtable 會在垃圾收集期間檢查每個資料欄系列,並刪除所有過期的儲存格。

版本數量

您可以設定垃圾回收規則,明確指出要為資料欄系列中所有欄保留的儲存格數量上限。

舉例來說,如果只想保留顧客的最新使用者名稱和電子郵件地址,可以建立包含這兩欄的資料欄系列,並將該資料欄系列的值上限設為 1。

在其他情況下,您可能想保留使用者密碼雜湊的最後五個版本,確保使用者不會重複使用密碼,因此您會將包含密碼欄的資料欄系列版本上限設為 5。Bigtable 在垃圾收集期間查看資料欄系列時,如果密碼資料欄已寫入第六個儲存格,系統會刪除最舊的儲存格,將儲存格數量維持在五個。

到期和版本號碼規則的組合

您可以結合到期和版本號碼規則,進行垃圾收集。組合類型包括「交集」、「聯集」和「巢狀」。如需設定範例,請參閱「根據多項條件進行垃圾收集」。

十字路口

交集垃圾收集政策會在資料符合特定規則集中的所有條件時,將資料標示為待刪除。舉例來說,您可能想刪除超過 30 天的設定檔,但要為每位使用者保留至少一個設定檔。在這種情況下,包含設定檔資料欄的資料欄系列的交集政策,會包含過期值規則和版本數規則。

Union

如果資料符合特定規則集中的任何項目,聯集垃圾收集政策就會將資料標示為待刪除。舉例來說,您可能想確保每位使用者最多保留兩筆網頁瀏覽記錄,但前提是這些記錄的建立時間未超過 30 天。在這種情況下,你的聯集政策是針對即將到期的值 或多個版本設定。

巢狀

巢狀垃圾收集政策包含聯集和交集規則。

垃圾收集的預設設定

資料欄系列沒有預設存留時間。資料欄保留的儲存格數量取決於您建立資料欄所屬資料欄系列的方式,詳情請參閱下列章節。

HBase 政策

如果您使用 Java 適用的 HBase 用戶端、HBase 殼層,或是其他使用 Java 適用的 HBase 用戶端的工具建立資料欄系列,Bigtable 只會保留資料欄系列中每個資料欄的最新儲存格,除非您變更規則。此預設設定與 HBase 一致。

其他所有用戶端程式庫或工具

如果您使用任何其他用戶端程式庫或工具建立資料欄系列,Bigtable 會在資料欄系列的每個資料欄中保留無限數量的儲存格。這包括使用 gcloud 和 cbt CLI 建立的資料欄系列。如要限制版本數量,請務必變更資料欄系列的垃圾收集政策。

資料刪除時機

垃圾收集是持續進行的程序,Bigtable 會檢查每個資料欄系列的規則,並據此刪除過期和過時的資料。一般來說,資料符合規則中的條件後,最多需要一週才會實際刪除。您無法變更垃圾收集的時間。

過期資料最多可能需要一週才會刪除,因此請勿只依賴垃圾收集政策,確保讀取要求會傳回所選資料。請務必對讀取要求套用篩選器,排除與垃圾收集規則相同的值。您可以限制每欄的儲存格數量,或指定時間戳記範圍來篩選資料。

舉例來說,假設資料欄系列的垃圾收集規則設為只保留設定檔的最新五個版本,且系統已儲存五個版本。撰寫新版個人資料後,最舊的儲存格可能要過一週才會刪除。因此,為避免讀取第六個值,請務必篩除最近五個版本以外的所有內容。

系統會根據過期資料的儲存空間計費,直到壓縮作業完成並刪除資料為止。

垃圾收集作業具有追溯效力:設定新的垃圾收集政策後,系統會在接下來幾天將政策套用至資料表中的所有資料。如果新政策比舊政策更嚴格,系統會在背景作業期間刪除舊資料,包括政策變更前寫入的資料。

如要確保系統刪除標示為垃圾收集的資料,可以查詢資料表,並將資料與預期結果進行比較。您也可以在 Google Cloud 控制台中監控資料表大小。如果表格大小不會縮小,可能表示垃圾收集政策未如預期運作,但請注意,垃圾收集作業會延遲執行。

複製和垃圾收集

複製會從幾個方面影響垃圾收集作業。

以版本為準的垃圾收集和 CPU 使用率

如果執行個體使用複寫功能,系統會將以版本為準的垃圾收集刪除作業,複寫到執行個體中的所有叢集,複寫方式與應用程式要求相同。如果快速寫入新儲存格,導致舊儲存格標示為待刪除,當 Bigtable 刪除過時的儲存格,並將這些刪除作業複製到執行個體中的其他叢集時,您可能會發現 CPU 使用率提高。如果將叢集新增至含有使用版本式垃圾收集的資料表的執行個體,請做好 CPU 使用量增加的準備。

另一方面,以存在時間為準的垃圾收集不會增加複製執行個體的 CPU 使用量。

變更以版本為準的垃圾收集政策

您可以修改複製資料表中資料欄系列的版本數上限。不過,如果減少資料欄系列的版數,所有複製的叢集最多可能需要一週的時間,才會反映新的較低版數。因此,讀取資料時應一律使用篩選器。

變更時間式垃圾回收政策

無論執行個體是否使用複寫功能,您都可以增加或減少垃圾收集政策中指定的保留時間。如果執行個體未使用複製功能,您也可以刪除以存在時間為準的垃圾收集政策。

縮短保留時間

如果您在以年齡為準的政策中縮短保留時間,所有叢集最多可能需要一週才能完成同步,並開始採用新政策。

延長保留時間

在複寫資料表中,垃圾收集政策的保留時間最多可延長 90 天。

如果延長資料欄系列的保留期限,叢集可能超過一週無法同步。如要瞭解原因,請參考以下假設案例:您在雙叢集執行個體中建立資料表,並將資料欄系列的保留期限從 30 天變更為 50 天:

  1. 系統會將資料列索引鍵 ip#685 的寫入要求傳送至叢集 A,並為資料欄系列 profile 中的資料欄 click-through 提供 2023-01-02 值。資料會複製到叢集 B。
  2. 31 天後,叢集 A 會進行垃圾收集,click-through 欄中的值會被視為過期並刪除。
  3. 您變更了資料欄系列profile的垃圾收集政策, 將存留時間從 30 天增加到 50 天。
  4. 一天後,垃圾收集作業在叢集 B 上執行。由於存留時間為 50 天,因此系統會保留 2023-01-02 值。
  5. 叢集現在已不同步,且會持續不同步近 20 天,直到系統最終刪除叢集 B 中存在但叢集 A 中不存在的值為止。

後續步驟