垃圾收集總覽

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

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

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

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

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

  • 將資料列大小降到最低 - 您總是希望防止資料列無限成長。大型資料列會對效能造成負面影響。理想情況下,資料列大小不應超過 100 MB,上限為 256 MB。如果您不需要保留歷來資料或目前資料的早期版本,可以使用垃圾收集功能,盡可能縮減各列的大小。
  • 降低成本 - 垃圾收集可確保您不需要為了儲存不再需要或不再使用的資料而付費。在壓縮作業執行,且符合垃圾收集條件的資料刪除之前,系統會向您收取過期或過時資料的儲存費用。這項程序通常需要幾天,但最多可能需要一週。

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

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

時間戳記

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

根據預設,傳送至 Bigtable 的時間戳記必須是微秒值,精確度最多到毫秒。Bigtable 會拒絕精確度為微秒的時間戳記 (例如 3023483279876543),除非您寫入的資料表時間戳記精細程度為微秒。精細程度為微秒的資料表,可接受使用者提供的時間戳記,精確度可達微秒。這項功能僅適用於 Enterprise Plus 版本的執行個體。

儲存格的時間戳記屬性可以是「實際」時間戳記,反映儲存格值的實際寫入時間,也可以是「人工」時間戳記。人工時間戳記包括序號、零或時間戳記格式的值,但不是寫入儲存格的實際時間。使用人工時間戳記前,請先詳閱人工時間戳記的用途,包括使用風險:

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

垃圾收集類型

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

到期值 (以時間為基礎)

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

版本數量

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

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

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

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

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

十字路口

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

Union

聯集垃圾收集政策會在資料符合一組指定規則中的「任何」項目時,將資料標示為刪除。舉例來說,您可能想確保每位使用者最多保留兩筆網頁瀏覽記錄,但前提是這些記錄未超過 30 天。在這種情況下,聯集政策會設定為到期值「或」版本數量。

巢狀

「巢狀」垃圾收集政策結合了聯集和交集規則。

垃圾收集的預設設定

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

HBase 政策

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

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

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

資料刪除時

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

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

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

在壓縮作業執行並刪除資料之前,系統會向您收取過期資料的儲存費用。雖然 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 中不存在的值最終遭到刪除。

後續步驟