Upgrade to Pro — share decks privately, control downloads, hide ads and more …

LegalForce社での全文検索インフラ活用事例

aibou
February 18, 2021

 LegalForce社での全文検索インフラ活用事例

aibou

February 18, 2021
Tweet

More Decks by aibou

Other Decks in Programming

Transcript

  1. ⾃⼰紹介 u 浜地亮輔(はまじ りょうすけ) u 株式会社LegalForce(2020年9⽉〜 u Twitter ID: @aibou

    u Elasticsearch歴︓4年ぐらい u 前々職でニュース記事の検索インフラ構築・運⽤ u AWS OpsWorks(EC2、Managed Chef) u 趣味︓NFL観戦🏈、クライミング
  2. 検索機能の開発担当陣 u Luceneのコミッターを含めた強⼒エンジニア陣 u 独⾃にプラグイン開発して本番投⼊ u 事業要望に沿ってクエリチューニング u 顧客からのヒアリングを元に実装したり u

    事業の温度感としても検索機能はかなり⾼い u ただインフラ周りはまだまだ発達途上 u が⽚⼿間で⾒てる Luceneのコミッターの⼈ とある⽇のとある検索機能開発者からのPR
  3. 製品ごとのESクラスタ ECS (on EC2) GKE 条⽂検索⽤クラスタ キーワード補完⽤クラスタ Ver 7.9.1 ・analysis-kuromoji

    ・analysis-icu Ver 7.9.1 ・analysis-kuromoji-completion (⾃作プラグイン) 条⽂検索⽤クラスタ Ver 7.9.1 ・analysis-kuromoji ・analysis-icu
  4. クラスタ構成と分割の理由 u クラスタ構成 u master, data, client の3roleに分割 u 負荷分散、マシンリソース最適化のため

    u クラスタ分割の理由 u 保持してるデータの質や機能品質が異なるため 機能 アクセス頻度 障害時の品質影響 情報資産の重要度 条⽂検索⽤(LF) 中 中 ⾼ 条⽂検索⽤(MA) ⾼ ⾼ ⾼ キーワード補完⽤(LF) ⾼ 低 低 Master data client x3 x2 x3
  5. コンテナの理由 u 構築後に⼊社したので詳しい経緯はわからず・・・ u オペレーション上楽だったところ u ESのパラメータを環境変数で設定可能 u k8sではStatefulSetを使うことでクラスタアップグレードが容易 u

    ECSは不可能ではないがヘルス率の制御が職⼈芸になりうる u それでも怖いので結局ひとつずつタスク⽌めてる u コンテナ・仮想マシンハイブリッド構成はいいかも u masterはk8s、dataは仮想マシンなど u client, ingest等データを持たないものはコンテナとの親和性⾼そう
  6. INDEX運⽤ u 条⽂検索⽤クラスタ u 1 INDEX = 1 顧客 u

    1 INDEX = 1shard 3replica u = 顧客が1社増えると3shard増える u 700社超えたので・・・ u とはいえ1INDEXあたりの容量はそこまで u 解約した顧客のデータはINDEXごと削除 u 運⽤はメチャクチャ楽 u ただし︓1node 1000shard超える運⽤は推奨されていない u 超えそうならdataノードを追加してシャードを分散させる u とはいえ顧客・ユーザ数等に相関してINDEX増やす設計は⾒直したほうが良さそう 毎時のsnapshotでメチャクチャ負荷かかってる 資料作成中時点のシャード数 (2xxx shard
  7. スナップショット肥⼤化 u elasticsearch-curator を使ってスナップショットを取得・S3/GCSに保管 u 毎時取得・全INDEX u 製品のホワイトペーパーに「1時間に1回取得」と明記 u =毎時700個以上のsnapshotオブジェクトが出来上がっていく

    u とある⽇から︓スナップショット取得タイミングで警告⽂が頻出 u AWSの条⽂検索クラスタ u オブジェクト数が300万個 u 古いスナップショットを消していない
  8. スナップショット肥⼤化 u S3バケット向き先切り替えでリフレッシュ u curatorからSnapshot Lifecycle Management(SLM)に移⾏ u Elasticsearch 7.5から利⽤可能

    u スナップショット作成・削除の設定 u (スナップショット⾃動化のために) 今後はCurator使わなくてOK { “schedule”: “0 */1 * * * ?”, “name”: “<snapshot-{now/h}>”, “repository”: ”${s3_bucket}", ”config": { "indices": ["internal_*"], "ignore_unavailable": false, "include_global_state": false }, "retention": { "expire_after": "90d" } } SLMの設定内容