フロー

(TBD)

reindex のタスクの取り扱い

経緯

  • v3.6.6 時点では、reindex 処理の完了を待たずにエイリアスの付け替えやインデックスのリビルドを行っている
    • これにより、ES 内部でタスクが生成される
    • reindex はスナップショットを生成するらしい(生成した上でデータコピーを行うのか、どれくらいのリソースを食うのかは不明)
  • 本体改修の一貫として、もしリビルド完了後も reindex のタスクが動き続けているのであれば、キャンセル操作を行った方がよいのではないかという案が浮上した
  • その途上、GROWI.cloud 側での reindex の権限付与等についての調査の必要が生まれた

調査サマリ

  • ところが、タスクのキャンセルにはそこそこ強い権限が必要であることが判明(#ログセクション参照)
  • 調査を受けて、reindex 処理を同期的にするようにすればいいのではないかという案も浮上した
    • reindex 処理の長さがわからなかったので実装当初は非同期にしておいた

結論サマリ

  • v3.6.6 で、本体の Elastic Management 画面にインデックスの normalize 処理が実装されたことにより、-tmp インデックスが残っていたり alias の付け替えに失敗した場合でも容易に正常状態に戻せるようになった
  • 上記機能があるので、「何かの処理が長いとこういう状態になるので同期的な方が/非同期な方が」といったインデックス状態管理について考える事自体あまりやらなくてもよくなった
  • よって、リソース面、ユーザーの利便性の面から今後実装方式を変えればよく、タスクのキャンセルは当面考えない

ログ

h.ozeki 6:58 PM

Elasticsearchのジョブの停止?かなにかのロールを追加で付与する件なんですがストーリーってありましたっけ

yuki 7:02 PM

ないです タスクのキャンセル https://www.elastic.co/guide/en/elasticsearch/reference/6.8/tasks.html#task-cancellation external_link

GROWI.cloud で対応が完了した後にやる予定の本体側の後続ストーリーはある https://youtrack.weseek.co.jp/issue/GW-1023 external_link

h.ozeki 7:30 PM

これはgrowi本体ではまだ実装されてないって理解であってます?

yuki 7:36 PM

yes

h.ozeki 7:40 PM

これそこそこ大きい権限付与しないとできなさそうな感じがしますね. cluster priviledgeにあるmanageかな. https://www.elastic.co/guide/en/elasticsearch/reference/6.8/security-privileges.html external_link

yuki 7:41 PM

ほー じゃあ現実的じゃないか

h.ozeki 7:41 PM

ESのドキュメントさん, REST APIにどの権限が必要なのか書いてないのでとてもしんどい.

yuki 7:41 PM

ユーザー権限用意されてないって事は、基本 task は作りっぱなしでほっといてもいいっていう思想なのかな

h.ozeki 7:44 PM

これってキャンセルできないと何が問題になりますか?

yuki 7:45 PM

reindex のタスクが大量に作られてリソースを圧迫するかもという懸念? まあ現状そうなんだけどな。インデックスのリビルドが終わったタイミングでキャンセルできるならしようかなと思った次第。

h.ozeki 7:49 PM

ちなみにこれreindexのtask_idとかどう取ればいんですかね?

yuki 7:50 PM

reindex のリクエストを投げた時のレスポンスに入ってたんだった気がする うーんどこで見たんだったか… 勘違いの可能性もあるな

h.ozeki 7:55 PM

あーなるほどこれか

If the request contains wait_for_completion=false then Elasticsearch will perform some preflight checks, launch the request, and then return a task which can be used with Tasks APIs to cancel or get the status of the task. Elasticsearch will also create a record of this task as a document at .tasks/task/${taskId}. This is yours to keep or remove as you see fit. When you are done with it, delete it so Elasticsearch can reclaim the space it uses. https://www.elastic.co/guide/en/elasticsearch/reference/6.7/docs-reindex.html#_url_parameters_3 external_link

そういえば待ち合わせなしでreindexしてましたもんね

いっそreindexの終了を待ち合わせるようにする選択肢ありますか.

yuki 7:57 PM

response のスキーマがどういうのかっての、ドキュメントないよな…

h.ozeki 7:58 PM

同期の方のレスポンススキーマはありますけど非同期のは文章だけですね

yuki 7:58 PM

ドキュメントじゃなくて実地試験の記憶だった

h.ozeki 7:59 PM

そういや@typesみればいいことに気づいた

こっちか https://github.com/DefinitelyTyped/DefinitelyTyped/blob/f061bcde28bab3ff9d6cbe88cc5636b15831621f/types/elasticsearch/index.d.ts#L75 external_link

yuki 8:02 PM

これさあ、 https://www.npmjs.com/package/@elastic/elasticsearch external_link の定義だったりしないかな

GROWI はあいにくまだ https://www.npmjs.com/package/elasticsearch external_link を使っている

h.ozeki 8:03 PM

Oh

ちなみに型定義には待ち合わせなしの場合のスキーマはなかったです(たぶん)😢

実際に動かして値みて, 実装確認するくらいしか不可能….

ちなみに個人的にこれでいいのではという気持ちです

いっそreindexの終了を待ち合わせるようにする選択肢ありますか.

yuki 8:05 PM

書いてないものって知らないうちにしれっと実装変わってそうで怖いよねw

h.ozeki 8:05 PM

ほんとそれですね

yuki 8:08 PM

reindex の時間が index rebuild の時間に比べて十分短いなら、同期処理でも非同期処理でもどっちでも大差ないか

h.ozeki 8:11 PM

GROWIの使い方の場合基本データコピーでしか無いはずなのでreindexのが早い(と思います).

データコピーはsnapshot利用する方か

yuki 8:12 PM

ってか、こないだ index の状態見て normalize (正常状態に戻す)する機能も付けたので

最早状態管理というかノーマル状態じゃない状態が増えたらやだなとかあまり考えなくてもいいのかもしれない。

h.ozeki 8:13 PM

今見たらもっと強いAPIできてた(7系なので使えないけど…) https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-clone-index.html external_link

yuki 8:17 PM

とりあえずこの問題置いときましょう