ようへいの日々精進XP

よかろうもん

fluentd のストレージとして redis を使ってみる一部始終(調査編)

要件

  • Apache のアクセスログを fluentd を使って捌く
  • ストレージを S3 ではなく redis を使う

環境

  • CentOS 5.x
  • Ruby 1.9.3-p392(rbenv 経由でインストール)
  • 既に yum にて td-agent 自体はインストール済み
  • redis に関しても既にインストール済み
    • 現時点では tarball を取得して make;make install するしかないようです...

redis とは

fluent-plugin-redis のインストール

まず普通に gem でインストール

gem install fluent-plugin-redis

/etc/td-agent/td-agent.conf の設定

<source>
        type tail
        format apache
        path /var/log/httpd/access_log
        tag redis.access
        pos_file /tmp/td-agent/apache.pos
</source>

<match redis.**>
  type redis

  host localhost
  port 6379

  # database number is optional.
  db_number 0        # 0 is default
</match>

/etc/init.d/td-agent restart

さくっとココまで来れました。これは順調と思いきや...

/etc/init.d/td-agent restart

こんなエラー...

2013-04-27 02:50:17 +0900 [error]: config error file="/etc/td-agent/td-agent.conf" error="Unknown output plugin 'redis'. Run 'gem search -rd fluent-plugin' to find plugins"

どうやら fluent-plugin-redis が認識されていない模様...fluent の gem 環境を確認してみる。

/usr/lib64/fluent/ruby/bin/gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 1.8.23
  - RUBY VERSION: 1.9.3 (2012-04-20 patchlevel 194) [x86_64-linux]
  - INSTALLATION DIRECTORY: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1
  - RUBY EXECUTABLE: /usr/lib64/fluent/ruby/bin/ruby
  - EXECUTABLE DIRECTORY: /usr/lib64/fluent/ruby/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1
     - /root/.gem/ruby/1.9.1
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :benchmark => false
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - http://rubygems.org/

td-agent が参照する gem は通常の gem とは異なるんだな(という認識)ということで、改めて td-agent が参照する gem を使って fluent-plugin-redis をインストール

/usr/lib64/fluent/ruby/bin/gem install fluent-plugin-redis

エラーは続くよどこまでも

td-agent が参照する gem を使って fluent-plugin-redis も無事に終わり、改めて td-agent の再起動を行うと...

/etc/init.d/td-agent restart

今度は新たな問題が発生。正常に td-agent は起動するものの /var/log/td-agent/td-agent.log に以下のようなログが出力される。

2013-04-27 08:14:08 +0900 [warn]: before_shutdown failed error="getaddrinfo: Name or service not known"
  2013-04-27 08:14:08 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/redis-2.2.2/lib/redis/connection/ruby.rb:26:in `initialize'
  2013-04-27 08:14:08 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/redis-2.2.2/lib/redis/connection/ruby.rb:26:in `new'
  2013-04-27 08:14:08 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/redis-2.2.2/lib/redis/connection/ruby.rb:26:in `block in connect'
  2013-04-27 08:14:08 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/1.9.1/timeout.rb:68:in `timeout'
  2013-04-27 08:14:08 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/redis-2.2.2/lib/redis/connection/ruby.rb:128:in `with_timeout'
  2013-04-27 08:14:08 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/redis-2.2.2/lib/redis/connection/ruby.rb:25:in `connect'
  2013-04-27 08:14:08 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/redis-2.2.2/lib/redis/client.rb:227:in `establish_connection'
  2013-04-27 08:14:08 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/redis-2.2.2/lib/redis/client.rb:23:in `connect'
  2013-04-27 08:14:08 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/redis-2.2.2/lib/redis/client.rb:247:in `ensure_connected'
  2013-04-27 08:14:08 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/redis-2.2.2/lib/redis/client.rb:137:in `block in process'
  2013-04-27 08:14:08 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/redis-2.2.2/lib/redis/client.rb:206:in `logging'
  2013-04-27 08:14:08 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/redis-2.2.2/lib/redis/client.rb:136:in `process'
  2013-04-27 08:14:08 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/redis-2.2.2/lib/redis/client.rb:100:in `call_pipelined'
... 続く

client.rb の connetct 辺りで落ちているようなので、どうやら redis 自体に繋がっていなさそうなログ。一か八か、td-agent.conf の redis のセクションを以下のように修正した。

<match redis.**>
  type redis

  host 127.0.0.1 # host localhost から修正
  port 6379

  # database number is optional.
  db_number 0        # 0 is default
</match>

上記のように修正した後、改めて td-agent を再起動する...

確認

あらかじめインストールしておいた httpd を起動して適当にアクセスすると...

f:id:inokara:20130427090541p:plain

ちょっとだけ redis を使ってみる

ストアされた key の確認
keys *

f:id:inokara:20130427091525p:plain

key のタイプを確認
type ${key}

f:id:inokara:20130427091533p:plain

ハッシュの中身を確認
hgetall ${key}

f:id:inokara:20130427091828p:plain

まとめ

  • memcached やMongoDB 自体、よく理解出来ていない上での redis ということで、「ただ触ってみただけ」な感じになってしまったのはまだまだ。
  • td-agent のプラグインは下記のように確認することが出来そう
# /usr/lib64/fluent/ruby/bin/gem list| grep fluent | grep plugin
fluent-plugin-flume (0.1.1)
fluent-plugin-mongo (0.7.0)
fluent-plugin-redis (0.2.0)
fluent-plugin-s3 (0.3.1)
fluent-plugin-scribe (0.10.10)
fluent-plugin-td (0.10.14)
fluent-plugin-webhdfs (0.1.4)
  • 引き続き、幾つかのプラグインを試しつつ、現場でのログ分析の手順等について考えていきたいなーっと。
  • chef でのセットアップ cookbook についても近日公開する予定。