全文検索検SaaS「Algolia」のインデックスを入れ替えてみた

2023.02.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

弊社ブログDevelopersIOは、昨年夏ごろから検索機能を復活させています。 裏で大活躍しているのが、全文検索SaaSのAlgoliaです。

本番運用開始から約半年経過し、インデックスを入れ替える機会があったため、入れ替え方法の検討と実際の手順について共有します。

最終的な入れ替え内容

インデックスの入れ替えに伴う最終的なアウトカムが以下です。

  • サービス
    • ダウンタイム無し
  • アプリケーション
    • 設定変更無し
    • 検証環境では一時的に設定変更
  • Algolia
    • インデックスの上書きで対応
    • 統計情報は引き継ぎ
    • 当月のレコード利用費が倍増

入れ替え方針

今回は3+1(実現不可能)案を検討し、3つ目の名前上書き案を採用しました。

各方式の違いを最初に整理します。

方式 1. アプリ設定変更 2. 名前入れ替え 3. 名前上書き
変更箇所 アプリ Algolia Algolia
統計情報引き継ぎ できない できない できる
ダウンタイム なし あり なし
手順 シンプル 普通 シンプル
切り戻し 可能 可能 不可

1:アプリケーションの指すインデックス名を変更

アプリケーションをデプロイし、アプリケーションの指すインデックス名をBlue/Greenデプロイ風に入れ替えます。

将来的にもインデックスを入れ替える可能性があります。 手順はシンプルですが、入れ替えるたびにインデックス名を変える必要があることや、統計情報が失われることから、今回はこの方式を見送りました。

2:インデックス名を入れ替える

プログラミングの変数の入れ替えのように、旧インデックスを一時的に別名にし、新インデックスを旧インデックス名にします。

インデックス名の入れ替えをアトミックに行えないため、現行インデックスを一時的にリネーム後、新インデックスのリネームが完了するまで、検索機能を利用できません。 統計情報が失われ、手順も少し煩雑なため、今回はこの方式を見送りました。

3:(採用)インデックスを上書き

今回採用した方式です。

リネーム機能を利用し、新インデックスを既存のインデックスに上書きします。

手順が単純で統計情報も引き継がれる一方で、旧インデックス内のレコードは失われてしまいます。 もしもの時の切り戻しはできません。

また、レコメンドのようにObjectIDに依存した機能を使っていると、障害を引き起こします。 現在利用している機能と干渉しないことをサポートにご確認ください。

インデックス名を入れ替える方法を確認するためにドキュメントを眺めていると、インデックスを上書きできることに偶然気づきました。

If an index with the new name already exists, it’s overwritten.

Move indices | Algolia

4:(未対応)エイリアス

アプリケーションはインデックスのエイリアスを参照し、エイリアスの参照先インデックスを張り替える方式です。

現時点では、Algoliaにはこのような機能は存在しないようです。

インデックス設定をコピーするには?

今回は諸般の事情により、レコードを新たに登録し直したインデックスを用意し、新旧のインデックスを入れ替えました。

異なるのはインデックス内のレコードだけであり、インデックス設定は全く同じです。 そのため、新規インデックスを作成後、"Copy Settings"機能を利用してインデックス設定をコピーしました。

もしものために、export機能を利用し、インデックス設定をレポジトリ管理しました。

理論的には新旧インデックスで同等の検索結果となるはずですが、インデックスの入れ替え作業は初めてだったこともあり、検証環境で検索結果を動作確認しました。

レコード数が超過しても3日分は課金から除外される

Algoliaは

  • 検索数($/1000 検索/月)
  • レコード数($/1000レコード/月)

の大きい方に応じて課金され、弊社の利用パターンでは、レコード数をベースに課金されます。

今回の入れ替え作業では、一時的に複数のインデックスが併存してレコード数が増えるため、利用費へのインパクトが気になります。

Algoliaでは、一ヶ月でレコード数が最も多い3日分を除いた最大のレコード数をもとに課金されます。

To offer flexibility, we ignore the three days when you had the most records. This means we don’t count them in your monthly total record.

How does Algolia count records and operations? – Algolia

今回の入れ替え作業には3日以上を要したため、通常の2倍の利用費が発生しました。

作業の流れ

最後に、作業の流れを整理します。

  • 新規インデックスを用意
    1. インデックス作成
    2. 既存インデックスから設定のコピー(組み込み機能を利用)
    3. レコード追加
  • 検証
    1. 検証環境で動作確認
  • リリース
    1. 最新の差分レコード同期
    2. リネーム機能を使ってインデックス上書き
    3. 本番環境で動作確認

まとめ

DevelopersIOで利用している検索SaaS「Algolia」のインデックス変更方法を紹介しました。

Algoliaの基本機能しか使っておらず、検索運用に頑張りたくないため、極力シンプルな方法を採用しました。

インデックス併存による一時的レコード数増加により、利用費がはねてしまう点だけは想定外だったため、今後の入れ替え時期・期間では配慮したいと思います。

それでは。