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]]