𝗦𝗵𝗮𝗿𝗱𝗶𝗻𝗴 𝗜𝗻 𝗔 𝗡𝘂𝘁𝘀𝗵𝗲𝗹𝗹 (シャーディングの概要)

シャーディングとは、大規模なデータベースを「シャード」と呼ばれる小さな断片に分割することです。1つの巨大なデータベースの代わりに、データを複数のサーバーに分散させます。

この手法には以下のメリットがあります:

  • より多くのデータを扱う
  • より多くのリクエストを処理する
  • 単一のマシンの負荷を軽減する
  • 水平方向にスケールする

データを正しいシャードにルーティングする方法を決定する必要があります。主な戦略は以下の通りです:

  1. レンジベース・シャーディング (Range Based Sharding) 値の範囲に基づいてデータを分割します。 例:
  • シャード 1: ユーザー 1 ~ 3000
  • シャード 2: ユーザー 3001 ~ 6000
  • シャード 3: ユーザー 6001 ~ 10000
  1. ハッシュベース・シャーディング (Hash Based Sharding) 数学的な関数を使用してシャードを選択します。 例: ユーザーIDに対して剰余演算子(modulo operator)を使用します。結果が0ならシャード1へ、1ならシャード2へデータを送ります。これにより、データが均等に分散されます。

  2. ディレクトリベース・シャーディング (Directory Based Sharding) ルックアップテーブルを使用して、正しいシャードを見つけます。 例: 通知システムがディレクトリ内で「YouTube」のようなアプリ名を検索します。ディレクトリがシステムに対し「シャード 1」を使用するように指示します。これはファイルシステムのフォルダのような仕組みです。

  3. 地理的シャーディング (Geographical Sharding) 場所に基づいてデータを保存します。 例:

  • インドのユーザーはインドのシャードへ。
  • アメリカのユーザーはアメリカのシャードへ。
  • ヨーロッパのユーザーはEUのシャードへ。
  1. ダイナミック・シャーディング (Dynamic Sharding) 範囲やハッシュをハードコードしません。アプリケーションは実行時に設定テーブルを確認します。コードを変更することなく、新しいシャードを追加できます。

  2. ハイブリッド・シャーディング (Hybrid Sharding) より良い結果を得るために、複数の手法を組み合わせます。 一般的なパターンは「ディレクトリベース + ハッシュベース」です。 まずディレクトリを使用してグループを見つけ、次にそのグループ内の特定のシャードをハッシュを使用して特定します。これにより、柔軟性とバランスの両立が可能になります。

出典: https://dev.to/code_with_aravind/sharding-in-a-nutshell-5f6b