世間の Fluentd ユーザのみなさんはFluentdが1プロセスでいったいどれだけ大量のメッセージをさばけるかを実際にご覧になってそのすばらしさに驚いていることと思いますが、もちろん1ノードで処理できるメッセージ数にはいずれ限界があり、メッセージを次段階の処理を行うFluentdに送るときには対象の分散を考えることと思います。
で、カジュアルにスケールさせていったところ out_forward の配送先が10サーバx各8プロセスの合計80ノードになって設定ファイルが爆発したので、設定ファイル内で繰り返しを記述できるプラグインを書いた。
tagomoris/fluent-plugin-config-expander · GitHub
fluent-plugin-config-expander | RubyGems.org | your community gem host
これにより
これが、
<match hoge.**> type forward num_threads 28 send_timeout 5s flush_interval 1s buffer_chunk_limit 8M buffer_queue_limit 128 <server> host node01.fluentd.local port 24211 </server> <server> host node01.fluentd.local port 24212 </server> <!-- 77回省略 --> <server> host node10.fluentd.local port 24218 </server> </match>
こうなる。
<match hoge.**> type config_expander <config> type forward num_threads 28 send_timeout 5s flush_interval 1s buffer_chunk_limit 8M buffer_queue_limit 128 <for node in 01 02 03 04 05 06 07 08 09 10> <for port in 24211 24212 24213 24214 24215 24216 24217 24218> <server> host node__node__.fluentd.local port __port__ </server> </for> </for> </config> </match>
どうよこの圧倒的な威力。DSLなんて大層なものいらんかったんやー。ループさえあればよかったんやー。
タグによりプラグインを動的生成する fluent-plugin-forest と組合せて使えばcaoticに増え続けるプラグインインスタンスの世界をお楽しみいただけます。*1
ノード数が爆発して困っているfluentdユーザのみなさん、ぜひどうぞ。
*1:作者は絶対にそのようなことはすまいと思っています。