FluentdからAmazon Elasticsearch Serviceへログ転送する時の注意点

投稿者: | 2016/01/07

昨年10月にAmazon Elasticsearch Service(Amazon ES)がリリースされました。
今まではEC2インスタンスにElasticsearch をインストールして運用していましたが、AWS側でマネージドしてくれるということでとても便利そうだなと思い使ってみました。

動作環境は以下の通りです。

  • Fluentd 0.10.58
  • fluent-plugin-elasticsearch 0.9.0
  • Amazon Elasticsearch Service r3.xlarge

構成としては、各WebサーバからApacheのアクセスログをFleuntdサーバに集約してAmazon ESへ転送するようにしていました。
しかし、FluentdからAmazon ESへ転送する際に途中でエラーが出てしまい、転送できなくなることがありました。

Fluentd側の設定(一部抜粋)

最初からエラーが出るわけではなく途中でエラーが出てしまい、最終的にはqueue size exceeds limitとなってログを破棄されてしまいました。
Amazon ES側のログが見れないので何故発生したかはこの時点ではわかりません(CloudWatch Logsで見れるようにしてほしいです)。

エラー内容でググると以下のスレッドがヒットしました。

Elasitcsearch-ruby raises “Cannot get new connection from pool” error

何かしらの原因でElasticsearchへの接続がタイムアウトした後、再びコネクションプールに接続するにはある程度の時間(@resurrect_after)まで待たなければならないようです。
@resurrect_afterのデフォルトが60秒なので接続するまでに60秒待たなければならず、頻繁にESへトラフィックを送る環境だと接続できるようになるまでにキューがどんどん詰まってしまい、queue size exceeds limitとなってしまったのが原因だということです(合っているかな・・・?)。
fluent-plugin-elasticsearch v1.2.0@resurrect_afterを設定できるようになったのでアップデートして@resurrect_afterパラメータを短くすれば解決するはずです。

もう一点の問題があって、reload_connectionsが デフォルト値(true)になっていると、Amazon ESの場合のみ問題が起こるみたいです。

The problem with reoccurring exception:

temporarily failed to flush the buffer. next_retry=2015-12-12 23:56:36 +0000 error_class=”Elasticsearch::Transport::Transport::Error” error=”Cannot get new connection from pool.” plugin_id=”output_to_elasticsearch”

can be triggered also by plugin setting “reload_connections” (default set to true) and occurs only for Amazon Elasticsearch Service

reload_connections falseを設定すれば問題を回避できるみたいです。

対応

fluent-plugin-elasticsearch を 1.2.0以上にアップデートします。
最新版が 1.2.1 なのでそのバージョンでアップデートすることにします。

Fluentdの設定を以下のように変更します。

  • 追加されたresurrect_afterをデフォルト(60s)から5sに変更した
  • Amazon ESのみ起こる問題への対応としてreload_connections falseを入れた
  • buffer_chunk_limitをAmazon ES(r3.xlarge)の上限(100MB)まで上げた。flush_intervalが10sだが、バッファチャンクが作られてからフラッシュするまでに100MB以上のログが溜まると、Amazon ESへ送る際にエラーになるので念のため設定した
  • 先の設定では触れなかったが、Amazon ESはVPC外にあるので、HTTPSで通信した方が安全なので、schemeportを変更することでHTTPS対応した

Fluentdを再起動して完了です。

最後に

Amazon ESを本格的に使っている人が少ないのか、同じようにハマっている人があまりいなかったです。

FluentdからAmazon Elasticsearch Serviceへログ転送する時の注意点」への2件のフィードバック

  1. えのえの

    ありがとうございました、助かりました

    返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*