對于高通路量的web站點或者服務,可以采用Fluentd的高可用配置模式。
- 消息分發語義
Fluentd設計初衷主要是用作事件日志分發系統的。這類系統支援幾種不同的分發模式:
- 至多一次。消息被立即發送,若傳輸成功,該消息不會再被發送。發送失敗,則會導緻消息丢失。現實環境下會有很多情況導緻發送失敗,比如網絡暫時不可用。
- 至少一次。消息至少會被發送一次,若發送失敗,消息會被重發。這保證了消息不會被丢失,但可能導緻接收端收到重複的消息。
- 精确隻發一次。消息剛好發送一次,能確定送達且不會重複。這是大家所期望的分發模式。實作此模式可能需要采用同步化的日志處理方式,當達到發送瓶頸時,告知業務層已無法接收更多的日志。
為了在不影響業務性能的情況下收集大量的日志,日志層必須以異步的方式運作。是以,Fluentd隻提供了前兩種傳輸模式。
- 網絡拓撲
為使得Fluentd具備高可用性,典型的部署架構需要包含兩種不同角色的Fluentd子產品:轉發器(forwarder)和聚合器(aggregator)。其拓撲結構如下圖所示
轉發器部署在業務節點,用于收集業務方産生的本地日志事件,并将事件發送至聚合器。
聚合器持續地從轉發器接收日志,對日志進行緩存,并定期上傳日志到下一個處理方(典型的就是存儲)。
聚合器采用主備模式。如上圖,192.168.0.1為主,192.168.0.2為備。
- 轉發器配置
轉發器的典型配置如下所示:
# TCP input
<source>
@type forward
port 24224
</source>
# HTTP input
<source>
@type http
port 8888
</source>
# Log Forwarding
<match mytag.**>
@type forward
# primary host
<server>
host 192.168.0.1
port 24224
</server>
# use secondary host
<server>
host 192.168.0.2
port 24224
standby
</server>
# use longer flush_interval to reduce CPU usage.
# note that this is a trade-off against latency.
<buffer>
flush_interval 60s
</buffer>
</match>
這裡有兩個輸入源,使用forward插件将日志事件發送到兩個聚合器server中,其中通過standby指定192.168.0.2為備用聚合器。若兩個聚合器節點都不可用,日志将會緩存在轉發器節點。
- 聚合器配置
聚合器的典型配置如下所示:
# Input
<source>
@type forward
port 24224
</source>
# Output
<match mytag.**>
...
</match>
這個比較簡單,使用forward插件作為輸入源。日志會在本地緩存,并通過重傳機制確定能送達目的地。
- 失敗場景提示
- 轉發器收到業務層日志,在将日志寫入緩存之前發生崩潰
- 磁盤損壞
- 錯誤排查
$ telnet host 24224
$ nmap -p 24224 -sU host