はじめに
ディップ株式会社でバイトルやバイトルPRO、dipAIなどの検索基盤の開発・運用を担当している砂原です。 弊社では求人情報の検索において、Elasticsearch(ElasticCloud)を利用しています。
Elasticsearchは日々新しい機能がリリースされるため、弊社では年に1回以上バージョンアップを行っています。 先日も8.16系にバージョンアップしたのでその手順を記載します。 なお、本記事は以前Elasticsearch勉強会にて発表した内容を改変したものです。(発表時では至らない点がいくつかありましたが、有識者の方々のフィードバックありがとうございました)
バージョンアップを取り巻く問題について
まず、Elasticsearchに限らず検索エンジンのバージョンアップにはさまざまな課題があります。 以下によくある課題を挙げます。
- 新バージョン環境にデータを格納する必要があるが、データが大量にあるため全件更新処理を実行すると終了までに数日がかかる。(かつ、その数日のうちにデータがどんどん更新されていく)
- ビジネス的に「データの鮮度」がかなり重要なため、メンテナンス作業によってデータ更新処理を長時間停止することが許されない。
ElasticCloudを利用している場合は管理画面からボタンを押下することで簡単に対応できるものの、本番環境ではその選択肢は難しいかもしれません。 そこで弊社では、クラスター間でインデックスを複製することができるCross-cluster replication(以下CCR)を利用し、データの鮮度を維持しながらバージョンアップ作業を行っています。
CCRが対応しているバージョンについては、公式ドキュメントで提供されているマトリクスを参照して確認してください。
Elasticsearch バージョンアップ手順
それでは、実際の作業手順について解説します。 前述のCCR機能を活用し、ブルーグリーンデプロイメントのようなアプローチで安全に作業を行っています。
- 新バージョンの環境を作成する
- 既存バージョンからCCRを設定し、データをコピーする
- 各種エンドポイントを新バージョンに変更する
以下、詳細な手順を解説していきます。 本記事では8.16系を利用してスクリーンショットを撮っているため、バージョンによってはUIが変更されている可能性があります。
1. 新バージョンの環境を作成
弊社では資材をTerraformで管理しており、効率的に環境を作成できるようにしています。 これに関する詳細な説明は今回は割愛します。(いつか誰かがブログに書いてくれると信じています)
2. CCRの設定方法
Kibanaを利用してCCRを設定していきます。
まず新バージョン環境のKibanaを開き、既存バージョンの環境を参照できるよう設定します。
Name
には任意の名前を、Remote address
には既存バージョンのURLを指定してください。
続いて、CCRの設定をします
以下の画面は既存バージョンの環境にある tech-blog
というインデックスを tech-blog-new
という名称で新環境にコピーする設定のサンプルになります。
Remote cluster
は前の手順にて設定したものをプルダウンから選択してください。
この設定により、既存環境のインデックスに加えられた更新が新バージョン環境のインデックスにも伝播されます。
完全リアルタイムではなく多少のタイムラグが発生しますが、新バージョン環境に対して改めてデータ更新作業をする必要がなく、恩恵は大きいと思います。
CCR設定にあたる注意事項としてはCCRがアクティブになるまで待つ必要があります。
特に大量のデータが存在するインデックスでは、CCRの完了までに数分〜数時間かかることがあります。
最後に、CCRでデータが揃ったらCCRの設定を解除します。CCR設定中はインデックスが読み取り専用になるためです。
CCRの設定解除はCCR設定画面から Unfollow leader index
を選択します。
3. 各種エンドポイントを新バージョンに変更する
データ更新および参照のエンドポイントをそれぞれ新環境に変更します。
新環境のエンドポイントが正しく動作しているか確認し、もし何か問題が発生した場合は既存バージョンに切り戻します。
また、データの更新頻度やタイミングによってはCCRの設定解除後にデータが更新される可能性があるため、更新頻度に応じてデータ更新処理を一時停止したり手動でデータ更新するなどの対応が必要になります。
最後に
弊社で実施しているバージョンアップ手順について解説しました。
CCR機能はとても強力なのでバージョンアップ以外にもいろいろな利用方法があると思います。
検索エンジンのバージョンアップは常に頭を悩ませる課題かと思いますので、この記事がElasticsearchの運用を担当している方々とって役立つ情報となることを願っています。
検索技術系やElasticsearchをはじめ検索エンジン系の勉強会にも顔を出していますので、もっと良い方法があるよ、などのご意見があれば是非お声掛けください!