時間序列資料的結構定義設計
本頁面說明在 Bigtable 儲存時間序列資料的結構定義設計模式。本頁面以「設計結構定義」為基礎,並假設您熟悉該頁面所述的概念和建議。
時間序列是資料集合,包含測量結果和記錄測量結果的時間。時間序列的例子包括:
- 電腦記憶體用量圖
- 新聞報導中的氣溫隨時間變化
- 一段時間內的股市價格
良好的結構定義可帶來出色的效能和擴充性,而不良的結構定義則可能導致系統效能不佳。不過,沒有任何一種結構定義設計能完美因應所有用途。
本頁所述的模式可做為起點。為時間序列資料設計結構定義時,最重要的是考量您獨特的資料集和預計使用的查詢。
在 Bigtable 中儲存時間序列資料的基本設計模式如下:
範例資料
為說明模式之間的差異,本頁範例假設您要儲存應用程式的資料,該應用程式會記錄氣象氣球每分鐘測量一次的資料。我們使用「事件」一詞,代表同時寫入一或多個儲存格的單一要求。地區 ID 對應 Google Cloud 區域。
| 評估 | 範例 |
|---|---|
|
|
| 壓力 (帕斯卡) | 94587 |
| 溫度 (攝氏) | 9.5 |
| 濕度 (百分比) | 65 |
| 海拔高度 (公尺) | 601 |
| 相關資料 | 範例 |
| 氣球 ID | 3698 |
| 位置 | asia-southeast1 |
| 時間戳記1 | t2021-03-05-1204 |
時間區間
在時間值區模式中,資料表中的每一列都代表一個時間「值區」,例如一小時、一天或一個月。資料列索引鍵包含非時間戳記 ID (例如 week49),用於記錄資料列中的時間範圍,以及其他識別資料。
您使用的值區大小 (例如分鐘、小時或天) 取決於您打算使用的查詢和 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 的功能,在特定資料列和資料欄中儲存多個加上時間戳記的儲存格。使用這個模式時,請務必指定垃圾收集規則。
如果工作負載的事件發生率很高,同一毫秒內可能會發生多個事件,導致時間戳記衝突而遺失資料。如要在為新事件新增儲存格時避免這種情況,您可以將資料表設定為使用微秒時間戳記精細程度。這項功能僅適用於 Enterprise Plus 版本的執行個體。
以氣象氣球資料為例,每一列都包含單一氣象氣球在一週內的所有測量結果。資料列索引鍵前置字元是週的 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) |
這個模式的用途包括:
- 您希望能夠評估測量結果隨時間的變化。
單一時間戳記資料列
在這個模式中,您會為每個新事件或測量結果建立一列,而不是在現有資料列的資料欄中新增儲存格。資料列索引鍵後置字串是時間戳記值。遵循這種模式的資料表通常高而窄,且資料列中的每個資料欄都只有一個儲存格。
單一時間戳記序列化
在這個模式中,您會以 JSON 或通訊協定緩衝區 (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 的 SQL 查詢功能來查詢 JSON 或通訊協定緩衝區,就無法在讀取資料時只擷取特定欄位,而必須讀取指定儲存格的所有資料。
讀取資料後需要反序列化
這個模式的用途包括:
您幾乎一律需要同時擷取特定事件的所有測量結果。
您會優先考量儲存空間效率,因為您幾乎一律會同時擷取特定事件的所有測量結果。雖然您可以使用 Bigtable 的 SQL 功能在伺服器端篩選資料,但只有在不需要頻繁篩選時,這種模式才最有效益。
每個事件都包含許多測量結果,如果將資料儲存在多個資料欄中,可能會超過每列 100 MB 的限制。
單一時間戳記未序列化
在這個模式中,即使只記錄一項測量結果,您也會將每個事件儲存在各自的資料列中。資料欄中的資料未序列化。
這個模式的優點包括:
通常比時間值區模式更容易實作。
您可能可以花較少時間精簡結構定義,再開始使用。
這種模式的缺點通常多於優點:
Bigtable 採用這種模式時,效能會降低。
以這種方式儲存的資料,壓縮效率不如較寬資料欄中的資料。
即使時間戳記位於資料列索引鍵的結尾,這種模式仍可能導致熱點。
這個模式的用途包括:
您希望一律擷取所有資料欄,但只擷取指定範圍的時間戳記,但您有理由不將資料儲存在序列化結構中。
您想儲存無限數量的事件。
使用氣象氣球範例資料,資料欄系列和資料欄限定詞與使用時間值區和新儲存格的範例相同。不過,在這個模式中,每個氣象氣球回報的每組測量值都會寫入「新資料列」。下表顯示使用這個模式寫入的五個資料列:
| 資料列索引鍵 | 壓力 | temperature | 濕度 | 海拔高度 |
|---|---|---|---|---|
| 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 |
其他策略
如需針對同一個資料集傳送多個不同的查詢,建議您將資料儲存在多個資料表中,並為每個資料表設計一個資料列索引鍵,用於其中一個查詢。
在某些情況下,您也可以結合使用多種模式。舉例來說,您可以將序列化資料儲存在代表時間 bucket 的資料列中,只要資料列不會過大即可。
後續步驟
- 請參閱規劃結構定義的步驟。
- 瞭解設計結構定義的最佳做法。
- 瞭解 Bigtable 的預期效能。
- 探索 Key Visualizer 的診斷功能。