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
の役割を減らすことで軽減されたと思っています。