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 的使用之前做過一定總結,這裏不再贅述。
可以參考:
輕量級日誌收集轉發 | fluent-bit外部插件詳解(三)
fluent-bit 自身具有高性能,佔用內存低的特點,用的過程暫時沒有發現什麼問題,如果非要說問題,大多是自身使用的問題,因爲使用 fluent-bit 的用戶基本上都是結合 Kubernetes 進行使用的,而 fluent-bit 每次收集日誌之所以能記住偏移量,是得益於自身集成的 sqllite 數據庫,這個小型數據庫切記要掛載到宿主機,否則會出現收集數據重複的問題;如果出現其它問題,煩請查看日誌,大多都是犯了低級錯誤。
推薦:
Jenkins 配合 Kubernetes 實現服務持續集成的實踐和建議
Kubernetes中如何使用ClusterDNS進行服務發現?
從Ice到Kubernetes容器技術,微服務架構經歷了什麼?
原創不易,隨手關注或者”在看“,誠摯感謝!