大規模システムの設計におけるデータベースのスケーリング技術
データベースレプリケーション
データベースレプリケーションの基本
データベースをコピーして、複数のサーバーに分けて保存することで、障害が起きてもデータを守ることができます。複数のデータベースがユーザーにデータを提供することで、たくさんの人が同時に読み込めるようになります。
レプリケーションの方法
リーダー・フォロワー方式では、1人のリーダー(マスター)が書き込みを受けて、フォロワー(スレーブ)に変更内容を伝えます。
リーダー・リーダー方式では、複数のリーダーが書き込みを受け付けますが、競合解決が必要になります。
競合を解決するための方法は、タイムスタンプベースと最後の書き込み勝ち方式(Last Write Wins)の二つがあります。
タイムスタンプベースでは、最新のタイムスタンプの情報を参考にして競合を解決します。
最後の書き込み勝ち方式では、最も最近に書き込まれたデータが古いデータを上書きします。
アプリケーションによっては、特定のルールを設定して競合を解決することもあります。
シャーディング
シャーディングの基本
データベースが巨大化した場合、データを複数のサーバーに分散させることで水平スケーリングを実現。
大きなテーブルを分割し、各シャードにデータを配置する。
シャードキーの決定
シャードキーは、データがどのシャードに割り当てられるかを決定します。
範囲ベースのシャーディングでは、特定の範囲に基づいてデータを分割します。
ハッシュベースのシャーディングでは、ハッシュ関数を使ってデータを均等に分配します。
範囲ベースのシャーディングは、特定のデータを素早く取得できますが、ハッシュベースは均等な分配が可能です。
ハッシュベースでは、範囲クエリが非効率になる可能性があります。
SQLとNoSQLにおけるシャーディング
SQLデータベースのシャーディング
伝統的なSQLデータベースは、シャーディングを自動的にサポートしない。
シャーディングロジックを自分で実装する必要がある。
NoSQLデータベースのシャーディング
多くのNoSQLデータベース(例:MongoDB)は、組み込みのシャーディングサポートを提供。
自動的にシャーディングを行うため、カスタムロジックをほとんど必要としない。
レプリケーションとシャーディングの組み合わせ
両技術の利点
レプリケーションは高可用性を確保し、読み取り能力をスケールアップ。
シャーディングはデータを複数のサーバーに分散させ、処理能力を向上。
組み合わせの実装
レプリケーションされたスキーマ内で、リーダーまたはフォロワーのデータベースをシャーディングすることが可能。
システムの要件に応じて、両方の技術を組み合わせて使用することが一般的。