時間序列資料的結構定義設計
本頁面說明在 Bigtable 中儲存時間序列資料的結構定義設計模式。本頁面以「設計結構定義」為基礎,並假設您已熟悉該頁面說明的概念和建議。
時間序列是一組資料,包含測量結果和記錄測量結果的時間。時間序列的例子包括:
- 電腦記憶體用量圖
- 新聞報導中的溫度變化
- 一段時間內的股市價格
良好的結構定義可帶來優異的效能和擴充性,但不良的結構定義可能會導致系統效能不佳。不過,沒有任何單一結構定義設計最適合所有用途。
本頁面所述的模式可做為起點。設計時間序列資料的結構定義時,最重要的一點是考量您獨特的資料集和打算使用的查詢。
在 Bigtable 中儲存時間序列資料的基本設計模式如下:
範例資料
為說明模式之間的差異,本頁範例假設您儲存的應用程式資料,是每分鐘記錄一次氣象氣球測量的資料。我們使用「事件」一詞,是指同時寫入一或多個儲存格的單一要求。地區 ID 對應 Google Cloud 區域。
評估 | 範例 |
---|---|
|
|
壓力 (帕斯卡) | 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
,而該資料欄系列為每種測量類型各有一個資料欄:pressure
、temperature
、humidity
和 altitude
。
每當氣球傳送測量結果時,應用程式就會將新值寫入該氣球當週資料所在的列,並在每個資料欄中寫入額外的時間戳記儲存格。在一週結束時,每列的每個資料欄都會有該週每分鐘的測量結果,或 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 |
其他策略
如果需要為同一個資料集傳送多個不同的查詢,建議將資料儲存在多個資料表中,每個資料表都設有專為其中一個查詢設計的資料列鍵。
在某些情況下,您也可以合併模式。舉例來說,只要資料列不會變得太大,您就可以在代表時間區間的資料列中儲存序列化資料。
後續步驟
- 請參閱規劃結構定義一文,瞭解相關步驟。
- 瞭解設計結構定義的最佳做法。
- 瞭解 Bigtable 的預期效能。
- 探索 Key Visualizer 的診斷功能。