読者です 読者をやめる 読者になる 読者になる

inFablic

Fablic開発者ブログ

Elasticsearchの1系から2系への移行

サーバサイドエンジニアの@sinamon129です。

FRILのサーバサイド開発・インフラ・チューニング・検索・運用など幅広くやらせていただいております。

9月に、全文検索サーバとして使っているElasticsearchを1.7.2から2.3.5へ移行をしました*1*2。現在、2.4系で運用しています*3。また、2系へupdateしたので、シングルクラスタだとMarvelがProduction環境でも無料で使えるということで、導入しました。

切り替えまで

migrationプラグインを入れて確認

まず、バージョンアップのために必要な対応をチェックしました。 公式のmigration pluginを入れると、アップグレードする前に解決すべき問題を表示してくれます。

f:id:sinamon129:20161212110121p:plain

No action neededしか出なかったので、データ構造的にはこのままでも大丈夫なようでした。 id と timestamp は no lonnger be configured で、そもそも使用もしていなかったので、削除しました。

types_may_no_longer_be_deleted

plugin類の確認

主要プラグインはリポジトリに同梱されるようになりました。 (バージョンをいちいち指定してインストールしなくて良くなったのですごく楽です)

inquisitorは2系で使えなかったので、代わりにkopfを入れています。主に辞書の確認用途で、analysisの機能を使っています。ちなみにインストールしているpluginは以下です。

# 同梱されている物
bin/plugin install analysis-kuromoji
bin/plugin install analysis-icu
bin/plugin install marvel-agent
bin/plugin install license

# 同梱されていない物
bin/plugin install mobz/elasticsearch-head
bin/plugin install royrusso/elasticsearch-HQ
bin/plugin install lmenezes/elasticsearch-kopf/v2.1.1

elasticsearch.ymlや起動スクリプトなどの見直し

2.x系になってelasticsearch.ymlや起動スクリプトの内容もすこし変わったので、2系のデフォルトのファイルをベースに設定を追加していきます。 また、logging.ymlでdeprecation_log_fileの指定ができるので、設定しました。

elasticsearch.ymlでやっている設定の一部

Memory

bootstrap.mlockall: true

起動時にメモリを確保してスワップしないようにする設定

setup-configuration-memory

Network

network.host: _non_loopback_

network.hostはデフォルトがlocalhostになっているので、変更しないとnode間通信ができないので注意が必要です(ただし、この設定を行うと、マシン内から localhost を指定してリクエストができなくなったので、少しハマりました)

Indices

indices.fielddata.cache.size: 75%

fileddataのためにどれくらいheapスペースを取るかの設定です。デフォルトだと無限なのでOOMが発生することがあるので設定しています。パーセンテージか具体的な数字(5gb)で指定できます。

Fielddata Size

Index

index.refresh_interval: 15s

検索結果への反映はデフォルトで1sになっています。 更新結果の反映は15sぐらいは許せるので、15sに設定しています。

refresh intervalを長めにしてセグメントマージの量を削減する

split brain対策

Master Eligible Nodeを3台用意し、minimum master nodeを2に設定しています。

avoiding split brain with minmum_master_nodes

Marvel

Marvelは、KibanaのPluginとして提供されています。

弊社では、log分析用Kibanaに、Marvel Pluginを入れて使っています。

f:id:sinamon129:20161212135859p:plain

Marvelのデータは全文検索用のものとは別のElasticsearchに置きたかったので、marvel.agent.exportersの設定をしました。

別のElasticsearchクラスタに置くことで、検索クラスタ・Marvelのデータ用のクラスタどちらかの調子が悪い時も影響を受けないのでこの設定はお勧めします。 また、Basicライセンスを取得して、ライセンスの適応を行いました!

setting up a separate monitoring cluster

アプリケーション側

Ruby on Railsからsearchkickを用いてElasticsearchをつかっています。 1.0.0以上が2.x系対応だったので、gemのupdateを行いました。

クエリDSLでFilterする処理が運良くなかったので、特に変更が必要なことがありませんでした。

切り替え

全文検索用のindexはDBから作り直せる構成になっているので、バージョンアップ時はいつも新しいec2インスタンスにクラスタをつくって切り替えています。

(新しいクラスタを作る->ブルーグリーンデプロイで切り替え->差分更新の流れ)

今回も2系用のクラスタを作り直して、アプリケーション側の変更と参照先のサーバの変更を同時に行うことで切り替えを完了しました。

切り替え後

f:id:sinamon129:20161211223412p:plain

検索エンドポイントのレスポンスタイムが10msec程度早くなりました。 また、Marvelを導入したことで、クラスタの監視がしやすくなりました....! 個人的にはExplain Analyzeが標準でついたことで、辞書データをより活用しやすくなったのでワクワクしています。

まとめ

クラスタの建て替えができる環境だったので、あまりはまらずにアップデート作業を完了することができました。実行前には、公式のElasticsearch 1.x から 2.x へのアップグレード時の注意点を読むと良かったです。レスポンスタイムもよくなりましたし、Marvelがproduction環境で無料で使えるので、それだけで2系にあげてよかったなーと思っています。

*1:翌日2.4.0が前日に出ていたことに気づいて泣きたい気持ちになりました。その後2.4.1にアップデートしました。

*2:年始に今年何やりたい?って言われた時にElasticsearchのupdateと言っていたぐらいには念願でしたw

*3:5系がでてしまったので、またバージョンアップします