Fessを複数インスタンスで運用している場合に、各インスタンスの状態を把握し、メンテナンス操作の競合を防止するための分散協調機能(CoordinatorHelper)を追加しました。
背景
Fessは同じOpenSearchクラスタに複数のインスタンスを接続して運用できますが、これまではインスタンス間で状態を共有する仕組みがなく、例えば複数のインスタンスから同時にリインデックスを実行してしまうといった問題が起こり得ました。この問題を解決するために、OpenSearchを利用した分散協調の仕組みを導入しました。
主な機能
インスタンスのハートビート管理
各Fessインスタンスは定期的にOpenSearchのfess_config.coordinatorインデックスにハートビートを送信します。ハートビートにはTTL(有効期限)が設定されており、期限切れのインスタンスは非アクティブとみなされます。これにより、現在稼働中のインスタンス一覧を取得できます。
メンテナンス操作の排他制御
リインデックス、設定インデックスの再構築、ドキュメントインデックスのリロード、クローラインデックスのクリアといったメンテナンス操作に対して、分散ロックの仕組みを導入しました。OpenSearchのop_type=createによる原子的なドキュメント作成を利用して排他制御を実現しています。
あるインスタンスが操作を開始すると、他のインスタンスからの同一操作の実行はブロックされ、どのインスタンスで実行中かを示すエラーメッセージが表示されます。ロックの解放にはif_seq_no/if_primary_termによる楽観的並行性制御を使用し、所有者のみがロックを解放できるようになっています。
また、ロックを保持しているインスタンスがダウンした場合は、TTLの期限切れやハートビートの不在を検知して、古いロックを自動的にクリーンアップします。
イベント通知
インスタンス間でイベントを通知する仕組みも用意しています。特定のインスタンスや全インスタンスに対してイベントを発行でき、定期的なポーリングで消費されます。将来的には、設定変更の通知や辞書の更新伝播などへの活用が予定されています。
設定
以下の設定項目が追加されています。
coordinator.poll.interval: ポーリング間隔(デフォルト60秒)coordinator.heartbeat.ttl: ハートビートの有効期限coordinator.operation.ttl: 操作ロックの有効期限coordinator.event.ttl: イベントの有効期限
技術的なポイント
fess_config.coordinatorインデックスはnumber_of_shards: 1で作成されます。これは、op_type=createによる原子的なドキュメント作成が同一プライマリシャード上でのみ保証されるためです。
インスタンスIDはホスト名とPIDを組み合わせて生成されるため、同一ホスト上で複数のFessプロセスを実行している場合でも一意に識別できます。