Bigtable 總覽
Bigtable 是一種稀疏型資料表,可以擴充到數十億資料列和數千個資料欄,讓您儲存數 TB 甚至是數 PB 的資料。每一列的單一值均經過索引;這個值又稱為資料列索引鍵。如要以低延遲儲存大量單一鍵資料,Bigtable 會是您的絕佳選擇。Bigtable 具備低延遲的特性,也支援高總處理量讀寫作業,是 MapReduce 作業的理想資料來源。
應用程式可透過多個用戶端程式庫存取 Bigtable,包括 Java 適用的 Apache HBase 程式庫支援的擴充功能。因此,這項服務可與現有的 Apache 開放原始碼大數據軟體生態系統整合。
相較於自行管理的 HBase 安裝作業,Bigtable 強大的後端伺服器具有以下幾項主要優勢:
- 驚人的擴充性。Bigtable 的擴充能力與叢集中的機器數量成正比。自行管理的 HBase 安裝設計上具有瓶頸,在達到特定門檻後效能會受到限制。Bigtable 則不會遇到這個瓶頸,因此您可以擴充叢集以處理更多的讀取和寫入作業。
- 管理簡單。Bigtable 會以透明方式處理升級和重新啟動作業,並自動維持高資料耐久性。如要複製資料,請在執行個體中新增第二個叢集,複製作業就會自動開始。您不必再管理副本或區域,只要設計資料表結構定義,Bigtable 就會為您處理其餘作業。
- 無須停機即可調整叢集大小。您可以增加 Bigtable 叢集的大小,處理大量負載,然後再縮減叢集大小,完全不需要停機。變更叢集大小後,Bigtable 通常會在負載下運作幾分鐘,即可平衡叢集內所有節點的效能。
- 自動調度資源。您可以設定 Bigtable 持續監控叢集 CPU 容量,並在必要時自動調整叢集中的節點數量。
適用場合
如果應用程式需要高總處理量和可擴充性來處理鍵/值資料,且每個值通常不超過 10 MB,Bigtable 就是理想選擇。此外,Bigtable 也是批次 MapReduce 作業、串流處理/分析和機器學習應用程式的絕佳儲存引擎。
您可以使用 Bigtable 儲存及查詢以下類型的所有資料:
- 時間序列資料,例如多部伺服器在不同時間的 CPU 和記憶體使用狀況。
- 營銷資料,例如購買歷史紀錄和消費者喜好。
- 財務資料,例如交易記錄、股價和匯率。
- 物聯網資料,例如電表和家用電器的使用報告。
- 圖形資料,例如有關使用者間連接方式的資訊。
Bigtable 儲存模型
Bigtable 會將資料儲存在可大幅擴充的資料表中,每個資料表都是經過排序的鍵/值對應關係。資料表由「資料列」和「資料欄」組成,通常每一資料列描述單一實體,資料欄則包含各資料列個別的值。每個資料列由單一「資料列索引鍵」進行索引,彼此關聯的資料欄通常會分組為「資料欄系列」。每一資料欄以資料欄系列加上「資料欄限定詞」的組合來識別,這個限定詞是該資料欄系列中的唯一名稱。
資料列和資料欄的每個交集可包含多個「儲存格」。每個儲存格都包含該列和欄的資料,並附上專屬的時間戳記。在資料欄中儲存多個儲存格,可記錄該資料列和資料欄的儲存資料歷來變化。Bigtable 資料表空間稀疏;如果特定資料列未使用某個資料欄,該資料欄就不會佔用任何空間。
在本圖中有幾點值得注意:
- 資料列中可以不使用資料欄。
- 特定列和欄中的每個儲存格都有專屬時間戳記 (t)。
Bigtable 架構
下圖為 Bigtable 整體架構的簡化版:
如圖所示,所有用戶端要求都會先經過前端伺服器,再傳送至 Bigtable 節點。(在原始 Bigtable 論文中,這些節點稱為「平板電腦伺服器」。)節點會組成 Bigtable 叢集,而叢集屬於 Bigtable 執行個體 (叢集的容器)。
叢集的每一個節點處理一部分對叢集的請求。在叢集中新增節點,即可增加叢集可同時處理的要求數量。新增節點也會提高叢集的總處理量上限。如果您透過新增叢集啟用複製功能,也可以將不同類型的流量傳送至不同叢集。這樣一來,如果某個叢集無法使用,您就可以容錯移轉到另一個叢集。
Bigtable 資料表會分割成連續資料列所組成的區塊,稱為「子表」,以協助平衡查詢的工作負載。(子表類似於 HBase 區域。) 子表係以 SSTable 格式儲存於 Google 的檔案系統 Colossus 上。SSTable 提供從鍵到值的不可變更有序映射,其中的鍵和值均為任意位元組字串。每個子表會與一個特定的 Bigtable 節點相關聯。除了 SSTable 檔案之外,所有的寫入操作一旦被 Bigtable 認可,均儲存於 Colossus 的共享日誌中,更提高了資料的持久性。
重要的是,每個 Bigtable 節點本身一律不會儲存任何資料,而是設定了資料連結,指向一組儲存在 Colossus 的子表。因此:
- 將平板電腦從一個節點重新平衡到另一個節點時,由於系統不會複製實際資料,因此速度很快。Bigtable 會更新每個節點的指標。
- 從 Bigtable 節點故障中復原的速度很快,因為只需要將中繼資料移轉至替代節點。
- Bigtable 節點發生故障時,資料不會遺失。
如要深入瞭解如何使用這些基本元素,請參閱執行個體、叢集和節點一文。
負載平衡
每個 Bigtable 區域都由主要程序管理,負責平衡叢集內的工作負載和資料量。這個程序會將存取頻率較高、資料量較大的子表分成兩半,並將存取頻率較低、資料量較小的子表合併在一起,依需要重新分佈在各節點之間。如果某個子表流量突然暴增,Bigtable 會將該子表拆成兩個,然後將其中一個新子表移至另一個節點。Bigtable 會自動管理分割、合併和重新平衡作業,因此您不必手動管理平板電腦。如要進一步瞭解這項程序,請參閱「瞭解成效」。
如要讓 Bigtable 達到最佳寫入效能,請務必盡可能將寫入作業平均分配到各個節點。如要達成這個目標,其中一種方法是使用不會依可預測順序排列的資料列鍵。例如,使用者名稱往往在各字母之間大致均勻地分佈,因此將使用者名稱放在資料列索引鍵的開頭,可使寫入操作分佈地更均勻。
同時,將相關資料列分組並排列在一起,可大幅提升同時讀取多個資料列的效率。舉例來說,如果您要儲存不同類型的天氣資料,資料列鍵可能是資料的收集地點,後面接著時間戳記 (例如 WashingtonDC#201803061617
)。這類資料列鍵會將一個地點的所有資料分組到連續的資料列範圍。對於其他地點,資料列將以不同的識別碼開頭;對於以相同速率收集資料的許多地點而言,寫入操作仍然會均勻地分佈於各子表之間。
如需有關為資料選擇合適鍵值的詳細資訊,請參閱選擇資料列索引鍵。
運算
根據預設,Bigtable 會使用叢集節點進行儲存和運算。如要執行高處理量讀取工作,可以使用 Bigtable 適用的 Data Boost 進行運算。透過 Data Boost,您可以使用無伺服器運算模型傳送大型讀取工作和查詢,同時讓核心應用程式繼續使用叢集節點進行運算。詳情請參閱 Data Boost 總覽。
支援的資料類型
在大多數情況下,Bigtable 會將所有資料視為原始位元組字串。Bigtable 只有在遞增作業時會嘗試判斷類型,此時目標必須是編碼為 8 位元組大端序值的 64 位元整數。
記憶體和磁碟使用情況
以下各節說明 Bigtable 的多個元件如何影響執行個體的記憶體和磁碟用量。
未使用的資料欄
如果 Bigtable 資料列未使用某些資料欄,這些資料欄就不會佔用該資料列的任何空間。每個資料列基本上都是鍵/值項目集合,其中鍵是資料欄系列、資料欄限定詞和時間戳記的組合。如果資料列不含特定資料欄的值,則不會顯示鍵值項目。
資料欄限定詞
資料欄限定詞會佔據資料列的空間,因為資料列使用的每一個資料欄限定詞均儲存於該資料列中。因此,使用資料欄限定詞做為資料通常很有效率。
如要進一步瞭解資料欄限定符,請參閱「資料欄」。
壓縮
Bigtable 會定期重新寫入資料表來移除已刪除的項目,並重新整理您的資料,藉此提高讀取和寫入的效率。這個過程稱為壓縮。壓縮作業沒有設定,Bigtable 會自動壓縮資料。
變異和刪除操作
資料列的變化或變更會佔用額外儲存空間,因為 Bigtable 會依序儲存變化,且只會定期壓縮變化。Bigtable 壓縮資料表時,會移除不再需要的值。如果您更新了儲存格中的值,原始值和新的值都會儲存於磁碟上一段時間,直到資料被壓縮為止。
刪除操作也會佔據額外的儲存空間,至少短時間內是如此,因為刪除其實是一種特殊型態的變異操作。刪除操作會使用額外的儲存空間,而不是將儲存空間釋放出來,直到資料表被壓縮為止。
資料壓縮
Bigtable 會使用智慧演算法自動壓縮資料。您無法為您的資料配置壓縮設定值。不過,知道如何儲存資料,使其能有效率地壓縮,是很有用的:
- 相較於規律性資料,隨機性資料的壓縮效率較低。 規律性資料包括文字內容,例如您現在所瀏覽的頁面內容。
- 如果相同的值彼此相近,壓縮效果最佳,無論是在同一列或相鄰列中皆是如此。如果排列資料列鍵時,讓具有相同資料區塊的資料列彼此相鄰,資料就能有效壓縮。
- Bigtable 會壓縮大小最多 1 MiB 的值。 如果儲存的值大於 1 MiB,請先壓縮再寫入 Bigtable,這樣就能節省 CPU 週期、伺服器記憶體和網路頻寬。
資料持久性
使用 Bigtable 時,資料會儲存在 Google 內部的高耐用性檔案系統 Colossus 上,並使用 Google 資料中心的儲存裝置。使用 Bigtable 時,不需要執行 HDFS 叢集或使用任何其他檔案系統。Google 在幕後使用獨家的儲存方法,超越了標準 HDFS 三路複製所能提供的資料持久性。
使用複製功能時,耐久性會進一步提升。 Bigtable 會在您為每個叢集選取的複製執行個體位置,分別保留一份資料副本。
一致性模型
單一叢集 Bigtable 執行個體提供強烈一致性。根據預設,有多個叢集的執行個體會提供最終一致性,但某些用途可設定為提供讀寫一致性或嚴格一致性,具體視工作負載和應用程式設定檔設定而定。
安全性
Bigtable 資料表的存取權是由專案和指派給使用者的身分與存取權管理 (IAM) 角色控管。 Google Cloud舉例來說,您可以指派 IAM 角色,禁止個別使用者從資料表讀取資料、寫入資料表,或建立新執行個體。如果使用者沒有專案存取權,或不具備適當的 Bigtable 權限 IAM 角色,就無法存取您的任何資料表。
您也可以建立資料表的授權檢視表,代表資料表資料的子集,藉此控管資料表資料的存取權。接著,您可以將授權檢視層級的權限授予部分使用者,而不授予資料表層級的權限。
您可以在專案、執行個體、資料表或授權檢視畫面層級管理安全性。Bigtable 不支援資料列層級、資料欄層級或儲存格層級的安全性限制。
加密
根據預設,儲存在 Google Cloud中的所有資料 (包括 Bigtable 資料表中的資料),都會透過強化版金鑰管理系統進行靜態加密。這個系統與 Google 加密自家資料時使用的系統相同。
如要進一步控管用於加密 Bigtable 靜態資料的金鑰,可以使用客戶自行管理的加密金鑰 (CMEK)。
備份
Bigtable 備份功能可讓您儲存資料表結構定義與內容的副本,日後即可還原至新的資料表。無論來源資料表位於何處,您都可以使用備份和備份副本,在具備 Bigtable 執行個體的任何區域或專案中,還原至新的資料表。
變更資料擷取
Bigtable 提供變更資料擷取 (CDC) 功能,以變更串流的形式呈現。變更串流功能可讓您擷取資料變更,並在變更發生時將資料變更串流至資料表。您可以使用 Dataflow 等服務讀取變更串流,支援資料分析、稽核、封存需求,以及觸發下游應用程式邏輯等用途。詳情請參閱「變更串流總覽」。
使用應用程式設定檔轉送要求
應用程式設定檔轉送政策可讓您控管哪些叢集處理應用程式的傳入要求。轉送政策選項包括:
- 單一叢集轉送:將所有要求傳送到單一叢集。
- 轉送至任何叢集的多叢集轉送:將要求傳送至執行個體中最接近的可用叢集,包括下列選項:
- 任何叢集:執行個體中的任何叢集都可以接收要求。
- 叢集群組轉送:執行個體中指定的叢集群組可以接收要求。
其他儲存空間和資料庫選項
Bigtable 並非傳統的關聯式資料庫,雖然支援 SQL 查詢,但某些用途可能更適合使用其他資料庫選項。
- 如果您需要線上分析處理 (OLAP) 系統的交互式查詢功能,請考慮使用 BigQuery。
- 如果您必須在文件資料庫中儲存高度結構化物件,並支援 ACID 交易和類似 SQL 的查詢功能,請考慮使用 Firestore。
- 如要使用低延遲的記憶體內資料儲存空間,請考慮 Memorystore。
- 如要即時同步處理使用者之間的資料,請考慮使用 Firebase 即時資料庫。
如要進一步瞭解其他資料庫選項,請參閱資料庫服務總覽。 Google Cloud 也提供各種儲存空間選項。
後續步驟
- 嘗試使用 Bigtable 的指令列工具
cbt
CLI,進行 Bigtable 快速入門導覽課程。 - 逐步演練 Bigtable 程式碼研究室。
- 瞭解 Bigtable 執行個體、叢集和節點。
- 瞭解如何建立 Bigtable 執行個體。
- 瞭解如何遷移至 Bigtable。
- 進一步瞭解 Cloud Bigtable 的客戶端程式庫。
- 參閱有關 BigTable 的原始 OSDI 文件。