分析存取模式
您可以使用 Google Cloud console中的「Access patterns」(存取模式) 頁面,以視覺化方式分析應用程式在 Bigtable 中讀取及寫入資料的方式,也可以透過程式輔助方式呼叫 Cloud Monitoring API,查詢基礎存取模式指標。
總覽
Bigtable 會自動將傳入的資料要求分類為 Cloud Monitoring 中的查詢類型。工作負載存取模式是不同查詢類型的組合。舉例來說,工作負載存取模式可能包含點讀取、短掃描和點寫入查詢類型。Bigtable 定義了 10 種不同的查詢類型。
「System insights」(系統洞察) 頁面會顯示整體資源使用率,Key Visualizer 則會顯示 Bigtable 如何在資料列索引鍵範圍內分配流量,而「Access patterns」(存取模式) 頁面則會以查詢為中心,在叢集、資料表和應用程式設定檔層級細分工作負載。您可以使用「Access patterns」(存取模式) 頁面執行下列工作:
- 瞭解工作負載:查看各叢集的讀取、寫入和讀寫查詢類型比例和速率,並依資料表或應用程式設定檔將指標分組
- 偵測效率不佳的查詢模式,並排解延遲問題:
- 找出稀疏讀取作業,也就是 Bigtable 掃描的資料列或儲存格數量,遠多於傳回的數量,原因在於選擇性篩選器或未收集的儲存格等待垃圾收集
- 監控反向掃描,其效率低於正向掃描
- 比較伺服器端延遲時間百分位數,以及掃描的資料列、傳回的資料列和查看的儲存格,找出哪些存取模式導致延遲時間激增
- 找出要採用功能的特定工作負載:
- 找出點讀取量較高的資料表或應用程式設定檔,這些資料表或設定檔可受益於 Enterprise Plus 版本的記憶體內層
- 找出大型掃描或批次讀取工作負載,並使用 Data Boost 無伺服器運算,將這些工作負載與服務流量區隔開來
限制
Bigtable 不會將 Bigtable 適用的 GoogleSQL 查詢歸類為存取模式,也不會將這些查詢納入資料列、儲存格或位元組存取模式指標。在「QPS distribution」(QPS 分布)、「QPS」和「Latency」(延遲時間) 圖表中,SQL 查詢和其他未分類的要求會顯示為 QUERY_TYPE_UNKNOWN。
必要的角色
如要取得在 Google Cloud 控制台查看「Access patterns」(存取模式) 頁面所需的權限,請要求管理員授予您專案的下列 IAM 角色:
-
查看 Bigtable 資源:
- Bigtable 檢視者 (
roles/bigtable.viewer) - Bigtable 讀取者 (
roles/bigtable.reader)
- Bigtable 檢視者 (
-
查看 Monitoring 時間序列資料:Monitoring 檢視者 (
roles/monitoring.viewer)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這些預先定義的角色具備在 Google Cloud 控制台中查看「Access patterns」(存取模式) 頁面所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:
所需權限
必須具備下列權限,才能在 Google Cloud 控制台查看「Access patterns」(存取模式) 頁面:
-
查看執行個體詳細資料:
bigtable.instances.get -
列出叢集、應用程式設定檔和資料表:
bigtable.clusters.list, bigtable.appProfiles.list, bigtable.tables.list -
查詢監控指標:
monitoring.timeSeries.list
存取模式
當應用程式使用 Bigtable 用戶端程式庫時,用戶端程式庫會將方法呼叫轉譯為 Bigtable Data API 要求:
- 讀取:所有用戶端程式庫讀取方法都會傳送
ReadRowsData API 要求,包括單一資料列讀取 (例如readRow)、多資料列讀取 (例如readRows或具有多個資料列索引鍵的bulkReadRows),以及資料列範圍或前置字元掃描 (例如具有範圍或前置字元的readRows)。 - 寫入:用戶端程式庫寫入方法會針對簡易寫入和增量更新傳送
MutateRow要求、針對批次寫入傳送MutateRows要求、針對條件式寫入傳送CheckAndMutateRow要求,或針對附加和遞增傳送ReadModifyWriteRow要求。
Bigtable 會在伺服器上完成每項傳入的 Data API 要求後,根據下列因素 (而非僅根據用戶端程式庫方法名稱) 進行分類:
- 要求參數:要求是否指定單一資料列索引鍵、多個資料列索引鍵或資料列範圍、要求是否設定
reversed,以及套用哪些篩選器 - 執行統計資料:掃描及傳回的資料列和儲存格數量,以及位元組酬載
舉例來說,當您呼叫單一資料列讀取方法 (例如 readRow),或使用單一資料列索引鍵呼叫 readRows 時,Bigtable 通常會將要求歸類為點讀取,符合記憶體內層級的資格。不過,如果該單一資料列讀取作業使用複雜的篩選器,或掃描大量儲存格,Bigtable 可能會將其歸類為稀疏讀取、大量讀取或其他讀取。相反地,如果您呼叫 readRows 來讀取多個資料列索引鍵或掃描資料列範圍,Bigtable 會將要求分類為大量讀取或掃描,不符合記憶體內層級的資格。
讀取評估順序
由於單一 ReadRows Data API 要求可能符合多個類別的特徵,Bigtable 會依下列順序評估讀取要求,並指派第一個相符的存取模式:
- 點讀取
- 短掃描 (用於正向掃描) 或反向短掃描 (
reversed設為true時) - 反向掃描 (適用於
reversed設為true的其餘讀取要求) - 稀疏讀取 (在大量讀取前評估,讓 Bigtable 將多鍵讀取或大量篩選排除的大型正向掃描標記為稀疏)
- 大量讀取
- 其他讀取 (適用於任何剩餘的
ReadRows要求)
查詢類型定義
下表說明各個存取模式類別、其在 Monitoring 中對應的 query_type 標籤、適用的典型用戶端程式庫作業和基礎 Data API 方法 (method 指標標籤),以及 Bigtable 如何將要求歸入該類別。由於方法名稱因程式設計語言而異,表格列出代表性的用戶端程式庫方法名稱;如需特定語言的程式碼範例,請參閱讀取範例和寫入範例。如要瞭解簡單和複雜篩選器,請參閱本文的「簡單篩選器與複雜篩選器」一節。
| 查詢類型 | query_type 個指標標籤 |
用戶端作業和 Data API 方法 | 分類條件 |
|---|---|---|---|
| 點讀取 | QUERY_TYPE_POINT_READ |
單列讀取,例如 Data API: |
不使用篩選器或使用簡單篩選器,向前讀取單一資料列索引鍵,其中掃描和傳回的儲存格數量以及總回應大小,都保持在小型單一資料列限制內。 |
| 快速掃描 | QUERY_TYPE_SHORT_SCAN |
資料列範圍或前置字串掃描,例如具有單一範圍或前置字串的 Data API: |
單一連續資料列範圍的正向掃描,不使用篩選器或使用簡單篩選器,其中掃描和傳回的資料列和儲存格數量以及總回應大小保持在較小的範圍內。 |
| 反向短掃描 | QUERY_TYPE_REVERSE_SHORT_SCAN |
反向掃描,例如 Data API: |
反向掃描單一連續資料列範圍,不使用篩選器或使用簡單篩選器,且與短掃描一樣,不超出相同的資料列、儲存格和位元組限制。 |
| 反向掃描 | QUERY_TYPE_REVERSE_SCAN |
反向掃描,例如反向 Data API: |
任何不符合反向短掃描資格的反向讀取,例如超過短掃描資料列、儲存格或位元組限制的反向掃描、指定個別資料列索引鍵、掃描多個資料列範圍,或使用複雜篩選器。 |
| 稀疏讀取 | QUERY_TYPE_SPARSE_READ |
使用 Data API: |
任何正向讀取要求 (在點讀取、短掃描和反向掃描後評估),其中 Bigtable 掃描的資料列或儲存格數量遠多於傳回的數量,因為篩選器排除或未收集的儲存格等待垃圾收集。 |
| 大量讀取 | QUERY_TYPE_BULK_READ |
多列讀取,例如多鍵 Data API: |
指定一或多個資料列索引鍵,且不含篩選器或僅含簡單篩選器的正向讀取,超出點讀取限制 (例如要求多個資料列索引鍵或讀取大型單一資料列),且不符合稀疏讀取條件。 |
| 其他讀取 | QUERY_TYPE_OTHER_READ |
使用 Data API: |
任何不符合上述讀取類別的 |
| 寫入點 | QUERY_TYPE_POINT_WRITE |
簡單寫入、增量更新或小型批次寫入,例如 Data API: |
單列 |
| 其他寫入 | QUERY_TYPE_OTHER_WRITE |
大型批次寫入或大型簡易寫入,例如 Data API: |
任何超過點寫入限制的 |
| 讀寫 | QUERY_TYPE_READ_WRITE |
條件式寫入或附加,例如 Data API: |
任何條件式寫入 ( |
在要求數量和延遲時間指標中,Bigtable 會將未分類的要求 (例如 GoogleSQL for Bigtable 查詢) 標示為 QUERY_TYPE_UNKNOWN。
簡單篩選器與複雜篩選器
如要符合單點讀取、短掃描、反向短掃描或大量讀取的條件,ReadRows 要求不得使用無濾鏡,或必須使用簡易篩選器。
如果篩選器僅使用下列篩選器類型 (單獨使用或在有界限的 chain 篩選器中合併使用),Bigtable 會將其歸類為簡易篩選器。詳情請參閱「鏈結」。
- 無濾鏡 (
FILTER_NOT_SET) pass_all_filter或block_all_filtercolumn_range_filter、column_qualifier_regex_filter或family_name_regex_filtercells_per_column_limit_filter、cells_per_row_limit_filter或cells_per_row_offset_filtertimestamp_range_filter
如果 ReadRows 要求使用的篩選器類型不在上述清單中 (例如下列類型),或鏈結了大量篩選器,Bigtable 會將該要求視為使用複雜篩選器:
value_regex_filtervalue_range_filterrow_key_regex_filterrow_sample_filterinterleaveconditionsinkstrip_value_transformerapply_label_transformer
如果 reversed 為 true,Bigtable 會將這類要求歸類為反向掃描,否則會歸類為稀疏讀取 (如果掃描的資料列或儲存格數量明顯多於傳回的數量) 或其他讀取。
查看存取模式
您可以在 Google Cloud 控制台的執行個體層級或叢集層級,查看「Access patterns」(存取模式) 頁面。
查看執行個體的存取模式
在 Google Cloud 控制台中,開啟 Bigtable 執行個體清單。
按一下要查看指標的執行個體。
在導覽窗格的「觀測能力」下方,點選「存取模式」。
在「Cluster」(叢集) 清單中,選取要檢查存取模式的叢集。根據預設, Google Cloud 控制台會選取執行個體中的第一個叢集。
在「Group by」(分組依據) 清單中,選擇圖表的細分方式:
- 無:預設選項,會依存取模式細分所有圖表,例如
QUERY_TYPE_POINT_READ - 應用程式設定檔:依應用程式設定檔 ID 和存取模式細分所有圖表
- 資料表:依資料表 ID 和存取模式細分所有圖表
- 無:預設選項,會依存取模式細分所有圖表,例如
選用:如要變更日期範圍或切換自動重新整理功能,請使用日期範圍選取器。
查看叢集的存取模式
在 Google Cloud 控制台中,開啟 Bigtable 執行個體清單。
按一下要查看指標的執行個體。
執行個體總覽頁面隨即開啟。
在叢集表格中,按一下叢集 ID。
在導覽窗格中,按一下「Access patterns」(存取模式)。頁面會顯示所選叢集的指標。
在「Group by」(分組依據) 清單中,選擇圖表的細分方式:
- 無:預設選項,會依存取模式細分所有圖表,例如
QUERY_TYPE_POINT_READ - 應用程式設定檔:依應用程式設定檔 ID 和存取模式細分所有圖表
- 資料表:依資料表 ID 和存取模式細分所有圖表
- 無:預設選項,會依存取模式細分所有圖表,例如
選用:如要變更日期範圍或切換自動重新整理功能,請使用日期範圍選取器。
「存取模式」頁面上的圖表和指標
「Access patterns」(存取模式) 頁面提供下列指標的圖表:
| 指標 | 適用於 | 說明 |
|---|---|---|
| QPS 分布 | 叢集 資料表 應用程式設定檔 |
在所選日期範圍內,叢集每秒要求數 (QPS) 的匯總比例和平均速率,依 |
| 延遲 | 叢集 資料表 應用程式設定檔 |
伺服器端要求延遲時間隨時間變化的情形,按照 |
| QPS | 叢集 資料表 應用程式設定檔 |
一段時間內每秒的要求率,依 |
| 傳回的資料列數 | 叢集 資料表 應用程式設定檔 |
套用篩選器後,Bigtable 每秒針對讀取和讀寫要求傳回用戶端的資料列數。 |
| 掃描的資料列數 | 叢集 資料表 應用程式設定檔 |
Bigtable 處理讀取和讀寫要求時,每秒讀取的資料列數 (套用篩選器前)。比較「Scanned rows」(掃描的資料列) 和「Returned rows」(傳回的資料列),有助於找出效率不彰的讀取篩選器。 |
| 修改的資料列數 | 叢集 資料表 應用程式設定檔 |
寫入和讀寫要求每秒修改的資料列數。 |
| 處理的儲存格數 | 叢集 資料表 應用程式設定檔 |
Bigtable 在讀取和讀寫要求期間,每秒檢查的儲存格數量 (套用篩選器前),包括篩選掉或等待垃圾收集的儲存格。 |
| 傳送的儲存格數 | 叢集 資料表 應用程式設定檔 |
套用篩選器後,Bigtable 每秒傳回用戶端的儲存格數量。比較「Cells seen」(查看的儲存格) 與「Sent cells」(傳送的儲存格),有助於找出針對每個傳回的儲存格檢查多個儲存格的讀取要求。 |
| 傳送的位元組數 | 叢集 資料表 應用程式設定檔 |
每秒傳回的已編碼資料列資料位元組數。 |
您也可以使用 Cloud Monitoring API,以程式輔助方式查詢這些指標、在 Metrics Explorer 中查看,或將指標新增至自訂資訊主頁。bigtable_table 受監控資源上的每項 bigtable.googleapis.com/query_type/* 指標都包含下列標籤:
- 資源標籤:
project_id、instance、cluster和table - 指標標籤:
query_type、app_profile和method
如要進一步瞭解如何在 Monitoring 中查詢 Bigtable 指標,請參閱「使用 Monitoring 監控」和「指標」。
根據存取模式最佳化工作負載
您可以使用「Access patterns」(存取模式) 頁面上的指標,做出下列決策:
- 啟用記憶體內層,進行低延遲時間點讀取:如果每秒查詢次數分布、每秒查詢次數和延遲時間圖表顯示,資料表或應用程式設定檔有大量
QUERY_TYPE_POINT_READ要求,且讀取延遲時間目標嚴格,建議啟用 Enterprise Plus 版提供的記憶體內層。依「Table」(資料表) 或「App profile」(應用程式設定檔) 將圖表分組,找出哪些資料表和工作負載最能受惠。 - 使用 Data Boost 隔離大型掃描和批次讀取作業:如果您發現
QUERY_TYPE_BULK_READ或QUERY_TYPE_OTHER_READ要求數量龐大或定期激增,且與延遲敏感的服務流量共用叢集,請依「App profile」(應用程式設定檔) 分組依據,找出掃描作業的來源。透過專屬應用程式設定檔,轉送批次、報表或數據分析讀取作業,並設定使用 Data Boost 無伺服器運算,這樣大型掃描作業就不會與服務節點爭奪 CPU 資源。 - 減少篩選器負擔並調整垃圾收集:如果
QUERY_TYPE_SPARSE_READ要求率偏高、掃描的資料列遠高於傳回的資料列,或查看的儲存格遠高於傳送的儲存格,表示讀取要求掃描的資料,Bigtable 不會傳回用戶端。如要提高讀取效率,請按照下列步驟操作: - 將反向掃描替換為正向掃描:如果您發現
QUERY_TYPE_REVERSE_SCAN或QUERY_TYPE_REVERSE_SHORT_SCAN要求頻繁出現且延遲時間增加,請考慮設計資料列索引鍵,讓應用程式可以發出正向掃描。詳情請參閱「結構定義設計最佳做法」。