fluentdを使ったRedshiftへのログ投入方法の変遷

SREチームの竹田です。Tech Kayac Advent Calendar Migration Track 16日目の記事になります

弊社ではアプリケーションから出力されたログの集約管理ツールといえばfluentdほぼ一択になるでしょう。 プラグインやドキュメントも充実しており運用には欠かせない存在です。

「受信」「分類」「要素の置換/追加/削除」「転送」など様々な事をしてくれるのですが 、少々仕事をさせすぎてしまう傾向があります。

fluent-plugin-redshift

数年ほど前にリリースされたとあるサービスでログをRedshiftに投入したい要件がありました。

ログをfluentd経由でRedhshiftに投入したい場合fluent-plugin-redshiftを利用して投入することができます。

fluent-plugin-redshiftは内部で以下のようなことを行っており、S3やRedshiftとの接続が不調なときにはバッファリングしてリトライを行う仕組みもあります。

  • S3へのデータ保存
  • copyコマンドをRedshiftに発行しS3のデータが投入される
  • バッファリング

fluent-plugin-redshiftを使った場合の設定はこんな感じになります。

<match log.action>
    @type redshift

    # s3
    aws_key_id {AWS_KEY_ID}
    aws_sec_key {AWS_SECRET_KEY}
    s3_bucket s3-bucket-name
    s3_endpoint s3-ap-northeast-1.amazonaws.com
    path /log/action
    timestamp_key_format %Y%m%d-%H

    # redshift
    redshift_host db-host.xxxxxxxx.ap-northeast-1.redshift.amazonaws.com
    redshift_port 5439
    redshift_dbname log
    redshift_user  log_user
    redshift_password {PASSWORD}
    redshift_tablename log_action
    file_type json

    # buffer
    buffer_type file
    buffer_path /var/log/td-agent/buffer
    flush_interval 5m
    buffer_chunk_limit 256m
<match>

fluentdの中でS3の保存, RedShiftへの投入, バッファリングの3つの仕事をさせてしまっていることもあり、ログの流量やリトライが増えると過負荷に陥り遅延することが、しばしばありました。

Rin

Rinは 前述の copyコマンドをRedshiftに発行しS3のデータが投入される の部分を 担ってくれる隙間家具OSSです

Rinの導入によりfluentdの仕事はfluent-plugin-s3を使ったS3への投入だけになります。 設定も簡素になっています。

<match log.action>
  @type s3

  aws_key_id {AWS_KEY_ID}
  aws_sec_key {AWS_SECRET_KEY}
  s3_bucket s3-bucket-name
  s3_endpoint s3-ap-northeast-1.amazonaws.com
  path /log/action
  timestamp_key_format %Y%m%d-%H

  file_type json
  buffer_type file
  buffer_path /var/log/td-agent/buffer/log-action
  buffer_chunk_limit 256m
  flush_interval 5ms
</match>

Kinesis Firehose

Kinesis Firehoseはストリーミングデータの配信サービスでデータをS3,Redshiftなどに送り込んでくれます。 これを利用すればRinをサーバで動かす必要はなさそうです。

fluent-plugin-kinesis-firehoseを入れて設定を書き換えてみましょう。

<match log.action>
  @type kinesis_firehose

  delivery_stream_name firehose-action-stream
  append_new_line true

  flush_interval 1
  aws_key_id {AWS_KEY_ID}
  aws_sec_key {AWS_SECRET_KEY}
  region ap-northeast-1
</match>

S3への投入成否もfluentd側で管理する必要がなくなり更に仕事が減りました。

まとめ

ログのRedshift投入周りについて、fluent-plugin-redshiftRinKinesis Firehoseと数年に渡り改善を進めてきました。

当初頻繁に起きていたログの遅延も現在は起きることはほぼ無くなりました。

Tech Kayac Advent Calendar Migration Track 5日目のfluentdによる通知をRedash/Mackerelに移動させるの中でも言及したように fluentdのバージョンアップに追随しにくい という問題もfluentdの役割を減らすことで軽減されたと思っています。