使用 Fluentd 和 BigQuery 進行即時記錄分析

記錄一直以來都是讓您掌握大規模系統和應用程式效能表現的強大工具。但由於這些系統的規模和複雜度的增加,要管理多個分散在一系列基礎架構中的記錄也成了一項挑戰。

全球有 2,000 多家公司採用 Fluentd 這個開放原始碼記錄收集工具,將橫跨許多資料來源和系統的記錄集合,整合到一個統一的記錄層。由於我們很難事先得知哪些資料之後適合用來分析,因此常見的做法是將所有的資料都記錄下來,之後再進行分類。但收集和儲存所有資料可能會讓資料難以使用,讓取得答案變得緩慢且困難。

這就是 BigQuery 的優點:對於記錄深入分析十分有用。BigQuery 是 Google 的全代管、高度可擴充、平行查詢服務。與需要花上幾分鐘甚至幾小時的大型 MapReduce 工作不同,BigQuery 可在數十秒之內對幾 TB 的記錄執行查詢,讓您快速取得修正或改善系統所需的答案。

根據預設,您每秒可以串流 1 萬個記錄資料列到每個 BigQuery 表格,您還能透過要求將此限制提高到每秒 10 萬個資料列。若將資料流分割到多個 BigQuery 表格,並使用 Fluentd 到 BigQuery 外掛程式,您可以每秒超過 100 萬個資料列的速度,從數千部伺服器以近乎即時的方式將記錄直接載入 BigQuery。然後,您可以在 Google 試算表內建立資訊主頁,讓它每分鐘或每小時更新一次,輕鬆地將這項資料視覺化。

目標

  • 在 Google Compute Engine 執行個體中執行 nginx 網路伺服器。
  • 使用 Fluentd 將瀏覽器流量記錄至該伺服器。
  • 使用 BigQuery 網頁版 UI,以及在 Google 試算表中使用 Google Apps Script,查詢已記錄的資料。
  • 將查詢結果視覺化到 Google 試算表中的圖表,此圖表會自動重新整理。

事前準備

複製範例程式碼

如要將 GitHub 存放區複製到您的電腦,請執行以下指令:

git clone https://github.com/GoogleCloudPlatform/bigquery-fluentd-docker-sample

建立資料集和 BigQuery 表格

執行以下指令,建立名為 bq_test 的資料集:

bq mk bq_test

將目錄變更為您複製 GitHub 存放區的目錄:

cd bigquery-fluentd-docker-sample

執行以下指令,以提供的結構定義檔案 schema.json 所定義的資料名稱和類型,來建立 BigQuery 表格 access_log

bq mk -t bq_test.access_log ./schema.json

開啟 BigQuery 網頁版 UI,選取您的專案名稱,按一下 bq_test 資料集,然後選取 access_log 表格。確認表格是使用指定的結構定義建立。

建立 Google Compute Engine 執行個體

執行以下指令,建立名為 bq-test-instanceGoogle Compute Engine 執行個體

gcloud compute instances create "bq-test-instance" \
  --zone "us-central1-a"  \
  --machine-type "n1-standard-1"  \
  --scopes storage-ro,bigquery \
  --image-family=cos-stable \
  --image-project=cos-cloud

在 Docker 容器中執行 nginx 和 Fluentd

登入您剛建立的 Compute Engine 執行個體:

gcloud compute ssh bq-test-instance --zone=us-central1-a

在該 Compute Engine 執行個體中執行以下指令。請將 <YOUR_PROJECT_ID> 改成您的專案 ID:

sudo docker run -e GCP_PROJECT="<YOUR_PROJECT_ID>" -p 80:80 -t -i -d google/fluentd-bigquery-sample

此指令會開始下載 Docker 映像檔 google/fluentd-bigquery-sample,該映像檔會啟動並執行已使用 nginx 和 Fluentd 預先設定的 Docker 容器。

接著產生一些網頁瀏覽量,以確認 Fluentd 會傳送資料至 BigQuery:

  1. 在您的 VM 執行個體清單中找到 bq-test-instance,然後按一下「外部 IP」欄中的連結。在對話方塊中,選取 [允許 HTTP 流量],然後按一下 [套用]以新增防火牆規則。您應該會在視窗的右下角看到一個「活動」對話方塊,其中顯示「更新「bq-test-instance」的執行個體標記」訊息。請注意,標記是用來建立防火牆規則與執行個體之間的關聯。
  2. 更新完成後,再按一下外部 IP 連結,從瀏覽器存取 Compute Engine 執行個體上的 nginx 伺服器。您應該會看到一個顯示了「Welcome to nginx!」訊息的網頁。重複載入該網頁以產生一些瀏覽器要求。

使用 BigQuery 網頁版 UI 執行查詢

開啟 BigQuery 網頁版 UI,按一下 [撰寫查詢],然後執行以下查詢:

 SELECT * FROM [bq_test.access_log] LIMIT 1000

您應該會看到您剛傳送至網路伺服器的瀏覽器要求已記錄在 access_log 資料表中。請注意,系統可能需要幾分鐘的時間才能從 Fluentd 收到初始記錄項目。

這樣就大功告成了!您剛剛已經確認 Fluentd 收集了 nginx 存取記錄事件、將其匯入 BigQuery,還可以在網頁版 UI 中看到這些事件。在下一節中,您將使用 Apache Bench 工具傳送更多流量至該網頁,看看 Fluentd 和 BigQuery 如何即時處理大量記錄 (預設每秒最多可達 10K 資料列)。

從 Google 試算表執行查詢

除了在 BigQuery 網頁版 UI 中執行查詢外,您也可以使用本教學課程所提供的試算表副本,從 Google 試算表提交 SQL 陳述式至 BigQuery。該試算表包含一個 Apps Script,可執行 BigQuery 查詢、儲存結果,並在嵌入圖表中將結果視覺化。您可以將指令碼和對應的圖表設定為在指定的時間間隔 (例如每分鐘、每小時或每天) 自動更新。

在 Google 試算表中啟用 BigQuery API

如要從 Google 試算表執行 SQL 陳述式到 BigQuery,請按照以下操作說明進行:

  1. 開啟 BigQuery 和 Google 試算表整合的範例,然後選取 [檔案] > [建立副本...]
  2. 在試算表的副本中,選取 [工具] > [指令碼編輯器...]
  3. 在「指令碼編輯器」中,開啟「bq_query.gs」。這個指令碼可執行 BigQuery 查詢、將查詢結果儲存至工作表,然後產生圖表將查詢結果視覺化。
  4. 將預留位置文字 <<PUT YOUR SPREADSHEET URL HERE>> 改成試算表副本的網址。
  5. 將預留位置文字 <<PUT YOUR PROJECT ID HERE>> 改成專案 ID。選取 [檔案] > [儲存]
  6. 從指令碼編輯器選單中,選取 [資源] > [進階 Google 服務...] 檢查 BigQuery API 是否已開啟。
  7. 在「進階 Google 服務」對話方塊底部,按一下 Google Cloud Platform 主控台的連結。您應該會看到一個提示,要求您建立與試算表相關聯的新專案 ID。
  8. 瀏覽 BigQuery API 的 API 清單,將其狀態從「關閉」切換為「開啟」。您現在應該會在「已啟用的 API」清單的頂端看到 BigQuery API。
  9. 關閉主控台,然後在「進階 Google 服務」對話方塊中按一下 [確定]

查詢公開資料集

現在,試著從試算表執行範例 BigQuery 查詢:

  1. 在試算表副本中,開啟「BQ Queries」工作表,其中包含名為「gsod_temperature_LINE」的 BigQuery 查詢。此查詢會匯總公開的 GSOD 氣候資料庫中的年度溫度資料。

  2. 定義查詢的試算表列
  3. 選取 [Dashboard] > [Run All BQ Queries]。首次執行 BigQuery 時,畫面上會出現一個對話方塊,其中顯示「需要授權」的訊息。請按一下 [繼續] 和 [接受]
  4. 查詢完成後,您將會看到名為「gsod_temperature」的新工作表。開啟此工作表,並檢查其中是否包含查詢結果。
  5. 開啟「BigQuery Results Visualization」工作表,檢查其中是否包含下方的嵌入折線圖,呈現查詢傳回的溫度資料:

  6. 全球平均溫度、最低溫度和最高溫度資料的折線圖

查詢 Fluentd 資料

在上一步中,您對一個公開資料集執行了範例查詢。在本節中,您將查詢 Fluentd 收集的資料,以瞭解瀏覽器對 Compute Engine 執行個體發出的每秒要求數 (rps)。

開啟「BQ Queries」工作表。在下一個空白列中建立名為「access_log_LINE」的查詢,將「interval」(間隔時間) 設為「1」,並在「query」(查詢) 儲存格中輸入以下內容:

SELECT
  STRFTIME_UTC_USEC(time * 1000000, "%Y-%m-%d %H:%M:%S") as tstamp,
  count(*) as rps
FROM bq_test.access_log
GROUP BY tstamp ORDER BY tstamp DESC;

選取 [Dashboard] > [Run All BQ Queries],將查詢的結果儲存至名為「access_log」的新工作表中。開啟「access_log」以查看已查詢的記錄資料,然後開啟「BigQuery Results Visualization」工作表以查看對應的折線圖。(如果您沒有看到折線圖,請確定「BQ Queries」工作表中的查詢名稱包含「_LINE」字尾。) 由於您的 Compute Engine 執行個體還沒有許多瀏覽器造訪數,因此圖表不會包含太多資料。在下一節中,您將模擬較大的瀏覽器流量負載。

模擬負載

開啟本機終端機,然後執行以下指令,以使用 Apache Bench 工具模擬進入 nginx 伺服器的流量。將 <YOUR_EXTERNAL_IP> 改成 Compute Engine 執行個體的外部 IP。

ab -c 100 -n 1000000 http://<YOUR_EXTERNAL_IP>/

再次選取 [Dashboard] > [Run All BQ Queries]。開啟「access_log」工作表,您將看到查詢結果現在包含模擬的瀏覽器流量中的尖峰,而且此尖峰會顯示在「BigQuery Results Visualization」工作表的折線圖中。

設定自動執行查詢

如要自動執行這些查詢並定期重新整理圖表:

  1. 前往 [Tools] (工具) > [Script editor] (指令碼編輯器),然後選取 [Resources] (資源) > [Current project's triggers] (現有專案的啟動程序)。您將會看到尚未設定任何觸發條件。
  2. 按一下連結以新增觸發條件。
  3. 在「選擇您要執行的功能」選單中選取 [runQueries],在「選取活動來源」選取 [Time-driven] (時間驅動)、[Minutes timer] (分鐘計時器) 和 [Every minute] (每分鐘)。按一下 [Save] (儲存)。如此將會觸發 bq_query.gs 指令碼每分鐘執行一次。
  4. 返回「BigQuery Results Visualization」工作表,您將會看到「access_log」圖表每分鐘重新整理一次。

瀏覽器每秒要求數的折線圖

您剛剛已完成將 Google 試算表設定為針對 Fluentd 收集的資料集,自動執行 BigQuery 查詢,並即時將結果視覺化的步驟。

後續步驟

如果您要在試算表新增更多查詢,以下是一些使用須知:

  • 如要進一步瞭解在 Apps Script 中使用 BigQuery API,請參閱 BigQuery 服務
  • 如果您要在「BQ Queries」工作表新增查詢,請將查詢新增至下一個空白列。請勿在查詢之間留下空白列。
  • 當試算表使用新的查詢名稱執行查詢時,會使用該查詢的名稱做為標題,將查詢結果儲存在新的工作表中。
  • _AREA_BAR_COLUMN_LINE_SCATTER_TABLE 字尾新增至查詢名稱,可建立指定類型的新圖表至「BigQuery Results Visualization」工作表中。
    • 使用 _AREA_STACKED_BAR_STACKED_COLUMN_STACKED 字尾可建立堆疊圖表。
  • 針對 BARCOLUMN 類型的查詢,試算表最多會儲存 5 個結果列,而其他類型的查詢最多會儲存 100 個結果列。您可以在查詢的結尾加上 LIMIT 子句 (例如 LIMIT 20) 來明確地限制傳回的結果列數。
  • 如要按時間順序繪製圖表,請將查詢的第一個欄位設定為時間戳記或日期值。

如要進一步瞭解以串流方式將資料傳入 BigQuery:

清除

  1. 在本機終端機中發出 Ctrl+C 指令來停用 Apache Bench 工具。

  2. 從指令碼編輯器選取 [資源] > [現有專案的啟動程序],然後刪除「runQueries」觸發條件,停用自動執行 bq_query.gs 指令碼。

  3. 刪除資料集:在 BigQuery 網頁版 UI 中,將滑鼠游標移至專案名稱下的「bq_test」資料集上方,然後從下拉式選單中選擇 [刪除資料集]

  4. 刪除 Google Compute Engine 執行個體:

    gcloud compute instances delete bq-test-instance --zone=us-central1-a
    
本頁內容對您是否有任何幫助?請提供意見:

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

這個網頁
解決方案