淺談 fluentd 使用

fluentd 作爲開源的數據收集框架。C/Ruby開發,支持使用JSON文件來統一日誌數據。可插拔架構,支持各種不同種類和格式的數據源和數據輸出。最後它也同時提供了高可靠和很好的擴展性,fluentd 的性能已在許多大型服務中得到檢驗。實際上,一個普通的 PC 機一次可以處理18,000 條消息/秒。

Treasure Data, Inc 對該產品提供支持和維護。fluent-bit 是一個用 C 寫成的插件式、輕量級、多平臺開源日誌收集工具。它允許從不同的源收集數據併發送到多個目的地。這個兩個日誌收集組件完全兼容docker 和kubernetes 生態環境。隨着 Kubernetes 的強勢崛起,業務分佈在多個計算節點,日誌收集凸顯重要,本文主要講述本人在使用 fluentd 和 fluent-bit 中碰到的問題,以及解決方法。


1、td-agent 和 fluentd 有什麼區別?


Fluentd

td-agent

支持

社區驅動

Treasure Data提供支持和維護

安裝

Ruby gems

rpm / deb / dmg 軟件包

配置

自己配置

預配置了幾個建議設置 

其它組件

$ fluent-gem install fluent-plugin-xx

$ /usr/sbin/td-agent-gem install fluent-plugin-xx

/etc/init.d/  腳本

內存分配方式

系統默認

優化(jemalloc)

2、應該選擇 fluentd 還是 td-agent?
td-agent 是基於 fluentd 核心功能開發,td-agent 優先考慮穩定性而不是新功能。如果您希望自己控制Fluentd功能和更新,建議使用 Fluentd gem。如果您是第一次使用 Fluentd 或在生產環境集羣環境中使用它,建議使用td-agent。每2或3個月發佈一次新版本的td-agent。

3、fluentd 界面在哪裏?

不知道是不是我使用存在問題,不論是使用 fluentd  或者 td-agent3 的最新版本,界面的都是無法安裝的,記得在使用 ruby gem 安裝 fluentd 界面,一直在下載各種插件,最後提示下載失敗 。安裝 td-agent 時候官方直接說明 td-agent 最新版本界面和後臺服務已經分離。

 問題來了,分離之後界面如何獲取呢?不知道,沒有找到文檔說明。如果登錄 github 上面確實把 ui 分離出來了,但是不知道是不是我本地網絡原因,一直沒有安裝成功。

爲了驗證界面功能,後來我在文檔上找到 2.5 版本的介紹,安裝完成後,啓動 td-agent-ui 界面是可以正常使用的。

具體參考:

https://docs.fluentd.org/v/0.12/articles/install-by-rpm

# td-agent 2.5 or later. Only CentOS/RHEL 6 and 7 for now.
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.5.sh | sh
# td-agent 2.3 or earlier
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

其實總結起來說呢,界面提供了配置和日誌檢索界面,沒有權限管理概念,囿於程序員本身更是喜歡在 linux vim 下查看日誌,暫時放棄界面功能;只把它用作後臺日誌集中收集功能。

4、fluentd 基於 file 的緩存問題

fluentd 本身支持內存和文件兩種緩存方式,但是在使用基於文件的緩存過程中,你會發現一個問題是 tag 標籤不能被替換,原因大概是因爲,特定日誌數據在沒有到來之前 緩存 tag 已經生成,但是它不知道用什麼名字來替代 tag,所以乾脆直接使用 ${tag}, 但是生成之後的文件目錄確實是正常的,當然如果你是基於內存,或者把 fluentd 收集完成的日誌發送到 ES 等存儲中,則沒有此類問題。官方也有說明,新版本會有其它的解決方式,但並不完美,具體請參考:

https://docs.fluentd.org/output/file

5、fluentd 啓動錯誤

如果使用 td-agent 的方式進行安裝 fluentd,它自身會生成開機自啓動腳本,但是日誌文件必須是 td-agent 用戶,否則的話,啓動會出現下面錯誤

2018-12-06 19:12:05 +0800 [warn]: secondary type should be same with primary one primary=“Fluent::TreasureDataLogOutput” secondary=“Fluent::Plugin::FileOutput”
2018-12-06 19:12:05 +0800 [error]: config error file="/etc/td-agent/td-agent.conf" error_class=Fluent::ConfigError error=“out_file: /var/log/fluent/access.20181206_**.log is not writable”

其實修復也很簡單,賦予 td-agent 用戶讀寫權限即可。

chown td-agent:td-agent /var/ -R

或者不使用 td-agent 默認啓動腳本,直接使用 td-agent 啓動。本身的安裝方式非常簡單,當然你也可以基於鏡像進行啓動。

具體可以參考:

https://docs.fluentd.org/installation/install-by-rpm

6、使用 file 作爲 output 總是輸出到不同文件

大多使用場景,是把多個節點上的日誌彙總到一個節點,然後同樣的方式生成本地日誌文件,但是會發現,每次都新生成一個文件,可能更希望把同類的日誌輸出到一個文件,按照預想的方式進行分割文件,而不是直接生成,其實 fluentd 指令中有一個叫做 append 的指令,默認是 false ,配置成 true 即可。

具體請參考:

https://docs.fluentd.org/output/file

7、fluentd 和 fluent-bit 的關係

在當今社會日誌收集場景和需求多變和出乎意料的,爲了滿足日誌收集的靈活性,我們會根據需求選擇不同的插件,比如:ELK常見解決方案,當前我們主要介紹 fluentd 和 fluent-bit 兩個開源項目之間的關係。fluentd 和 fluent-bit 都是有 Treasure Data 公司贊助開發,目標是解決日誌收集、處理和轉發。

這兩個項目有很多相似之處,fluent-bit 完全基於 fluentd 體系結構和一般設計的設計和經驗。從體系結構的角度來看,選擇使用哪個取決於使用場景,我們可以考慮:

  • fluentd 是日誌收集器,處理器和聚合器。

  • fluent-Bit 是一個日誌收集器和處理器(它沒有 fluentd 等強大的聚合功能)。


fluentd

fluent-bit

範圍

容器/服務器

容器/服務器

語言

C和Ruby

C

內存佔用

約40MB

約450KB

性能

高性能

高性能

依賴關係

作爲Ruby Gem構建,主要依賴gems

除了一些安裝編譯插件(GCC、CMAKE)其它零依賴。

插件支持

超過650個可用插件

大約35個可用插件

許可證

Apache許可證2.0版

Apache許可證2.0版

根據兩個組件不同特點可以考慮將 fluentd 主要用作聚合器,將 fluent-bit 作爲日誌轉發器,兩個項目相互補充,從而提供了完整的可靠輕量級日誌解決方案。fluent-bit 支持平臺如下表所示:

操作系統

平臺

cpu架構

Linux

Centos 7

x86_64


Debian 8 (Jessie)

x86_64


Debian 9 (Stretch)

x86_64


Raspbian 8 (Debian Jessie)

AArch32


Raspbian 9 (Debian Stretch)

AArch32


Ubuntu 16.04 (Xenial Xerus)

x86_64


Ubuntu 18.04 (Bionic Beaver)

x86_64

從體系結構支持的角度來看,fluent-bit 在基於 x86,x86_64,AArch32 和 AArch64 的處理器上具有全部功能。Fluent Bit 也可以在OSX 和 * BSD 系統上工作,但並非所有插件在所有平臺上都可用。官方支持將根據社區需求而擴大。至於 fluent-bit 的使用之前做過一定總結,這裏不再贅述。

可以參考:

K8S集羣模式下fluent-bit日誌收集方案設計和實踐

輕量級日誌收集轉發 | fluent-bit外部插件詳解(三)

輕量級日誌收集轉發 | fluent-bit配置詳解(二)

輕量級日誌收集轉發 | fluent-bit指令詳解(一)

一文了解日誌收集工具fluent-bit

面對海量日誌,爲什麼選用fluentd作爲核心組件?

fluent-bit 自身具有高性能,佔用內存低的特點,用的過程暫時沒有發現什麼問題,如果非要說問題,大多是自身使用的問題,因爲使用 fluent-bit 的用戶基本上都是結合 Kubernetes 進行使用的,而 fluent-bit 每次收集日誌之所以能記住偏移量,是得益於自身集成的 sqllite 數據庫,這個小型數據庫切記要掛載到宿主機,否則會出現收集數據重複的問題;如果出現其它問題,煩請查看日誌,大多都是犯了低級錯誤。

推薦:


Kubernetes排障指南

深入探究 K8S ConfigMap 和 Secret

Jenkins 配合 Kubernetes 實現服務持續集成的實踐和建議

Kubernetes中如何使用ClusterDNS進行服務發現?

Kubernetes入門培訓(內含PPT)

從Ice到Kubernetes容器技術,微服務架構經歷了什麼?


原創不易,隨手關注或者”在看“,誠摯感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章