分散システムデザインパターン読書メモ2

シャーディングされたサービス

レプリカされたサービスではリクエストはどのレプリカでも処理することができた、
それに対してシャーディングされたサービスでは一部のリクエストを特定のレプリカのみが処理できる。 代表的な例として、データサイズが一台で処理するには大きすぎる場合に使われる。

シャーディングされたキャッシュ

  • シャーディングされたキャッシュは、完全なレプリカではできなかった数のキャッシュを行い、シャードを増やした分だけキャッシュヒット率をあげることができる

シャーディングされたキャッシュのレプリカ

  • シャーディングのレプリカはキャッシュサーバーの更新時のデプロイ時にも負荷の増大を防ぐことができる
  • シャーディングされた各ノードのレプリカを作ることは、耐障害性だけでなく、特定のノードに負荷が集中する「ホットシャーディング」に効果がある
  • ホットシャーディング時に、特定のノードのみレプリカを増やして負荷を分散させることができる

シャーディング関数をためしてみる

  • 一番シンプルな例はmod関数
  • 決定性: 同じ入力に対して常に同じ結果を返す
  • 均一性: 出力に対する出力の分散具合は均一
  • シャードのキーを決めるには、どのようなリクエストが来るのかの理解が必要
  • シャードへのルーティングについて次の2つが紹介されていた
    • アンバサダーパターンを使う方法、それぞれトレードオフの関係にある
      • ノード分のアンバサダーコンテナが必要になる、複雑度があがる
    • シャードルーターを使う方法がある
      • シンプルだが、負荷が増えることでスケールアウトが必要になる、レイテンシーがあがる
  • コンシステントハッシュでは、キー数/スケール後のキャッシュノード数のみキーの移動が発生する

スキャッタ・ギャザー

処理時間をスケールさせるためのデザインパターン 複数台で1つのリクエストを分割処理してマージすることによって処理を高速化させる

ルートによる分散とスキャッタ・ギャザー

  • ルートノードからのリクエストを処理して返すリーフノードと
  • 処理を分割してリーフにリクエストし・レスポンスをマージするルートノードの組み合わせ

リーフをシャーディングしたスキャッタギャザー

シャーディングされたデータを各リーフが自分の持つデータ範囲から検索を行いルートノードでマージする仕組み

適切なリーフの決め方

信頼性とスケーラビリティのためのスキャッタギャザーのスケール

ほとんどの処理を99%高速に返していても、残り1%で詰まっている場合は、遅い方に足を引っ張られる。 各リーフノードの対象外性をあげるために、過去の章でも登場したシャーディングのレプリカの作成は有効である。

9. オーナーシップの選出

  • etcd
  • 分散ロックでは、あらゆる処理時間がロックのTTLよりも短くなるようにすることが重要