使用 OpenTSDB 監控時間序列資料

本教學課程說明如何使用在 Google Kubernetes Engine (GKE)Cloud Bigtable上執行的 OpenTSDB,在 Google Cloud Platform (GCP) 上收集、記錄和監控時間序列資料

時間序列資料是一種非常有用的資產,可使用於多個應用程式,包括趨勢、監控和機器學習。您可以從伺服器基礎架構、應用程式的程式碼和其他來源產生時間序列資料。OpenTSDB 能以高精細程度收集和保留大量的時間序列資料。

本教學課程詳細說明如何使用 GKE 建立可擴充的資料收集層,並使用 Cloud Bigtable 處理收集到的資料。下圖說明此解決方案的整體架構︰

本教學課程解決方案 (在 GCP 上使用 TSDB) 的高階架構。

目標

  • 建立新的 Cloud Bigtable 執行個體。
  • 建立新的 GKE 叢集。
  • 將 OpenTSDB 部署至 GKE 叢集。
  • 將時間序列指標傳送到 OpenTSDB。
  • 使用 OpenTSDB 和 Grafana 將指標視覺化。

費用

本教學課程使用的 GCP 可計費元件包括:

  • Compute Engine
  • GKE
  • Cloud BigTable
  • Cloud Storage

使用 Pricing Calculator 來根據您的預測使用量產生預估費用。

初次使用 GCP 的使用者可能符合申請免費試用的資格。

事前準備

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 在 GCP Console 的專案選擇器頁面中,選取或建立 GCP 專案。

    前往專案選取器頁面

  3. 請確認您已啟用 Google Cloud Platform 專案的計費功能。瞭解如何確認您已啟用專案的計費功能

  4. 啟用Cloud Bigtable、Cloud Bigtable Admin、Compute Engine 和 Google Kubernetes Engine必要的 API。

    啟用 API

記下專案 ID,供後續步驟使用。

準備環境

您將使用 Cloud Shell 輸入本教學課程的指令。Cloud Shell 可讓您在 GCP 主控台中使用指令列,並包括 GCP 開發需要的 Cloud SDK 和其他工具。Cloud Shell 會顯示為 GCP 主控台底部的一個視窗。初始化可能需要幾分鐘的時間,但視窗會立即顯示。

  1. 啟用 Cloud Shell。

    啟用 Cloud Shell

  2. 將預設 Compute Engine 區域設定為您即將建立 Cloud Bigtable 叢集的區域,例如 us-central1-f

    gcloud config set compute/zone us-central1-f
    
  3. 複製包含範例程式碼的 git 存放區。

    git clone https://github.com/GoogleCloudPlatform/opentsdb-bigtable.git
    
  4. 前往範例程式碼目錄。

    cd opentsdb-bigtable
    

建立 Cloud BigTable 執行個體

本教學課程使用 Cloud Bigtable 儲存您收集的時間序列資料。您必須建立 Cloud Bigtable 執行個體才能完成這項工作。

Cloud Bigtable 是一個鍵/寬列儲存,特別適用於時間序列資料,如同時間序列資料的 Cloud Bigtable 結構定義設計中的說明。Cloud Bigtable 支援 HBase API,讓您可以輕鬆地使用針對 Apache HBase 設計的軟體 (例如 OpenTSDB)。您可以在 OpenTSDB 文件中學習 OpenTSDB 使用的 HBase 結構定義。

OpenTSDB 的一個重要元件是 AsyncHBase 用戶端,此元件讓它能以完全非同步、無封鎖、安全執行緒的方式大量寫入 HBase。當您同時使用 OpenTSDB 和 Cloud Bigtable 時,AsyncHBase 會以 AsyncBigtable 用戶端形式實作。

Cloud Bigtable 的一個關鍵特性是能夠輕鬆調度資源,以滿足您的需求。本教學課程使用單節點開發叢集,此叢集足以完成任務,而且經濟實惠。在開發叢集中啟用專案,並於準備好處理實際工作環境中的資料時,移至較大的實際工作環境叢集。Cloud BigTable 說明文件包含有關效能和資源調度的詳細討論,以協助您為自己的工作選擇叢集大小。

請按照以下步驟建立 Cloud Bigtable 執行個體:

  1. 前往 GCP 主控台中的 [Create Instance] (建立執行個體) 頁面。

    前往「CREATE INSTANCE PAGE」(建立執行個體) 頁面

  2. 在 [Instance name] (執行個體名稱) 方塊中,輸入執行個體的名稱。您可以使用 OpenTSDB instance 或您選擇的其他名稱。輸入執行個體名稱後,該頁面會自動設定 [Instance ID] (執行個體 ID) 和 [Cluster ID] (叢集 ID)

  3. 將「Instance type」(執行個體類型) 設定為「Development」(開發)

  4. 在 [Zone] (區域) 中選擇 [us-central1-f] 或您即將執行 OpenTSDB 的區域。

  5. 點擊 [Create] (建立)以建立執行個體。

記下 [Instance ID] (執行個體 ID) 和 [Zone] (區域) 的值。您在稍後的步驟中會用到這些值。

建立 GKE 叢集

GKE 提供代管的 Kubernetes 環境。建立 GKE 叢集後,可以將 Kubernetes pod 部署至該叢集。本教學課程使用 GKE 和 Kubernetes pod 執行 OpenTSDB。

OpenTSDB 將儲存與應用程式層分離,使其可以同時部署於多個執行個體之間。透過平行執行,可以處理大量的時間序列資料。將 OpenTSDB 包裝於 Docker 容器內,可以使用 GKE 輕鬆進行大規模部署。

請執行以下指令,以建立 Kubernetes 叢集。此作業可能需要幾分鐘才能完成:

gcloud container clusters create opentsdb-cluster --scopes \
"https://www.googleapis.com/auth/bigtable.admin",\
"https://www.googleapis.com/auth/bigtable.data"

將兩個額外的範圍新增至 GKE 叢集,可讓您的 OpenTSDB 容器與 Cloud Bigtable 互動。您可以從 Google Container Registry 提取映像檔,而無需新增 Cloud Storage 的範圍,因為在預設情況下,叢集可以從 Cloud Storage 讀取。在其他部署中,您可能需要其他範圍

本教學課程的其餘部分會使用位於 Container Registry 中的 gcr.io/cloud-solutions-images/opentsdb-bigtable:v1,這是一個預先建構的容器。用於建構容器的 DockerfileENTRYPOINT 指令碼位於教學課程存放區的 build 資料夾下。

使用設定資訊建立 ConfigMap

Kubernetes 提供了一種稱為 ConfigMap 的機制,將設定資訊與容器映像檔分開,讓應用程式具備更高的可攜性。OpenTSDB 的配置係於 opentsdb.conf 中指定。範例程式碼包含一個含有 opentsdb.conf 的 ConfigMap。您必須編輯此檔案,以反映執行個體的詳細資料。

建立 ConfigMap

編輯 OpenTSDB 配置,使用您在建立執行個體時使用的專案名稱、執行個體 ID 和區域。

  1. 若要開啟 Cloud Shell 內建的程式碼編輯器,請按一下 Cloud Shell 視窗頂端工具列中的鉛筆圖示。

  2. 選擇 opentsdb/configmaps 下的 opentsdb-config.yaml,在編輯器中將其開啟。

  3. 將預留位置文字替換成您在本教學課程前面設置的專案名稱、執行個體 ID 和區域。

  4. 看到 Cloud Shell 的提示時,從更新過的 opentsdb-config.yaml 建立 ConfigMap:

    kubectl create -f configmaps/opentsdb-config.yaml
    

在 Cloud Bigtable 中建立 OpenTSDB 資料表

使用 OpenTSDB 讀取或寫入資料之前,您必須在 Cloud Bigtable 中建立需要的資料表,以儲存該資料。請依照以下步驟建立 Kubernetes 工作,以建立資料表。

  1. 啟動工作:

    kubectl create -f jobs/opentsdb-init.yaml
    
  2. 這項工作可能需要一分鐘以上的時間才能完成。請定期執行以下指令,以驗證該工作已順利完成:

    kubectl describe jobs
    

    輸出應該會指出在 Pods Statuses 標題下有一件工作已順利執行。

  3. 執行以下指令,以取得資料表建立的工作記錄:

    pods=$(kubectl get pods  --show-all --selector=job-name=opentsdb-init \
    --output=jsonpath={.items..metadata.name})
    
    kubectl logs $pods
    

當您取得記錄時,請檢查輸出的底部,其中應該會指示出已建立的每一個資料表。此工作會執行數個資料表建立指令,每一個指令採用 create 'TABLE_NAME' 的形式。請找尋具有 0 row(s) in 0.0000 seconds 形式的一行指令,其中會列出實際的指令持續時間,而不是 0.0000

您的輸出應該會包含類似以下內容的部分:

create 'tsdb-uid',
  {NAME => 'id', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'},
  {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'}
0 row(s) in 1.3680 seconds

Hbase::Table - tsdb-uid

create 'tsdb',
  {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'}
0 row(s) in 0.6570 seconds

Hbase::Table - tsdb

create 'tsdb-tree',
  {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'}
0 row(s) in 0.2670 seconds

Hbase::Table - tsdb-tree

create 'tsdb-meta',
  {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'}
0 row(s) in 0.5850 seconds

Hbase::Table - tsdb-meta

您只需要執行此工作一次。如果資料表已經存在,會傳回錯誤訊息。如已有資料表,您可以使用現有的資料表繼續本教學課程。

資料模型

您剛剛建立的資料表將儲存來自 OpenTSDB 的資料點。在稍後的步驟中,您將把時間序列資料寫入這些資料表中。時間序列資料點的組織和儲存形式如下:

欄位 必填 說明 範例
metric 必填 正在測量的項目 ─ 預設鍵 sys.cpu.user
timestamp 必填 測量的紀元時間 1497561091
value 必填 測量值 89.3
標記 至少必須提供一個標記 為查詢目的限定測量

hostname=www

cpu=0

env=prod

部署 OpenTSDB

本教學課程的下列部分提供能讓範例情境生效的操作說明。下圖顯示您接下來將使用的架構:

本教學課程中用於寫入、讀取和視覺化時間序列資料的架構圖。

本教學課程使用兩個 Kubernetes 部署。其中一個部署將指標傳送到 OpenTSDB,另一個則從 OpenTSDB 讀取。使用兩個部署可以避免長時間執行的讀取和寫入彼此互相封鎖。每個部署中的 pod 使用相同的容器。OpenTSDB 提供名為 tsd 的精靈,在每一個容器中執行。

單個 tsd 程序每秒可以處理總處理量很大的事件。為了分散負載,本教學課程中的部署會建立三個讀取與寫入 pod 的備用資源。

建立用於寫入指標的部署

寫入器部署的配置資訊位於教學課程存放區 deployments 目錄下的 opentsdb-write.yaml。使用以下指令來建立:

kubectl create -f deployments/opentsdb-write.yaml

建立用於讀取指標的部署

讀取器部署的配置資訊位於教學課程存放區 deployments 目錄下的 opentsdb-read.yaml。使用以下指令來建立:

kubectl create -f deployments/opentsdb-read.yaml

在實際運作部署中,您可以使用手動方式或在 Kubernetes 中使用自動調度資源增加執行中的 tsd pod 數目。同樣,您可以手動或使用叢集自動配置器增加 GKE 叢集中的執行個體數目。

建立 OpenTSDB 服務

為了提供與部署一致的網絡連線,您將建立兩個 Kubernetes 服務。其中一個服務將指標寫入 OpenTSDB,另一個服務則會讀取。

建立寫入指標的服務

指標寫入服務的配置資訊包含於教學課程存放區 services 目錄下的 opentsdb-write.yaml。請使用以下指令來建立服務:

kubectl create -f services/opentsdb-write.yaml

此服務建立於 GKE 叢集內,可供叢集中執行的其他服務存取。在本教學課程的下一部分,您會將指標寫入此服務。

建立讀取指標的服務

指標讀取服務的配置資訊包含於教學課程存放區 services 目錄下的 opentsdb-read.yaml。請使用以下指令來建立服務:

kubectl create -f services/opentsdb-read.yaml

將時間序列資料寫入 OpenTSDB

有幾種機制可以寫入資料到 OpenTSDB 中。定義服務端點後,您可以指示程序開始向其寫入資料。本教學課程使用 Heapster 示範寫入資料。您的 Heapster 部署會收集有關 GKE 的資料,並從執行 OpenTSDB 的 GKE 叢集發佈指標。

使用以下指令,將 Heapster 部署至叢集:

kubectl create -f deployments/heapster.yaml

使用 OpenTSDB 檢驗時間序列資料

您可以使用本教學課程前面部署的 opentsdb-read 服務端點來查詢時間序列指標。您可以透過各種方式使用資料,其中一個常見的方法是將資料視覺化。OpenTSDB 包含一個基本介面,可以顯示它收集的指標。本教學課程使用 Grafana,這是一種流行的替代方案,用於將提供附加功能的指標視覺化。

設置 Grafana

在叢集中執行 Grafana 需要的過程類似於設置 OpenTSDB 的過程。除了建立 ConfigMap 和部署之外,您還需要設定通訊埠轉送,以便 Grafana 在 GKE 叢集中執行時可以存取它。

使用下列步驟設置 Grafana

  1. 使用教學課程存放區 configmaps 目錄下 grafana.yaml 中的配置資訊建立 Grafana ConfigMap

    kubectl create -f configmaps/grafana.yaml
    
  2. 使用教學課程存放區 deployments 目錄下 grafana.yaml 中的配置資訊建立 Grafana 部署。

    kubectl create -f deployments/grafana.yaml
    
  3. 取得叢集中 Grafana pod 的名稱,並使用名稱設置通訊埠轉送。

    grafana=$(kubectl get pods --show-all --selector=app=grafana \
      --output=jsonpath={.items..metadata.name})
    
    kubectl port-forward $grafana 8080:3000
    
  4. 驗證轉送已經成功。輸出應符合以下內容:

    Forwarding from 127.0.0.1:8080 -> 3000
    Forwarding from [::1]:8080 -> 3000
    

連線至 Grafana 網路介面

在 Cloud Shell 中按一下 [Web Preview] (網頁預覽),然後選取 [Preview on port 8080] (在通訊埠 8080 上預覽)

新的瀏覽器分頁將會開啟,並連線至 Grafana 網路介面。稍後瀏覽器會顯示如下圖形:

範例 Grafana 視覺化

此一 Grafana 部署是為本教學課程自訂。configmaps/grafana.yamldeployments/grafana.yaml 檔案設定 Grafana 將連線至 opentsdb-read 服務,允許匿名驗證,並顯示一些基本的叢集指標。實際工作環境中的 Grafana 部署應實施適當的驗證機制,並使用更廣的時間序列圖。

清理

如何避免系統向您的 Google Cloud Platform 帳戶收取在本教學課程中使用資源的相關費用:

  1. 刪除 GKE 叢集,以終止先前使用 kubectl create 指令建立的所有成果:

    gcloud container clusters delete opentsdb-cluster
    

    若要刪除 GKE 叢集,請鍵入 Y 或按 Enter 確認。

  2. 若要刪除 Cloud Bigtable 叢集,請按一下 Google Cloud Platform 主控台中的 [Products & services] (產品與服務) 。按一下 [Bigtable] ,以選擇先前建立的叢集,然後按一下 [Delete] (刪除)

後續步驟

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

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

這個網頁
解決方案