08 August 2017

1. What’s fluentd?


fluentd是一個用來搜集data的open source,以及可以對搜集來的data進行簡單的分析, 甚至可以把搜集來的data再foward出去mongodb, Elasticsearch, S3, GCP…etc.

因為我們的API有好多台,在管理log時非常不方便,必須ssh進去每一台看,或者scp出來,這方法實在太落後, 因此最近才把fluentd整進來,我們應用的情景如下:

  • 安裝一台Log Server (儲存所有API上的log)
  • 每一台API Server都裝有fluentd,並且把本地的log foward to Log Server
  • 把本地的Log上傳至S3備份



2. Install fluentd (Setup log server)


首先在一台linux server(我選用ubuntu 16.04)裡面進行安裝log server, 這台server是要收來自各地API的log。安裝很簡單,只要一行指令就可以:

curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh | sh


安裝完以後要更改config,cofig路徑為/etc/td-agent/td-agent.conf,default config裡面有很多設定,預設fluentd會起三個port,分別給不同的用途使用,不過我們不需要用到這麼複雜,所以可以把config改成下面的配置


# source是指資料從哪裡來的
<source>
  @type forward # log source會來自於foward的
</source>

# match是用來定義,資料來源為某個tag時,要做的處理
<match api-server-1> # 記得把這個tag api-server-1改成你要的,tag意思是會把source tag為api-server-1的歸類到這個配置裡
 @type file # 把source儲存為file
 path /var/log/td-agent/api-server-1 # 儲存路徑
 time_slice_format %Y%m%d%H # 當file超過buffer_chunk_limit時,會做切割,此配置為切割的檔名
 time_slice_wait 10m
 time_format %Y%m%dT%H%M%S%z # file裡面的時間格式
 compress gzip # 使用gzip壓縮被切割的log
 utc
</match>


完成配置以後,就重啟fluentd。

$ /etc/init.d/td-agent restart



3. Setup fluentd client on API Server


這步驟標題雖然是setup fluentd client,但其實fluentd沒有server與client之分, 所以安裝方式和第二步驟其實是一樣的,決定他是client還是server的關鍵在於config, 安裝指令,

curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh | sh


安裝完以後,一樣要更改config,cofig路徑為/etc/td-agent/td-agent.conf,把config改成下面的配置

# source是指資料從哪裡來的
<source>
  @type tail # 資料會用tail的方式
  path /var/log/api-server-1/out.log # tail這個檔案
  pos_file /var/log/td-agent/api-server-1.log.pos # 紀錄out.log最後讀取的position
  tag api-server-1 # 送過去的tag,記得第二步驟的配置一致
  format none
</source>

# match是用來定義,資料來源為某個tag時,要做的處理
<match api-server-1>
  @type forward # 收到來自於api-server-1的log時,要進行foward
  heartbeat_interval 1s
  flush_interval 10s # 每10秒送一次
  
  # 送至哪個Server
  <server>
    name log-server
    host 123.123.123.123 # 記得改成自己的IP
    port 24224
  </server>

  # 如果失敗以後
  <secondary>
    @type file
    path /var/log/td-agent/forward-failed
  </secondary>
</match>


完成配置以後,就重啟fluentd,然後就可以去Log Server上的 /var/log/td-agent/底下看有沒有一個檔名為 api-server-1.xxxxxxxx的檔案。

$ /etc/init.d/td-agent restart




4. Forward log to S3


完成上面的前三步驟,基本上就沒問題了,這一部是進階的。fluentd有很多output plugin,像是S3, splunk, mongodb,甚至有很多人整合了Elasticsearch + Kibana,但我需求沒這麼複雜,所以先用S3就好。首先記得先去你的S3上面create a bucket。
接著要先安裝fluent-plugin-s3,然後可以使用fluentd提供的gem進行安裝,指令如下:

sudo /usr/sbin/td-agent-gem install fluent-plugin-s3

安裝完成之後,一樣去API-SERVER上改掉你的配置,改完以後應該每60秒會上傳一個part上去,記得在正式環境不要用60秒,配置如下:


# source是指資料從哪裡來的
<source>
  @type tail # 資料會用tail的方式
  path /var/log/api-server-1/out.log # tail這個檔案
  pos_file /var/log/td-agent/api-server-1.log.pos # 紀錄out.log最後讀取的position
  tag api-server-1 # 送過去的tag,記得第二步驟的配置一致
  format none
</source>

# match是用來定義,資料來源為某個tag時,要做的處理
<match api-server-1 >
  @type s3 # 上傳至S3
  aws_key_id xxxxxx # 記得換成你的key
  aws_sec_key # 記得換成你的key
  s3_bucket api-server-1 # 換成你的bucket name
  s3_region ap-northeast-1
  path logs/ # bucket name底下的folder
  buffer_path /var/log/td-agent/s3 # 在上傳上去前,緩存的地方

  time_slice_format %Y%m%d
  time_slice_wait 1m
  utc

  buffer_chunk_limit 256m
  flush_interval 60s  # 每60秒flush一次
</match>








blog comments powered by Disqus