以程式化的方式配置 Cloud BigTable

在部分情況下,依據叢集 CPU 使用率等指標,以程式輔助方式進行 Cloud Bigtable 叢集的資源調度,是相當實用的方法。例如若叢集承受沉重負載,且其 CPU 使用率非常高,您可以新增節點至叢集,直到其 CPU 使用率下降為止。您也可以在叢集並未大量使用時,由叢集移除節點以節省成本。

本頁說明如何以程式輔助方式進行 Cloud Bigtable 叢集的資源調度,並提供可作為起始點的程式碼範例。其中也說明您在設定程式輔助資源調度之前,應留意的部分限制。

如何以程式輔助方式進行 Cloud Bigtable 資源調度

Cloud Bigtable 透過 Stackdriver Monitoring API 公開各種指標。您可針對本身叢集以程式輔助方式監控這些指標,然後使用其中一個 Cloud Bigtable 用戶端程式庫或 gcloud 指令列工具,依據現有指標新增或移除節點。調整叢集的大小後,您可以透過 GCP 主控台、Stackdriver Monitoring 自訂資訊主頁,或者使用程式來監控叢集的效能

監控 API 指標

監控 API 提供各種不同指標,協助您監控叢集目前的狀態。以程式輔助進行資源調度的部分實用指標包括:

  • bigtable.googleapis.com/cluster/cpu_load:叢集 CPU 負載。
  • bigtable.googleapis.com/cluster/node_count:叢集節點數量。
  • bigtable.googleapis.com/cluster/storage_utilization:使用的儲存空間佔總儲存空間容量的比例。
  • bigtable.googleapis.com/server/latencies:伺服器要求延遲在資料表的分佈情況。

程式碼範例

您可使用以下其中一種範例工具,作為本身程式輔助資源調度工具的起始點:

CPU 負載超過指定值時,範例工具可新增節點至 Cloud Bigtable 叢集。同樣地,如果 CPU 負載低於指定值,範例工具就會由 Cloud Bigtable 叢集移除節點。執行範例工具時,請遵循下列操作說明用於 GitHub 的各個範例。

範例工具使用下列程式碼收集叢集 CPU 負載的相關資訊:

Java

Timestamp now = timeXMinutesAgo(0);
Timestamp fiveMinutesAgo = timeXMinutesAgo(5);
TimeInterval interval =
    TimeInterval.newBuilder().setStartTime(fiveMinutesAgo).setEndTime(now).build();
String filter = "metric.type=\"" + CPU_METRIC + "\"";
ListTimeSeriesPagedResponse response =
    metricServiceClient.listTimeSeries(projectName, filter, interval, TimeSeriesView.FULL);
return response.getPage().getValues().iterator().next().getPointsList().get(0);

Python

client = monitoring_v3.MetricServiceClient()
cpu_query = query.Query(client,
                        project=PROJECT,
                        metric_type='bigtable.googleapis.com/'
                                    'cluster/cpu_load',
                        minutes=5)
time_series = list(cpu_query)
recent_time_series = time_series[0]
return recent_time_series.points[0].value.double_value

範例工具會依據 CPU 負載,使用 Cloud Bigtable 用戶端程式庫調整叢集大小。

Java

double latestValue = getLatestValue().getValue().getDoubleValue();
if (latestValue < CPU_PERCENT_TO_DOWNSCALE) {
  int clusterSize = clusterUtility.getClusterNodeCount(clusterId, zoneId);
  if (clusterSize > MIN_NODE_COUNT) {
    clusterUtility.setClusterSize(clusterId, zoneId,
      Math.max(clusterSize - SIZE_CHANGE_STEP, MIN_NODE_COUNT));
  }
} else if (latestValue > CPU_PERCENT_TO_UPSCALE) {
  int clusterSize = clusterUtility.getClusterNodeCount(clusterId, zoneId);
  if (clusterSize <= MAX_NODE_COUNT) {
    clusterUtility.setClusterSize(clusterId, zoneId,
      Math.min(clusterSize + SIZE_CHANGE_STEP, MAX_NODE_COUNT));
  }
}

Python

bigtable_client = bigtable.Client(admin=True)
instance = bigtable_client.instance(bigtable_instance)
instance.reload()

cluster = instance.cluster(bigtable_cluster)
cluster.reload()

current_node_count = cluster.serve_nodes

if scale_up:
    if current_node_count < max_node_count:
        new_node_count = min(
            current_node_count + size_change_step, max_node_count)
        cluster.serve_nodes = new_node_count
        cluster.update()
        print('Scaled up from {} to {} nodes.'.format(
            current_node_count, new_node_count))
else:
    if current_node_count > min_node_count:
        new_node_count = max(
            current_node_count - size_change_step, min_node_count)
        cluster.serve_nodes = new_node_count
        cluster.update()
        print('Scaled down from {} to {} nodes.'.format(
            current_node_count, new_node_count))

調整完叢集大小後,您可以使用 GCP 主控台Stackdriver Monitoring 自訂資訊主頁來監控叢集效能隨時間變化的情況。

限制

在您為 Cloud Bigtable 叢集設定程式輔助資源調度之前,請務必考量下列限制。

延遲提升效能

您新增節點至叢集後,可能需要 20 分鐘進行載入,叢集效能才會大幅提升。因此,若您的工作負載包含短暫爆發的高度活動,依據 CPU 負載新增節點至叢集並無法提升效能,因為等到 Cloud Bigtable 重新平衡資料時,短暫爆發的活動已經結束。

為了因應此項問題,您在叢集增加負載之前,可利用程式輔助或透過 Google Cloud Platform 主控台新增節點至叢集。這種方式可讓 Cloud Bigtable 有時間在其他節點之間重新平衡您的資料。

結構定義設計問題

如果您的表格存在結構定義設計問題,新增節點至 Cloud Bigtable 叢集可能無法提升效能。例如,若您大量讀取或寫入表格之中的單一列,所有讀取或寫入將前往叢集的相同節點,造成新增節點無法提升效能。相反地,如果讀取及寫入平均分佈在表格的各列之中,新增節點通常就能提升效能。

請參閱設計結構定義取得詳細資料,瞭解如何設計結構定義,讓 Cloud Bigtable 能夠有效進行資源調度。

相關資源

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Bigtable 說明文件