Skip to content

Fluentd 簡介

Fluentd 是一個開放源碼的數據收集器,廣泛用於日誌管理和數據管道搭建。以下是其主要特點和功能:

  • 統一日誌層:Fluentd 提供一個統一的日誌層,可以收集來自多個來源的數據。
  • 可擴展性:具有高度的可擴展性,支援多種插件,包括輸入、過濾和輸出插件。
  • 靈活的資料處理:支援各種資料格式的處理,包括 JSON 和 msgpack。
  • 高效的性能:為處理大規模數據而優化,能夠高效地處理大量數據。
  • 可靠的數據傳輸:支援數據緩衝和重試機制,確保數據可靠地傳輸到目的地。

基本架構

Fluentd 的架構包括以下幾個主要部分:

  • 輸入插件(Input Plugins):負責從各種來源收集數據。
  • 解析器(Parsers):將收集到的數據轉換為結構化格式。
  • 過濾器(Filters):對數據進行處理和轉換。
  • 輸出插件(Output Plugins):將處理後的數據發送到目標存儲系統。

應用場景

  • 日誌收集(Log Collection):Fluentd 可以集中管理來自各種伺服器、應用程序(Applications)的日誌。它支持多種日誌格式和來源,能夠高效地收集和轉發日誌數據。

  • 數據管道(Data Pipeline):透過構建數據管道,Fluentd 實現從多個來源收集、處理、轉換和分析數據。它的強大過濾器和插件系統使得數據在流轉過程中可以被有效地加工和豐富。

  • 監控和警報(Monitoring and Alerting):Fluentd 支持實時監控數據流和系統性能。透過與外部監控工具(如 Prometheus)的整合,它可以提供詳細的監控指標。此外,結合告警系統(如 Alertmanager),Fluentd 能在出現異常或特定條件觸發時及時發出警報,幫助維護系統的穩定性和可靠性。

架構

架構主要包含兩個核心組件:Collector(收集器)和 Aggregator(聚合器)。使用同一套軟體,僅透過設定檔來區別。

graph LR
    A[Server 1] -- log --> D[Aggregator Host]
    B[Server 2] -- log --> D[Aggregator Host]
    C[Server 3] -- log --> D[Aggregator Host]

Collector (收集器)

Collector 負責從各種來源(如應用程式、服務、或設備等)收集數據。它主要的功能包括:

  • 數據收集:從指定來源捕獲數據,如日誌檔案、數據庫、網絡等。
  • 數據過濾與轉換:在將數據發送到下一階段之前,進行必要的過濾與格式轉換。

Aggregator (聚合器)

Aggregator 負責接收來自一個或多個 Collectors 的數據,並進行進一步的處理。其主要功能包括:

  • 數據聚合:將來自不同來源的數據合併,以便進行統一處理。
  • 數據處理:執行更複雜的數據處理操作,如數據分析、存儲、或轉發到其他系統。

通訊協定

Fluentd 支持多種通訊協定來實現 Collector 與 Aggregator 之間的數據傳輸,包括但不限於:

  • HTTP/HTTPS:一種廣泛使用的協定,適用於不同的網絡環境。
  • Forward:Fluentd 專用的輕量級協定,支持數據壓縮與加密,適合於大規模的數據收集。
  • TCP/UDP:傳統的網絡協定,適用於簡單的數據傳輸需求。

安裝與注意事項

安裝步驟

  • Windows 安裝: 在 Windows 上,通過 td-agent MSI 安裝程式進行安裝。參考 Install by msi (Windows)

  • macOS 安裝: 在 macOS 上,可以使用 Homebrew 進行安裝。

    $ brew install fluentd
    
    參考 Install by Homebrew (macOS)

  • Linux (RPM 安裝): Fluentd 支援 RedHat 8 RPM Package 安裝方式。官方提供的 fluentd-package (td-agent) 簡化了安裝流程。

    # fluent-package 5 (LTS)
    $ curl -fsSL https://toolbelt.treasuredata.com/sh/install-redhat-fluent-package5-lts.sh | sh
    
    其他安裝方式包括 Install by Ruby GemInstall from Source

Linux 安裝注意事項

  1. 當 log 來自多台主機時,須注意設定時間同步機制 NTP (例如 ntpd),使 log 集中後,不同主機送來 log 的時間戳記一致,避免順序混亂。(單機測試時,可不考慮此項目)

  2. Linux 環境下要注意加入 File Descriptor,避免 Fluentd 存取檔案受限。不應低於 1024,建議設定為 65536

# 查詢現有 File Descriptor 數值
ulimit -n
可修改 /etc/security/limits.conf 檔案,內容如下
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536

  1. 優化網路設定,以支援高承載環境,相關設定資料可參考 Fluentd Before Installation

以 RPM 安裝 Fluentd (Linux)

Fluentd 採用 Ruby 語言開發(屬直譯語言),Fluentd 1.0 支援 RedHat 8 RPM Package 安裝方式。由於依賴 Ruby,為了簡化安裝,因此官方還提供 fluentd-package (td-agent)。可參考網址 Install by RPM Package (Red Hat Linux),建議使用 fluentd-package v5(LTS) 版本。

官方提供安裝指令如下:

# fluent-package 5 (LTS)
$ curl -fsSL https://toolbelt.treasuredata.com/sh/install-redhat-fluent-package5-lts.sh | sh

參考資料:
- fluentd-package 支援 RedHat 版本之對照表
- Fluentd-package 各版本之生命週期

此外,Fluentd 也提供了 Install by Ruby GemInstall from Source 等方式,來因應 fluentd-package 安裝程式無法因應 Linux OS 版本的狀況。

設定範例

以下提供 Fluentd 的 Collector 與 Aggregator 的配置範例,專注於處理結構化日誌(如 JSON 格式)。

Fluentd Collector 設定範例

<source>
  @type tail
  path /var/log/myapp.log
  pos_file /var/log/myapp.log.pos
  tag myapp.json
  format json
  read_from_head true
</source>

<match myapp.json>
  @type forward
  <server>
    host aggregator-host
    port 24224
  </server>
</match>
  • <source>:定義數據來源和如何讀取數據。
  • @type tail:使用 tail 插件來讀取檔案。
  • path:指定要追蹤的日誌檔案路徑。
  • pos_file:指定 pos 檔案位置,用於記錄已讀取到的日誌位置。
  • tag:為來源數據添加標籤,方便後續處理。
  • format json:指定日誌格式為 JSON。
  • read_from_head true:從檔案頭部開始讀取。

  • <match>:根據標籤進行數據處理。

  • @type forward:使用 forward 插件將數據轉發到其他 Fluentd。
  • <server>:定義要轉發到的目標伺服器。
    • host:Aggregator 的主機地址。
    • port:Aggregator 的接聽端口。

Fluentd Aggregator 設定範例

<source>
  @type forward
  port 24224
</source>

<match **>
  @type file
  path /var/log/aggregated-logs
  time_slice_format %Y%m%d
  compress gzip
</match>
  • <source>:定義數據來源和如何讀取數據。
  • @type forward:使用 forward 插件來接收來自 Collector 的數據。
  • port:定義此 Aggregator 監聽的端口。

  • <match>:根據標籤進行數據處理。

  • @type file:使用 file 插件來輸出數據到檔案。
  • path:指定輸出檔案的路徑。
  • time_slice_format:配置檔案的時間切片格式。
  • compress:設定輸出檔案的壓縮格式。

這些設定檔範例展示了如何在 Fluentd 中設定 Collector 與 Aggregator,以處理 JSON 格式的結構化日誌。Collector 負責從指定路徑讀取日誌並轉發到 Aggregator,而 Aggregator 則接收這些日誌並將它們存儲在指定位置,並可選擇進行壓縮。