Vinted探索スケーリング第2章:ルータでのReligSearch要求のルーティング要求


これは、FlasticSearchクラスタのアップグレードから始まった.すべての主要な弾性率のバージョンは、新機能、無料のパフォーマンス、互換性の問題、および不確実性をもたらします.
加えて、我々は、分析のための応答、ストレステストのためのレコードクエリ、および1秒ごとに要求ごとにアカウントを要求、コンジョイント要求を解剖するためにかゆみを持っていた.
これらの要件を念頭に置いて、我々はsidecar コンポーネントの次のコンポーネント.
一番左のコンポーネントは、検索要求が複数のエラスティックサーチクラスタによって処理されていることを知らないコアアプリケーションです.
次のコンポーネントはsidecar サービスRust プログラミング言語、我々はSRouterを呼び出します.
図1.スラウド
SRouterサイドカーは、我々が生産に影響を及ぼすことなくリアルタイム生産ワークロードを使っている異なる弾力サーチ・バージョンをテストして、比較することができる複数の弾性サーチ・クラスタへのルーティング・サーチ要求の私たちのきめ細かなコントロールを提供します.
サービスは、シンプルで読みやすい方法で構成されています.設定は、特定のHTTPリクエストパスに対して粒状である可能性があります.
or greedy ユースケースで必要に応じて.
簡単な構成サンプルは、下で見ることができます.
--------
whitelist_ends_with:
  - /_count
  - /_search
routes:
  main-items/_search:
    main:
      - http://127.0.0.1:1000
    mirror:
      - http://127.0.0.1:1010
    amplify: 4
    timeout: 311

  lt-main-items/_count:
    main:
      - http://127.0.0.1:1100
    timeout: 100
    sampling: 10
    storage:
      - http://dc1-host.example.com:8082/topics/storage

  default:
    main:
      - http://127.0.0.1:2000
    timeout: 200
生産での書き込み時に、我々は10カスタムルートを定義している、それは3分までの生産のすべてのルートを変更するには、ほとんどの時間の展開に費やされます.
構成は変更を追跡するためにgitリポジトリに保存されます.構成サンプルではgreedy main-items/_search ミラートラフィックを4 x倍に増幅したルート.
二番目lt-main-items/_count ルートは100 msのタイムアウトとリクエストの10パーセントがKafka .
比類のないルートに戻るdefault ルートSRouterはHTTPメソッドについてpickyです、サービスは任意の経路HTTP GET要求を許容します、一方、HTTP POST要求は白でリストされます、他のどのケース・サービス・リターンでも405: method not allowed ステータス.
HTTPメソッドの制限は、偶然のインデックスの削除、直接インデックスから保護し、“安全に”エラスティックサーチにアクセスするエンジニアのためのゲートウェイとして機能します.
設定の柔軟性は、特定の種類の要求を処理する専用のAntiticSearchクラスタを整形することによって、検索スケールに対する想像力を解除します.
構成ルートは、サービス中断なしでシームレスに更新されますSIGHUP シグナル
更新信号を受信した後、UPDATEatomic pointer 新しいルートを更新します.
原子ポインタはrelaxed memory ordering 更新するHashMap 経路の.
srouterはOSI layer 7 低レベルの上に構築されたルータhyper サーバとtokio 非同期ランタイム.
Rustがパフォーマンスで有名であるように、このサービスは異なっています、それは毎秒200のルートアップデートで毎秒500 kの要求を提供することができます.
SRouter単一のインスタンス生産資源フットプリントは、1台のCPUにつき1つのトキオコア糸ですPrometheus metrics サービス公開.
サービスによって提供されるメトリクスlabeled リクエストごとにパス.
サイドカーサービスにおけるラベリングの集中化は、主要なアプリケーションをより簡単にします.
ラベルのメトリクスは、周波数とクエリのボリュームの基本的な理解を提供し、それは生産の前に悪い要求を検出するために、各リクエストのパーセンタイルを測定し、要求の正確な数を追跡するのに役立ちます.
メトリックに加えて、我々はクエリの一部とすべての失敗した応答をサンプリングしています.
リクエストされた要求は要求、応答ヘッダー、要求時間と要求を完了するためにSRouterのために取ったサービス時間で濃縮されます.
格納された要求/応答の組合せは、私たちが弾性検索を廃止するのを許しましたslow query logs , 変更されたI/O活動、クエリの母集団サンプルが改善されます.
問合せの母集団サンプルは「遅い」だけではなく(検索要求待ち行列、索引付けの負荷、GCなどの多くの要因に依存している内部ES測度によって定義されています)、また、均一な方法で再び速く、また失敗した質問をサンプリングすることによって改善されます.
SRouterは、我々の計画されたスケーリング戦略の重要なサービスであることを証明しました.C++同時実行のアンソニー・ウィリアムズは、スケーラビリティをスケーラビリティを定義します.
我々は、2つの単純なscaling cubes .
図2.スケーリングキューブ
将来の章では、どのように我々は“スケーリングキューブを使用している”を検索します.
あなたが読んだことが好き?我々は現在検索エンジニアを雇っているhere .
参照:
  • アンソニー・ウィリアムズによるC++同時実行https://www.manning.com/books/c-plus-plus-concurrency-in-action
  • Rustとの並行性に関する手:自信をもって、ブライアンL .トラウトによる錆のメモリ安全で、平行で、効率的なソフトウェアを構築しますhttps://www.amazon.com/Hands-Concurrency-Rust-Confidently-memory-safe/dp/1788399978
  • 時雄https://github.com/tokio-rs/tokio
  • ハイパーhttps://hyper.rs , https://github.com/hyperium/hyper
  • スケーリングキューブhttps://en.wikipedia.org/wiki/Scale_cube
  • 貪欲な正規表現:https://www.regular-expressions.info/repeat.html