時間序列資料的結構定義設計

本頁面說明在 Bigtable 中儲存時間序列資料的結構定義設計模式。本頁面以「設計結構定義」為基礎,並假設您已熟悉該頁面說明的概念和建議。

時間序列是一組資料,包含測量結果和記錄測量結果的時間。時間序列的例子包括:

  • 電腦記憶體用量圖
  • 新聞報導中的溫度變化
  • 一段時間內的股市價格

良好的結構定義可帶來優異的效能和擴充性,但不良的結構定義可能會導致系統效能不佳。不過,沒有任何單一結構定義設計最適合所有用途。

本頁面所述的模式可做為起點。設計時間序列資料的結構定義時,最重要的一點是考量您獨特的資料集和打算使用的查詢。

在 Bigtable 中儲存時間序列資料的基本設計模式如下:

範例資料

為說明模式之間的差異,本頁範例假設您儲存的應用程式資料,是每分鐘記錄一次氣象氣球測量的資料。我們使用「事件」一詞,是指同時寫入一或多個儲存格的單一要求。地區 ID 對應 Google Cloud 區域。

評估 範例
  1. 為方便閱讀,本頁的時間戳記格式為 `tYYYY-MM-DD-HHMM`。在正式版資料表中,時間戳記通常會以自 1970 年 1 月 1 日 00:00:00 UTC 起算的微秒數表示,例如 `1616264288050807`。
壓力 (帕斯卡) 94587
溫度 (攝氏) 9.5
濕度 (百分比) 65
海拔高度 (公尺) 601
相關資料 範例
氣球 ID 3698
位置 asia-southeast1
時間戳記1 t2021-03-05-1204

時間間隔

在時間值區模式中,表格中的每一列都代表一個「值區」,例如一小時、一天或一個月。資料列索引鍵包含非時間戳記 ID,例如 week49,以及其他識別資料,用於識別資料列中記錄的時間範圍。

使用的 bucket 大小 (例如分鐘、小時或天) 取決於您打算使用的查詢,以及 Bigtable 資料大小限制。舉例來說,如果包含一小時資料的資料列大於建議的每列最大大小 100 MB,那麼代表半小時或一分鐘的資料列可能就是更好的選擇。

時間區間模式的優點包括:

  • 成效會有所提升。舉例來說,如果您儲存 100 項測量結果,Bigtable 會將這些結果寫入及讀取至一個資料列,而不是 100 個資料列,這樣速度會更快。

  • 與高而窄的資料表相比,以這種方式儲存的資料壓縮效率更高。

缺點包括:

  • 時間區間結構定義設計模式比單一時間戳記模式複雜,開發時間和心力也可能更多。

為新事件新增資料欄

在這個時間值區間模式中,您會為每個事件將新資料欄寫入資料列,並將資料儲存在資料欄限定符中,而非儲存為儲存格值。也就是說,您會為每個儲存格傳送資料欄系列、資料欄限定詞和時間戳記,但不會傳送值。

以這個模式為例,每列都包含單一指標的所有測量值,例如單一氣象氣球在一週內的 pressure。每個資料列索引鍵都包含位置、氣球 ID、您在資料列中記錄的指標,以及週數。每當氣球回報指標資料時,您就會在該列中新增一欄。資料欄限定詞包含測量值 (以帕斯卡為單位的壓力),適用於儲存格時間戳記所識別的分鐘。

在本例中,三分鐘後,資料列可能如下所示:

資料列索引鍵 94558 94122 95992
us-west2#3698#pressure#week1 "" (t2021-03-05-1200) "" (t2021-03-05-1201) "" (t2021-03-05-1202)

這個模式的用途包括:

為新活動新增儲存格

在這個時間值區模式中,您可以在寫入新事件時,將新儲存格新增至現有資料欄。這個模式可讓您充分運用 Bigtable 的功能,在特定資料列和資料欄中儲存多個含有時間戳記的儲存格。使用這個模式時,請務必指定垃圾收集規則。

以氣象氣球資料為例,每個資料列都包含單一氣象氣球在一週內的所有測量結果。資料列鍵前置字元是當週的 ID,因此您只需一次查詢,就能讀取多個氣球一整週的資料。其他資料列鍵區隔是氣球的作業位置和氣球的 ID 編號。這個資料表有一個資料欄系列 measurements,而該資料欄系列為每種測量類型各有一個資料欄:pressuretemperaturehumidityaltitude

每當氣球傳送測量結果時,應用程式就會將新值寫入該氣球當週資料所在的列,並在每個資料欄中寫入額外的時間戳記儲存格。在一週結束時,每列的每個資料欄都會有該週每分鐘的測量結果,或 10,080 個儲存格 (如果垃圾收集政策允許)。

每列的每個欄位都代表一週內每分鐘的測量結果。在本例中,三分鐘後,資料列的前兩欄可能如下所示:

資料列索引鍵 壓力 temp
asia-south2#3698#week1 94558 (t2021-03-05-1200) 9.5 (t2021-03-05-1200)
94122 (t2021-03-05-1201) 9.4 (t2021-03-05-1201)
95992 (t2021-03-05-1202) 9.2 (t2021-03-05-1202)

這個模式的用途包括:

  • 您希望能夠測量一段時間內的測量值變化。

單一時間戳記資料列

在這個模式中,您會為每個新事件或評估指標建立資料列,而不是在現有資料列的資料欄中新增儲存格。資料列索引鍵尾碼是時間戳記值。遵循此模式的表格通常高而窄,且每列中的每個資料欄只包含一個儲存格。

單一時間戳記序列化

在這個模式中,您會以序列化格式 (例如通訊協定緩衝區 (protobuf)),將資料列的所有資料儲存在單一資料欄中。如要進一步瞭解這種做法,請參閱「設計結構定義」。

舉例來說,如果您使用這個模式儲存氣象氣球資料,四分鐘後資料表可能如下所示:

資料列索引鍵 measurements_blob
us-west2#3698#2021-03-05-1200 protobuf_1
us-west2#3698#2021-03-05-1201 protobuf_2
us-west2#3698#2021-03-05-1202 protobuf_3
us-west2#3698#2021-03-05-1203 protobuf_4

這個模式的優點包括:

  • 儲存效率

  • 速度

缺點包括:

  • 讀取資料時無法只擷取特定資料欄

  • 讀取資料後需要還原序列化

這個模式的用途包括:

  • 您不確定如何查詢資料,或查詢次數可能會有波動。

  • 您需要降低成本,因此比從 Bigtable 擷取資料前篩選資料更重要。

  • 每個事件都包含大量指標,如果將資料儲存在多個資料欄中,可能會超過每列 100 MB 的限制。

單一時間戳記未序列化

在這個模式中,即使只記錄一項評估指標,您也會將每個事件儲存在各自的資料列中。資料欄中的資料不會序列化。

這個模式的優點包括:

  • 相較於時間區間模式,這種模式通常更容易實作。

  • 您可能需要較少時間調整結構定義,即可使用。

這個模式的缺點通常大於優點:

  • Bigtable 的效能會因此降低。

  • 與較寬資料欄中的資料相比,以這種方式儲存的資料壓縮效率較低。

  • 即使時間戳記位於資料列鍵的結尾,這種模式仍可能導致熱點。

這個模式的用途包括:

  • 您想一律擷取所有資料欄,但只擷取指定時間戳記範圍,但您有理由不將資料儲存在序列化結構中。

  • 您想儲存不限數量的事件。

使用氣象氣球範例資料時,資料欄系列和資料欄限定詞與使用時間區間和新儲存格的範例相同。不過,在這個模式中,每個氣象氣球的一組回報測量值都會寫入新列。下表顯示使用這個模式寫入的五個資料列:

資料列索引鍵 壓力 溫度 濕度 海拔高度
us-west2#3698#2021-03-05-1200 94558 9.6 61 612
us-west2#3698#2021-03-05-1201 94122 9.7 62 611
us-west2#3698#2021-03-05-1202 95992 9.5 58 602
us-west2#3698#2021-03-05-1203 96025 9.5 66 598
us-west2#3698#2021-03-05-1204 96021 9.6 63 624

其他策略

如果需要為同一個資料集傳送多個不同的查詢,建議將資料儲存在多個資料表中,每個資料表都設有專為其中一個查詢設計的資料列鍵。

在某些情況下,您也可以合併模式。舉例來說,只要資料列不會變得太大,您就可以在代表時間區間的資料列中儲存序列化資料

後續步驟