Fluentd是一個開源的數據收集器,專為處理數據流設計,有點像 syslogd
,但是使用JSON作為數據格式。它采用了插件式的架構,具有高可擴展性高可用性,同時還實現了高可靠的信息轉發。
據分(Y)析(Y),Fluentd是由Fluent+d得來,d生動形象地標明了它是以一個守護進程的方式運行。官網上將其描述為data collector,在使用上,我們可以把各種不同來源的信息,首先發送給Fluentd,接着Fluentd根據配置通過不同的插件把信息轉發到不同的地方,比如文件、SaaS Platform、數據庫,甚至可以轉發到另一個Fluentd。
總結一下,數據流殊途,同歸與Fluentd,Fluentd做一些諸如過濾、緩存、路由等工作,將其轉發到不同的最終接收方。
用Fluentd處理數據還能保證一定的實時性,其提供種類豐富的客戶端lib,很適合處理單位時間emit出log數量巨大的場景。從v10后,Fluentd 不支持 Windows。
其采用Ruby編寫,比較注重性能的地方采用C編寫,Ruby的創始人松本老師這樣評價Fluentd:
Fluentd proves you can achieve programmer happiness and performance at the same time. A great example of Ruby beyond the Web.
Heroku的聯合創始人Adam Wiggins說的挺有道理:
Logs are streams, not files. I love that Fluentd puts this concept front-and-center, with a developer-friendly approach for distributed systems logging.
更多信息請看 這里 。
安裝
安裝前的准備工作
-
安裝
ntpd
ntpd
,以d結尾,是一個守護進程,全稱是Network Time Protocol (NTP) daemon,它通過與一個Internet標准時鍾服務器同步來維護系統時鍾,同時也可以將本機做為一個時鍾服務器對外提供時鍾同步服務。更多信息請man一下ntpd。安裝ntpd是為了防止Fluentd在收集log的時候出現非法的時間戳。
增加系統文件描述符的最大數量 通過ulimit查看當前的文件描述符的最大數量: $ ulimit -n 如果是1024,那是遠遠不夠的,將下面4行添加到 /etc/security/limits.conf 中,重啟機器。 root soft nofile 65536 root hard nofile 65536 * soft nofile 65536 * hard nofile 65536 之后用ulimit查看,應該是65536了。
(Optional)優化機器內核TCP/IP參數
如果Fluentd處於一個高負載的運行環境,比如一個機器中運行了多個Fluentd實例,那么最好將下面的參數添加到 /etc/sysctl.conf
中:
net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.ip_local_port_range = 10240 65535
然后執行 sysctl -w
或者重啟機器使之生效。
這個跟TCP/IP的細節有關系,我沒有深究,貌似是為了防止短連接數過多,機器處於 TIME_WAIT
狀態的TCP連接數過多,開啟快速回收與重用。具體請參考 這里 。
安裝Fluentd
寫在前面
有 很多種方式 來安裝Fluentd,比如通過Ruby的Gem,以及Ubuntu的deb、OS X的Homebrew。
采用Ruby的Gem安裝比較簡單,安裝的是基本版的Fluentd,即不自帶 /etc/init.d
腳本,在運行時內存分配采用的是操作系統默認的方式;
而采用.rpm/.deb for Linux的方式安裝呢,安裝的是一個由 Treasure Data, Inc 維護的穩定版本Fluentd,又被稱為td-agent。為了保持一個良好的靈活性,Fluentd采用Ruby編寫,性能要求比較高的地方采用C編寫,考慮到一般的用戶可能安裝操作Ruby有困難,因此該公司維護並提供了一個穩定版本的Fluentd。該版本的Fluentd在內存分配上采用了着重避免內存碎片分配實現 jemalloc 。兩個版本的區別可以在這 查看 。
那么我們到底選用哪種方式呢,根據官方的文檔。td-agent強調new features的穩定性,如果希望自己控制Fluentd的features,自己手動去更新,采用gem的方式安裝。如果是第一次使用Fluentd或者在大規模的生產環境使用,推薦安裝td-agent,每2-3個月,td-agent就會發布一個新的版本。
在Ubuntu 12.04上安裝Fluentd
注意 這種方式截止到筆者發稿僅支持一下兩個Ubuntu的版本:
- Ubuntu 12.04 LTS / Precise
- Ubuntu 10.04 LTS / Lucid
可以在 這里 查看最新進展。
-
(Optional but Recommend)設置GPG Key
deb包使用 Treasure Data GPG key 簽名,首先將 GPG key 導入apt:
$ apt-key add /path/to/RPM-GPG-KEY-td-agent
-
執行下面的腳本
echo "This script requires superuser access to install apt packages." echo "You will be prompted for your password by sudo." # clear any previous sudo permission sudo -k # run inside sudo sudo sh <<SCRIPT # add treasure data repository to apt echo "deb http://packages.treasure-data.com/precise/ precise contrib" > /etc/apt、sources.list.d/treasure-data.list # update your sources apt-get update # install the toolbelt apt-get install -y --force-yes td-agent SCRIPT
即安裝完畢。
也可執行下面的的命令:
$ curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-precise.sh | sh
其實腳本內容就是上面的,我粘過去的。
-
啟動Fluentd的守護進程
因為我們安裝的是td-agent,自帶
/etc/init.d/td-agent
腳本,通過該腳本啟動Fluentd服務。$ /etc/init.d/td-agent restart * Restarting td-agent td-agent $ /etc/init.d/td-agent status * ruby is running
同時還支持以下命令:
$ /etc/init.d/td-agent start $ /etc/init.d/td-agent stop $ /etc/init.d/td-agent restart $ /etc/init.d/td-agent status
配置文件在:
/etc/td-agent/td-agent.conf
-
測試
默認在配置文件中td-agent在8888端口監聽,接收來自HTTP的log信息,並把其路由到stdout(
/var/log/td-agent/td-agent.log
),可以用curl命令測試:$ curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
之后打開
/var/log/td-agent/td-agent.log
,可以見到已經輸出了信息:
后記
現在我們已經准備好使用Fluentd收集日志信息了。接下來就是配置和實際應用。
簡介
Fluentd是一個開源的數據收集器,專為處理數據流設計,有點像 syslogd
,但是使用JSON作為數據格式。它采用了插件式的架構,具有高可擴展性高可用性,同時還實現了高可靠的信息轉發。