sgykfjsm.github.com

ec2にfluentdをインストールする

目的

fluentdをec2に導入してS3にアップロードする。

導入

送出側と収集側はどちらもm1.micro、Amazon Linuxで用意した。
手順は公式のInstalling Fluentd Using rpm Packageに従った。

ファイルディスクリプタの数を変更する。

1
2
3
4
5
6
7
8
9
10
11
12
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ sudo cp -p /etc/security/limits.conf /etc/security/limits.conf.org
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ sudo vim /etc/security/limits.conf
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ diff /etc/security/limits.conf.org /etc/security/limits.conf
49a50,54
> root soft nofile 65536
> root hard nofile 65536
> * soft nofile 65536
> * hard nofile 65536
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ sudo shutdown -r now
# 再起動完了後に再度ログイン
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ ulimit -n
65536

ネットワークカーネルのパラメータ値を追加する。

1
2
3
4
5
6
7
8
9
10
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ sudo cp -p /etc/sysctl.conf /etc/sysctl.conf.org
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ sudo vim /etc/sysctl.conf
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ diff /etc/sysctl.conf.org /etc/sysctl.conf
40a41,45
>
> net.ipv4.tcp_tw_recycle = 1
> net.ipv4.tcp_tw_reuse = 1
> net.ipv4.ip_local_port_range = 10240    65535
>
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ sudo sysctl -w

インストールスクリプトを使ってtd-agentをインストールする。

大雑把に言うと、td-agentはfluentdの安定稼働版のようなもの。細かな違いはWhat is the difference with td-agent and Fluentd?を参照のこと。

1
2
3
4
5
6
7
8
9
10
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ sudo curl -L http://toolbelt.treasure-data.com/sh/install-redhat.sh | sh
# 省略
Installed:
  td-agent.x86_64 0:1.1.15-0

Dependency Installed:
  compat-libtermcap.x86_64 0:2.0.8-49.2.amzn1 compat-readline5.x86_64 0:5.2-17.3.amzn1 openssl098e.x86_64 0:0.9.8e-17.8.amzn1
  td-libyaml.x86_64 0:0.1.4-1

Complete!

起動

1
2
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ sudo /etc/init.d/td-agent start
Starting td-agent:                                         [  OK  ]

試しにサンプルログをPOSTしてみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ cat /var/log/td-agent/td-agent.log
2013-08-10 09:49:33 +0000 [info]: starting fluentd-0.10.36
2013-08-10 09:49:33 +0000 [info]: reading config file path="/etc/td-agent/td-agent.conf"
2013-08-10 09:49:33 +0000 [info]: using configuration file: <ROOT>
  <match td.*.*>
    type tdlog
    apikey YOUR_API_KEY
    auto_create_table
    buffer_type file
    buffer_path /var/log/td-agent/buffer/td
  </match>
  <match debug.**>
    type stdout
  </match>
  <source>
    type forward
  </source>
  <source>
    type http
    port 8888
  </source>
  <source>
    type debug_agent
    bind 127.0.0.1
    port 24230
  </source>
</ROOT>
2013-08-10 09:49:33 +0000 [info]: adding source type="forward"
2013-08-10 09:49:33 +0000 [info]: adding source type="http"
2013-08-10 09:49:33 +0000 [info]: adding source type="debug\_agent"
2013-08-10 09:49:33 +0000 [info]: adding match pattern="td.\*.\*" type="tdlog"
2013-08-10 09:49:33 +0000 [info]: adding match pattern="debug.\*\*" type="stdout"
2013-08-10 09:49:33 +0000 [info]: listening fluent socket on 0.0.0.0:24224
2013-08-10 09:49:33 +0000 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"
2013-08-10 09:50:44 +0000 debug.test: {"json":"message"}

Development toolsを入れる。

fluentdは自分でリポジトリを持っており、各種プラグインはそれを使ってインストールする。 最初にそのリポジトリをupdateするが、その際に必要となる諸々をDevelopment toolsを導入することで解決しておく。

1
2
3
4
5
6
7
8
9
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ sudo yum groupinstall -y "Development tools"
Loaded plugins: priorities, security, update-motd, upgrade-helper
amzn-main                                                                                                       | 2.1 kB     00:00
amzn-updates                                                                                                    | 2.3 kB     00:00
Setting up Group Process
# 省略
  systemtap-client.x86\_64 0:1.8-7.14.amzn1                        systemtap-devel.x86\_64 0:1.8-7.14.amzn1

Complete!

fluentdのリポジトリを更新しておく。

プラグインのインストールは必要に応じてしておけば良いので、とりあえずリポジトリを更新しておく。

1
2
# fluentdを導入した全てのサーバで実施しておくと良い。
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem update

結構時間がかかる。

ここまでと同じ作業をもう1台のサーバで行い、サーバ間でログのやり取りが出来るようにしておく。

もう1つのtd-agentにログを送出する。

とりあえずtd-agentが正常に導入できて動作も問題無さそうので、もう1つのtd-agentにログを送出する。 Fluentd High Availability Configurationを参考に設定する。

まずは送出側の設定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# TCP input
<source>
  type forward
  port 24224
</source>

# HTTP input
<source>
  type http
  port 8888
</source>

# Log Forwarding
<match sample.**>
  type forward

  # primary host
  <server>
    host 10.147.229.126
    port 24224
  </server>

  # use longer flush_interval to reduce CPU usage.
  # note that this is a trade-off against latency.
  flush_interval 60s
</match>

次に収集側の設定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Input
<source>
  type forward
  port 24224
  tag sample.app_log
</source>

# Output
<match sample.app_log>
  type file
  path /var/log/fluent/sample.app_Log.log
  time_slice_format %Y%m%d
  time_slice_wait 1m
  # compress gzip
  utc
</match>

設定ファイルを書き換えたら、それぞれのtd-agentを再起動する。再起動の際は/var/log/td-agent/td-agent.logをtailしながら行うと、不要な設定をしている際に気づくことができる。

送出側で先ほど試したのと同じcurlコマンドを使って、ログが収集側に来ていることを確認する。 また、Security Groupで予め設定したポート番号でTCPとUDPのポートを空けておくこと。 でないと、”no nodes are available”が発生する。

受け取ったログをS3にアップロードする。

受け手側でログを受け取れることを確認できたら、その受け取ったログをS3にアップロードする。 まずはプラグインのインストール。

1
2
3
4
5
[ec2-user@ip-zz-zzz-zzz-zzz ~]$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-s3
Successfully installed fluent-plugin-s3-0.3.4
1 gem installed
Installing ri documentation for fluent-plugin-s3-0.3.4...
Installing RDoc documentation for fluent-plugin-s3-0.3.4...

ついでにタグを動的に扱うプラグインとプレースホルダとかディレクティブの設定に繰り返し要素を埋め込めるプラグインも入れておく。これらがあると色々捗る。

1
2
3
4
5
6
7
8
9
10
11
12
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-forest
Fetching: fluent-plugin-forest-0.1.4.gem (100%)
Successfully installed fluent-plugin-forest-0.1.4
1 gem installed
Installing ri documentation for fluent-plugin-forest-0.1.4...
Installing RDoc documentation for fluent-plugin-forest-0.1.4...
[ec2-user@ip-xx-xxx-xxx-xxx ~]$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-config-expander
Fetching: fluent-plugin-config-expander-0.1.3.gem (100%)
  Successfully installed fluent-plugin-config-expander-0.1.3
  1 gem installed
  Installing ri documentation for fluent-plugin-config-expander-0.1.3...
  Installing RDoc documentation for fluent-plugin-config-expander-0.1.3...

次に収集側の設定ファイルを以下のようにする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Input
<source>
  type forward
  port 24224
</source>

# Output
<match sample.*>
  type forest
  subtype s3
  <template> # このディレクティブによって、S3へのアップロード設定がテンプレート化される。
    aws_key_id XXX
    aws_sec_key XXX
    s3_bucket dev.sgyk
    # http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
    s3_endpoint s3-ap-northeast-1.amazonaws.com
    # Fluentd-plugin-forestによって${tag}が送出側で設定したtagの値に展開される。
    path ${tag}/
    buffer_path /var/log/td-agent/buffer/${tag}
    # time_slice_format %Y-%m-%d-%H-%M # To write files every minutes
    time_slice_format %Y-%m-%d-%H
    time_slice_wait 60s
    utc
  </template>
</match>

修正後、td-agentを再起動するとこんなログが出るようになる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2013-08-10 17:11:19 +0000 [info]: out_forest plants new output: s3 for tag 'sample.app_log'
2013-08-10 17:11:21 +0000 [info]: out_forest plants new output: s3 for tag 'sample.str_log'

# ちなみに送出側で以下のようにcurlしている
# !/bin/bash
#
# i=0;
# str=`uuidgen | tr -d '-'`
# while(true)
# do
#   curl -X POST -d "json={\"i\":$i, \"json\":\"${RANDOM}\"}" http://localhost:8888/sample.app_log
#   curl -X POST -d "json={\"i\":$i, \"str\":\"${str}\"}" http://localhost:8888/sample.str_log
#   i=`expr $i + 1`
#   sleep 10
# done
#
# exit 0

あとは10分ほど経ってから指定したバケットを見に行くとgz形式で出力されているのが確認できる。