Elasticsearch, Kibanaを6.7.1から7.1.1にupgradeした
やり方は https://wyukawa.hatenablog.com/entry/20180124/1516762676 と同じで上書きアップグレードじゃなくて新旧double writeして切り替えました。
うちの環境だとfluentd→kafka→kafka-fluentd-consumer→fluentd→Elasticsearchという経路でElasticsearchに書き込んでいます。
すんなり行くかと思いきや結構難航しました。もっとも今回問題に遭遇したのはElasticsearchではなくそこに入れるfluentdのところでした。
もともとはfluentd 1系で、fluent-plugin-elasticsearch 2.11.10を使ってElasticsearch 6にデータを入れていました。
Elasticsearchは7からタイプが無くなるのでfluentdの設定ではtype_name _doc
とします。
https://www.elastic.co/blog/moving-from-types-to-typeless-apis-in-elasticsearch-7-0
またindex templateで_default_
をなくす必要があります。
fluent-plugin-elasticsearch 3.4.2以前だと https://github.com/uken/fluent-plugin-elasticsearch/pull/573 が入ってないので下記のWARNが大量にでます。
[warn]: #0 [...] Detected ES 7.x or above: `_doc` will be used as the document `_type`.
一方で、当時最新だった3.4.2だと https://github.com/uken/fluent-plugin-elasticsearch/pull/586 の影響でCPU使用率が高くなります。 https://github.com/uken/fluent-plugin-elasticsearch/issues/584
そこは対応してもらって、https://github.com/uken/fluent-plugin-elasticsearch/pull/586
3.5.1でbulk_message_request_threshold -1
にしました。
これで解決と思いきやElasticsearchを再起動するとfluentd側でdeadlockが起きてログ送信に失敗し続けます。
fluent-plugin-elasticsearchの問題なのかelasticsearcy rubyの問題なのか判断がつかなかったので両方にissue登録しました。 https://github.com/elastic/elasticsearch-ruby/issues/656 https://github.com/uken/fluent-plugin-elasticsearch/issues/587
で、その後fluent-plugin-elasticsearch 3.5.2, elasticsearch ruby 7.1.0にあげたらこの問題が起きなくなったのでこのissueはcloseしました。
なので最終的なGemfileのbefore/afterは下記です。
before
source 'https://rubygems.org' gem "fluentd", "1.2.5" gem "oj", "3.6.7" gem "fluent-plugin-ping-message", "1.0.0" gem "fluent-plugin-record-reformer", "0.9.1" gem "fluent-plugin-suppress", "1.0.0" gem "fluent-plugin-elasticsearch", "2.11.10" gem "typhoeus", "1.3.0" gem "fluent-plugin-prometheus", "1.0.1"
after
source 'https://rubygems.org' gem "fluentd", "1.4.2" gem "oj", "3.7.12" gem "fluent-plugin-ping-message", "1.0.0" gem "fluent-plugin-record-reformer", "0.9.1" gem "fluent-plugin-suppress", "1.1.0" gem "fluent-plugin-elasticsearch", "3.5.2" gem "typhoeus", "1.3.1" gem "fluent-plugin-prometheus", "1.3.0"
他にはCuratorによるdaily batchでのindex削除をやめてIndex Lifecycle Management(ILM)を使うようにしました。 index delete用のpolicyをKibana上から作って、cerebroで下記のようにindex templateを指定します。
"settings": { "index": { "lifecycle": { "name": "delete-daily-policy" }, ... } },
index templateをいじるときはcerebro使ってます。
これでめでたしと思ったらKibana monitoringでNodeが見れない!
search.max_bucket
増やして一瞬解決したと思ったけど、結局Kibanaのbugらしい。
https://github.com/elastic/kibana/issues/36892
他にはthread_pool.write.queue_size: 1000
と増やしてもやっぱり下記のようなエラーがたまに出る。もっと増やす必要があるのかなあ。
Description: last_log: [2019-07-03T00:00:42,038 +0900][ERROR][o.e.a.b.TransportBulkAction] [...] failed to execute pipeline for a bulk request org.elasticsearch.common.util.concurrent.EsRejectedExecutionException: rejected execution of org.elasticsearch.ingest.IngestService$4@677150d7 on EsThreadPoolExecutor[name = .../write, queue capacity = 1000, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@edd1093[Running, pool size = 40, active threads = 40, queued tasks = 1087, completed tasks = 23132289]]