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-redshift → Rin → Kinesis Firehoseと数年に渡り改善を進めてきました。
当初頻繁に起きていたログの遅延も現在は起きることはほぼ無くなりました。
Tech Kayac Advent Calendar Migration Track 5日目のfluentdによる通知をRedash/Mackerelに移動させるの中でも言及したように fluentdのバージョンアップに追随しにくい という問題もfluentdの役割を減らすことで軽減されたと思っています。