Elasticsearch 2.4から5.0.1にアップグレードしていろいろはまった

手元でカジュアルに運用しているElasticsearch 2.4(2.4.1だったかも)をえいやと5.0.1に上書きアップグレードしていろいろはまったのでメモっておく。

その前にElasticsearch 5がどんな感じなのかはwyukawa's tumblr, johtaniさんとElasticsearchについて話しました Guest ...を聞くと良いと思います。まあ宣伝です。

まあこういうのは2つクラスタ用意してblue green deploymentするのが安全だと思います。

ただどっちにしろクライアントの対応状況にも気をつけたほうが良いです。REST API使ってるやつならだいたい大丈夫だと思いますが、Java系だと互換性が無いんじゃないかな。

僕の環境ではfluent-plugin-elasticsearchから書き込んでますが、アップグレード作業中はデータを止めたほうが良いと思いました。
データがくる状態でアップグレード作業してたらOutOfMemoryが出たりtoo many open files出たりしてましたが、データ流入止めてElasticsearch再起動したら落ち着きました。

公式のアップグレード手順は下記ですが、これだけだと正直に言ってはまると思いました。
Full cluster restart upgrade | Elasticsearch Reference [6.4] | Elastic

なので上記に書かれていないことではまったことをつらつら書きます。


プラグイン

まず僕は HeadとKopfという2つのプラグインを使っていましたが、これはそのままでは使えなくなりました。
Elasticsearch 5.0とともにsite pluginを動かす | Elastic

プラグインが入っている状態でアップグレードしてもElasticsearchが起動しないので、Elasticsearch 2.4を止めた後に下記のようにしてプラグインを削除します。

/usr/share/elasticsearch/bin/plugin remove head
/usr/share/elasticsearch/bin/plugin remove kopf

その後、Elasticseach 5.0.1が起動したら後継であるGitHub - lmenezes/cerebroをセットアップすれば良いです。見た目はまんまKopfだけど作者が同じだしね。


ES_HEAP_SIZEは使えないので代わりにES_JAVA_OPTSを使う
Elasticsearch 5.0.0-alpha2 released | Elastic

Importantly, you can no longer use the ES_HEAP_SIZE environment variable

とのことです。


インデックスの設定はnodeの設定に書かない

elasticsarch.ymlにslow log設定を書いてると下記のようなエラーになります。

Found index level settings on node level configuration.

Since elasticsearch 5.x index level settings can NOT be set on the nodes
configuration like the elasticsearch.yaml, in system properties or command line
arguments.In order to upgrade all indices the settings must be updated via the
/${index}/_settings API. Unless all settings are dynamic all indices must be closed
in order to apply the upgradeIndices created in the future should use index templates
to set default values.

pull requestはPrevent index level setting from being configured on a node level by s1monw · Pull Request #17144 · elastic/elasticsearch · GitHubだと思います。

僕はHistogram aggregation causes OOM on 2.3.2 · Issue #18635 · elastic/elasticsearch · GitHubに遭遇したときにslow log設定を入れたのですが、そもそもこのissueのようにハングアップする場合はslow logの意味は無かっのでこの設定は消しました。


VIPを持っているホストでnetwork.host: 0.0.0.0だとVIPにつなぎにいこうとしてエラーになる。
なので下記のようにネットワークインターフェースを使います。VIP使ってなければ関係ないと思います。

network.host: _bond0_
network.bind_host: 0.0.0.0

参考
Network Settings | Elasticsearch Reference [6.4] | Elastic


フィールド名の先頭にドットがあるとエラーになる。

Elasticsearchは1系ではドットがOKで2系でNGになり5系でまたOKになったという経緯があります。
Elasticsearch 2.4.0 released | Elastic

が、しかし、フィールド名の先頭にドットがあるとエラーになったので質問してみた。
"name cannot be empty string" error if field name starts with - Elasticsearch - Discuss the Elastic Stack


count APIにid検索使うとエラーになる。

$ curl -XGET 'localhost:9200/.kibana/index-pattern/_count?q=_id:aaa-*&pretty'
{
  "error" : {
    "root_cause" : [
      {
        "type" : "query_shard_exception",
        "reason" : "Can only use prefix queries on keyword and text fields - not on [_id] which is of type [_id]",
        "index_uuid" : "bXfFwplIT1-GhfmQ_YIJ3g",
        "index" : ".kibana"
      }
    ],
    "type" : "search_phase_execution_exception",
    "reason" : "all shards failed",
    "phase" : "query_fetch",
    "grouped" : true,
    "failed_shards" : [
      {
        "shard" : 0,
        "index" : ".kibana",
        "node" : "N13vRpZMRg-FNB8Ggdl1tA",
        "reason" : {
          "type" : "query_shard_exception",
          "reason" : "Can only use prefix queries on keyword and text fields - not on [_id] which is of type [_id]",
          "index_uuid" : "bXfFwplIT1-GhfmQ_YIJ3g",
          "index" : ".kibana"
        }
      }
    ],
    "caused_by" : {
      "type" : "query_shard_exception",
      "reason" : "Can only use prefix queries on keyword and text fields - not on [_id] which is of type [_id]",
      "index_uuid" : "bXfFwplIT1-GhfmQ_YIJ3g",
      "index" : ".kibana"
    }
  },
  "status" : 400
}


curator 3はElasticsearch 5に対応していない。curator 4を使う必要がある。
GitHub - elastic/curator: Curator: Tending your Elasticsearch indices


FlinkはまだElasticsearch 5に対応していない。
[FLINK-4988] Elasticsearch 5.x support - ASF JIRA


Kibana 5についても書いておきます。
アップグレード自体はすんなりいきました。
ドキュメントはStandard Upgrade | Kibana User Guide [6.4] | Elasticかな。


localhost以外からもアクセスする
まずlocalhost以外からもアクセスできるように下記の設定を追加します。

server.host: 0.0.0.0


Timelionのページが真っ白
KibanaでTimelionのリンクをクリックしてもページが真っ白で何も表示されない。
After installation on Kibana 4.2.0 the page is blank · Issue #12 · elastic/timelion · GitHubと同じ気がしたのでコメントしといた。