2013年4月16日火曜日

Amazon Linux (EC2) で Fluentd(td-agent)を試す

php環境での使用を想定しているのでrubyのインストールはせず、
td-agentがAmazon Linuxで動作するか試してみた。
ちなみにrubyでも導入は簡単そうでした。

参考

http://docs.fluentd.org/articles/install-by-rpm
http://docs.fluentd.org/articles/php

検証環境

  • OS Amazon Linux 64bit
  • インスタンスの種類 マイクロインスタンス
  • ログの受信用サーバ1インスタンス
  • ログの送信用サーバ1インスタンス
  • PHP5.4から任意の値を送信(FuelPHP上で使ってみた)

1. td-agentのインストール

#次の1行をec2-userで実行した。
curl -L http://toolbelt.treasure-data.com/sh/install-redhat.sh | sh

ビルド済みのパッケージをインストールするだけなので、microインスタンスでもすぐに完了した。
Installing:
 td-agent            x86_64     1.1.12-0              treasuredata     20 M
Installing for dependencies:
 compat-libtermcap   x86_64     2.0.8-49.2.amzn1      amzn-main        16 k
 compat-readline5    x86_64     5.2-17.3.amzn1        amzn-main        156 k
 openssl098e         x86_64     0.9.8e-17.8.amzn1     amzn-main        894 k
 td-libyaml          x86_64     0.1.4-1               treasuredata     125 k

2. 設定ファイル(ログ受信側)

/etc/td-agent/td-agent.conf
<source>
  type forward
  port 24224
</source>
<match log.**>
  type file
  path /var/log/fluent/log
  time_slice_format %Y%m%d%H (1時間毎にファイル分割してみた)
  time_slice_wait 10m
  time_format %Y%m%d %H:%M:%S
  compress gzip
</match>

3. 設定ファイル(ログ送信側)

/etc/td-agent/td-agent.conf
<source>
  type unix
  path /var/run/td-agent/td-agent.sock
</source>
<match log.**>
  type forward
  send_timeout 60s
  recover_wait 10s
  heartbeat_interval 1s
  phi_threshold 8
  hard_timeout 60s
  <server>
    host 10.***.***.***(受信サーバのプライベートIPアドレス)
    port 24224
  </server>
  <secondary>
    type file
    path /var/log/fluent/forward-failed
  </secondary>
</match>

4. SecurityGroupsの設定

td-agentは、デフォルトで24224番ポートを使用するが、
TCPとUDPの両方を使用するので、両方開けておく必要がある。
http://docs.fluentd.org/articles/in_forward
http://docs.fluentd.org/articles/out_forward

5. td-agentの起動

送信、受信双方のtd-agentを起動する。
起動
/etc/init.d/td-agent start
停止
/etc/init.d/td-agent stop
再起動
/etc/init.d/td-agent restart
状態確認
/etc/init.d/td-agent status

自動起動
chkconfig --level 345 td-agent on

6. fluent-logger-phpのインストール

公式サイト掲載のパッケージをそのまま利用してみた。
git clone https://github.com/fluent/fluent-logger-php.git
cp -r src/Fluent /path/to/

7. ログを送信してみたサンプルコード

require_once '/path/to/Fluent/Autoloader.php';
use Fluent\Logger\FluentLogger;
Fluent\Autoloader::register();

$key = 'log.pv';
$val = array(
    'time'        => date('Y-m-d H:i:s'),
    'member_id'   => 'aaaaaaa',
    'useragent'   => $_SERVER['HTTP_USER_AGENT'],
    'ipaddress'   => $_SERVER['HTTP_X_FORWARDED_FOR'],
);
$logger = new FluentLogger("unix:///var/run/td-agent/td-agent.sock");
$logger->post($key, $val);

8. 試してみた感想

出力されるログは、JSON形式なので集計するときに取り扱いが簡単ですね。
また、追加したい値が増えてもこれなら気兼ねなく追加できます。
基本的なことでかつ重要なことですが、今のところログの取りこぼしがありません。
試しに受信側落としてみたらセカンダリーに出力してくれるし、設定によってはコピーして転送してくれたりで、
冗長化や障害時のリカバリーも可能ですね。

日々すごい量のトラフィックをさばいている次の企業で導入されているのも納得です。
http://docs.fluentd.org/articles/users

あと、td-agentならrubyではない環境でも簡単にfluentdが導入できそうです。
ただし、Windowsは除くようですが・・・。

Fluentd doesn't run on Windows.

2013年4月7日日曜日

FuelPHP 1.5.2と1.5.3の差分

2013/3/8にFuelPHP 1.5.3が出てたので内容を確認してみた
セキュリティー関連の設定に変更があったようです。



手元の1.5.2とdiffしてみた。

Files fuelphp-1.5.2/docs/assets/js/combined.js
Only in fuelphp-1.5.3/fuel/app/cache: fuel
Files fuelphp-1.5.2/fuel/app/config/config.php
Only in fuelphp-1.5.3/fuel/app/logs: 2013
Only in fuelphp-1.5.3/fuel/app/views: person
Files fuelphp-1.5.2/fuel/core/classes/fuel.php
Files fuelphp-1.5.2/fuel/core/classes/security.php
Files fuelphp-1.5.2/fuel/core/config/config.php


差分確認して該当のファイルを置き換えればよさそうです。