長らくはまっていた件の解決法がわかったので、同じような構成の人はあまりいないと思うけど一応シェア。
概要
nxlogとfluentdを連携(両者をsyslog(任意のTCPポートリッスン)で連携)させて使っていて、かつ初期emitをbuffer_fileにしているようなケースで発生
例えば、下記のような構成
webサーバ(nxlog)
↓ TCP
fluentd(syslog)
↓パースしてfileにキューイング
fluentd(buffer_file)
↓キューイングしたファイルを1秒間隔で書込
Elasticsearch
内容
要約すると、fluentd停止時に残ったbuffer_fileに対してsyslog受信したデータを書きこもうとする時に、起動時にbuffer_fileをフラッシュするので該当ファイルがなくそのプロセスがコケる。。。しばらくはまっていた。
【処理の流れ】
①fluentdの停止時にsyslogポートのリッスンを停止するまではnxogはデータを投げ続ける
②fluentd停止時に、bufferファイルが残った状態になる
③fluentd開始と同時に、bufferのflush(この構成だとElasticsearchへの書込)イベント発生
④同時にsyslog受信も始まりbufferへの書込も開始
この時、③のflush済のbuffer_fileに運悪く書込が走ると、下記のようなエラーが出てそれ以後処理が全てfailする
2015-09-25 15:53:11 +0900 [warn]: parse failed No such file or directory @ sys_fail2 - (/var/log/td-agent/buffer/aaa_es..b5208c33e778dc0c0.buffer, /var/log/td-agent/buffer/aaa_es..q5208c33e778dc0c0.buffer)
<対応>
buffer pluginの中で下記設定を入れるとプロセス停止時に、キューをflushするのでこの事象は回避出来る。
複数回試して、検証済
flush_at_shutdown true
上記オプションが、buffer_memoryはデフォルトtrueで、fileはfalseになっているらしいがなぜだろう。。
でも、解決してよかった。
お役に立つ人がいれば。