Mastodon における Elasticsearch インデックス定義変更時の zero-dowontime 対応をしてみた
Mastodon の全文検索 (Elasticsearch) のインデックス再生成を行う場合、tootctl search deploy
コマンドを実行するわけだが、
$ RAILS_ENV=production bundle exec bin/tootctl search deploy
(列の追加、analyzerの変更等で)インデックスの定義に変更があった場合、もともとあったインデックスを全削除する挙動になっており、一時的にインデックスにアクセスできない時間が発生してしまう。
一方、Mastodon で使用している Chewy ライブラリに添付されている chewy:reset
rakeタスクを使用すると、
- タイムスタンプ文字列をインデックス名の suffix として 新インデックスを作成
- alias を旧インデックスから新インデックスに切り替え
ということを自動でやってくれる。
これによりインデックスのダウンタイムは最小限に抑えられるのだが、今度は tootctl のほうに含まれているインデックスサイズ削減処理(誰からもリアクションが付いていない投稿はインデックスする必要がないため、タスク内で削除してくれる)が使えないという問題が生じる。
そこで、以下のようなカスタマイズを作成して、tootctl 使用時でもインデックス全削除によるダウンタイムが発生しないようにしてみた。
具体的には、以下のような動作となる。
- インデックス定義が変更されている場合、現在のタイムスタンプ文字列を suffix として新しいインデックスを作成。データ登録は新しいインデックスに向けて行う。
- インデックス作成が完了したら、新しいインデックスに向けて alias を作成。古い alias が残っている場合は削除。
インデックス更新時の zero-downtime が要求されている Mastodon サーバはさほど多くなさそう(そもそも Mastodon で Elasticsearch を使っているサーバ自体が少なそう)なので、私管理のサーバのみの適用に留めておくものの、もしかしたら何処かで役に立つ可能性もあるので、記事として残しておきます。