Slide 1

Slide 1 text

OpenSearch Full-Indexing : 予期せぬ挑戦とその解決策 JAESOON JEONG (jason) 2024年 05⽉ 31⽇

Slide 2

Slide 2 text

JAESOON JEONG github : JeongJaeSoon 韓国出⾝のエンジニア。 2022年4⽉、LIFULLに新卒⼊社し、 不動産アーカイブ‧住まいインデックス、 GAI活⽤プロダクト開発に従事。 2023年11⽉、freeeに中途⼊社してからは 債権‧請求書領域の開発に携わっている。 債権販売開発本部 債権‧請求書開発部 / Software Engineer

Slide 3

Slide 3 text

話すこと‧話さないこと 話すこと 予期せぬ挑戦と直接関係している課題‧原因‧対策 話さないこと その課題‧原因‧対策に関する深堀り

Slide 4

Slide 4 text

OpenSearch の話 OpenSearch とは? * Source : https://wikipedia.org/wiki

Slide 5

Slide 5 text

OpenSearch とは? OpenSearch の話 * Source : https://www.elastic.co/pricing/faq/licensing

Slide 6

Slide 6 text

OpenSearch とは? OpenSearch の話 * Source : https://www.elastic.co/pricing/faq/licensing

Slide 7

Slide 7 text

Clone 
 * Source : https://wikipedia.org/wiki OpenSearch とは? OpenSearch の話

Slide 8

Slide 8 text

OpenSearch の話 freee 請求書では?

Slide 9

Slide 9 text

OpenSearch の話 freee 請求書では?

Slide 10

Slide 10 text

メールDLタイムPJ freee ⼊社後初のプロジェクトオーナー OpenSearch の話 freee 請求書では?

Slide 11

Slide 11 text

Full-Indexing の話 なぜ必要になったのか?

Slide 12

Slide 12 text

帳票の送付情報:有 詳細なメール送付情報:無 * Source : https://www.flaticon.com/ Full-Indexing の話 なぜ必要になったのか?

Slide 13

Slide 13 text

Full-Indexing の話 なぜ必要になったのか? メール送付した帳票を 取引先がダウンロードした時刻 * Source : https://www.flaticon.com/

Slide 14

Slide 14 text

Full-Indexing の話 どう実施したのか? データ作成時期に よるカラムの差 障害発⽣時に すぐ復旧可能 既存のデータに 影響がない

Slide 15

Slide 15 text

Full-Indexing の話 どう実施したのか? Full-Indexing すべての帳票データを対象に Indexing する

Slide 16

Slide 16 text

Full-Indexing の話 Index とは? id name age … 10 John Smith 37 11 Sally Smith 35 … 24 Dan Smith 12 user id street city state user_id 1 123 Main St Boston MA 10 2 617-123-4567 35 EMPTY 11 … 15 EMPTY EMPTY EMPTY 21 … address SELECT * FROM users JOIN address ON users.id = address.user_id WHERE users.id = 10
 取得したい情報が複雑になると増える (JOIN の数、Run Time) id 以外の条件で絞るためには別設定が必要 (検索条件の対象 Column Indexing)

Slide 17

Slide 17 text

Full-Indexing の話 Index とは? curl -X GET "http://localhost:9200/your_index/_search" -H 'Content-Type: application/json' -d ' { "query": { "match": { "Name": "John Smith" } } }' * Source : https://www.instaclustr.com/blog/opensearch-and-elasticsearch-architecture/

Slide 18

Slide 18 text

Full-Indexing の話 どう実施したのか? Queues OpenSearch Old Index New Index

Slide 19

Slide 19 text

Full-Indexing の話 どう実施したのか? reports_v202305 
 ← 切り替え以前 * Source : https://dev.to/jei/how-to-set-up-an-index-alias-that-points-to-multiple-indices-in-elasticsearch-4g7g

Slide 20

Slide 20 text

* Source : https://dev.to/jei/how-to-set-up-an-index-alias-that-points-to-multiple-indices-in-elasticsearch-4g7g ← 切り替え完了 reports_v202401 
 Full-Indexing の話 どう実施したのか?

Slide 21

Slide 21 text

予期せぬ挑戦とその解決策の話(その①) 挑戦:OpenSearch 新規 Index 作成時、put_mapping のための close_index が失敗 新規Index⽣成の段階をそれぞれで分離したかった (新規作成 → マッピング更新)

Slide 22

Slide 22 text

予期せぬ挑戦とその解決策の話(その①) 挑戦:OpenSearch 新規 Index 作成時、put_mapping のための close_index が失敗 新規 Index 作成後の Bugsnag Alert

Slide 23

Slide 23 text

予期せぬ挑戦とその解決策の話(その①) 原因:Node との疎通失敗で新規 Index の Primary Shard が割り当てられなかった 新規 Index Alias * Source : https://sematext.com/blog/elasticsearch-unassigned-shards/

Slide 24

Slide 24 text

新規 Index Alias * Source : https://sematext.com/blog/elasticsearch-unassigned-shards/ 迷⼦ 予期せぬ挑戦とその解決策の話(その①) 原因:Node との疎通失敗で新規 Index の Primary Shard が割り当てられなかった

Slide 25

Slide 25 text

新規 Index Alias * Source : https://sematext.com/blog/elasticsearch-unassigned-shards/ Retry close_index ??? OpenSearch Cluster 全体が 不安定な状態になってしまう 迷⼦ 予期せぬ挑戦とその解決策の話(その①) 原因:Node との疎通失敗で新規 Index の Primary Shard が割り当てられなかった

Slide 26

Slide 26 text

予期せぬ挑戦とその解決策の話(その①) 解決策:Cluster & Index status が green になるのことを wait してから close_index

Slide 27

Slide 27 text

予期せぬ挑戦とその解決策の話(その①) 解決策:Cluster & Index status が green になるのことを wait してから close_index

Slide 28

Slide 28 text

予期せぬ挑戦とその解決策の話(その①) 解決策:Cluster & Index status が green になるのことを wait してから close_index

Slide 29

Slide 29 text

予期せぬ挑戦とその解決策の話(その②) 挑戦:実⾏時間が⻑くなり Pod が勝⼿に終了される

Slide 30

Slide 30 text

予期せぬ挑戦とその解決策の話(その②) 挑戦:実⾏時間が⻑くなり Pod が勝⼿に終了される Indexing 実⾏タスクの Bugsnag Alert (Not graceful shutdown)

Slide 31

Slide 31 text

予期せぬ挑戦とその解決策の話(その②) 原因:ASG による AZ rebalancing で Node が調整され Pod が Killed 24-02-09 19:45 Task 実⾏開始 * Source : https://kubernetes.io/ko/docs/tutorials/kubernetes-basics/explore/explore-intro/

Slide 32

Slide 32 text

Scale Down Auto Scaling 24-02-09 20:07 24-02-09 19:45 Launch Auto Scaling An instance was launched to aid in balancing the group's zones * Source : https://kubernetes.io/ko/docs/tutorials/kubernetes-basics/explore/explore-intro/ 予期せぬ挑戦とその解決策の話(その②) 原因:ASG による AZ rebalancing で Node が調整され Pod が Killed Availability Zone rebalancing (Reference) After certain actions occur, your Auto Scaling group can become unbalanced between Availability Zones. Amazon EC2 Auto Scaling compensates by rebalancing the Availability Zones.

Slide 33

Slide 33 text

予期せぬ挑戦とその解決策の話(その②) SIGTERM 原因:ASG による AZ rebalancing で Node が調整され Pod が Killed 24-02-09 20:07 24-02-09 19:45 24-02-09 20:14 kubelet sigterm * Source : https://kubernetes.io/ko/docs/tutorials/kubernetes-basics/explore/explore-intro/

Slide 34

Slide 34 text

予期せぬ挑戦とその解決策の話(その②) 原因:ASG による AZ rebalancing で Node が調整され Pod が Killed 24-02-09 20:07 24-02-09 19:45 24-02-09 20:14 terminationGracePeriodSeconds : 7200 24-02-09 22:14 kubelet sigkill * Source : https://kubernetes.io/ko/docs/tutorials/kubernetes-basics/explore/explore-intro/ SIGKILL

Slide 35

Slide 35 text

予期せぬ挑戦とその解決策の話(その②) 解決:terminationGracePeriodSeconds を調整

Slide 36

Slide 36 text

予期せぬ挑戦とその解決策の話(その③) 挑戦:件数多くて予想される実⾏時間がながいのに、並列実⾏ができない freee-invoice-worker ruby/rake resque task-runner import-runner mailer-runner

Slide 37

Slide 37 text

task (1) import (1) mailer (1) task (2) task (3) 予期せぬ挑戦とその解決策の話(その③) 挑戦:件数多くて予想される実⾏時間がながいのに、並列実⾏ができない freee-invoice-worker ruby/rake resque task-runner import-runner mailer-runner

Slide 38

Slide 38 text

task (2) task (3) task (1) import (1) mailer (1) 予期せぬ挑戦とその解決策の話(その③) 挑戦:件数多くて予想される実⾏時間がながいのに、並列実⾏ができない freee-invoice-worker ruby/rake resque task-runner import-runner mailer-runner

Slide 39

Slide 39 text

task (2) task (3) task (1) import (1) mailer (1) Task が溜まっていて、hpa の設定があっても スケールして並列実⾏されない 予期せぬ挑戦とその解決策の話(その③) 挑戦:件数多くて予想される実⾏時間がながいのに、並列実⾏ができない freee-invoice-worker ruby/rake resque task-runner import-runner mailer-runner

Slide 40

Slide 40 text

同じタスクは Enqueuing できないようになっていた (既存のタスクがDBのデータを変更させるものだったため、意図的に2重実⾏できないようにしていた) 予期せぬ挑戦とその解決策の話(その③) 挑戦:件数多くて予想される実⾏時間がながいのに、並列実⾏ができない

Slide 41

Slide 41 text

予期せぬ挑戦とその解決策の話(その③) 解決策:replicaSet の設定を調整

Slide 42

Slide 42 text

予期せぬ挑戦とその解決策の話(その③) 解決策:replicaSet の設定を調整 いつも5台の Pods が起動されるようになる

Slide 43

Slide 43 text

予期せぬ挑戦とその解決策の話(その③) 解決策:replicaSet の設定を調整 今後 hpa の設定を消して複数のタスク実⾏時に 上⼿くスケールするように改善したい

Slide 44

Slide 44 text

予期せぬ挑戦とその解決策の話(その③) 解決策:Task の Enqueuing Logic を修正 MULTI_EXECUTABLE_TASK_NAMES、MAX_PARALLEL_COUNT を確認して、Enqueuing

Slide 45

Slide 45 text

予期せぬ挑戦とその解決策の話(その④) 挑戦:データ量が多い⼀⽅で実施例がない 実⾏時間 約 37万秒 (約 99 時間) 確定申告が近づいてきていたため、 調査開始〜作業終了の間に対象帳票の23%が新規作成

Slide 46

Slide 46 text

予期せぬ挑戦とその解決策の話(その④) 解決策:⼿順書‧得られた知⾒の Docs 化 / ドメインキャッチアップ会実施

Slide 47

Slide 47 text

No content