私は利用可能なオプションについてたくさん読んでいます。また、High Performance MySQL 2ndエディションも手に入れました。これは、強くお勧めします。
これは私が何とかつなぎ合わせたものです:
クラスタリング
一般的な意味でのクラスタリングとは、外部アプリケーションに1つのサーバーとして表示される多くのサーバーに負荷を分散することです。
MySQLNDBクラスター
MySQL NDB Clusterは、同期レプリケーションと自動データパーティショニングを備えた分散型のメモリ内シェアードナッシングストレージエンジンです(すみません、ハイパフォーマンスの本から文字通り借りていますが、非常にうまく配置されています)。一部のアプリケーションでは高性能のソリューションになる可能性がありますが、Webアプリケーションは一般的にうまく機能しません。
主な問題は、非常に単純なクエリ(1つのテーブルのみにアクセスする)を超えて、クラスターは通常、複数のノードでデータを検索する必要があるため、ネットワークレイテンシーが忍び寄り、クエリの完了時間が大幅に遅くなることです。アプリケーションはクラスターを1台のコンピューターとして扱うため、データをフェッチするノードをアプリケーションに指示することはできません。
さらに、メモリ内の要件は、多くの大規模なデータベースでは機能しません。
継続的なセコイア
これはMySQLの別のクラスタリングソリューションであり、MySQLサーバー上でミドルウェアとして機能します。同期レプリケーション、負荷分散、フェイルオーバーを提供します。また、リクエストが常に最新のコピーからデータを取得し、新しいデータを持つノードを自動的に選択するようにします。
私はそれについていくつかの良いことを読みました、そして全体的にそれはかなり有望に聞こえます。
フェデレーション
フェデレーションはクラスタリングに似ているので、ここでも引っ張っています。MySQLは、フェデレーションストレージエンジンを介してフェデレーションを提供します。NDBクラスターソリューションと同様に、単純なクエリでのみ適切に機能しますが、複雑なクエリのクラスターではさらに悪化します(ネットワーク遅延がはるかに高いため)。
レプリケーションと負荷分散
MySQLには、さまざまなサーバー上にデータベースのレプリケーションを作成する機能が組み込まれています。これは、サーバー間での負荷の分割、ホットバックアップ、テストサーバーの作成、フェイルオーバーなど、さまざまな用途に使用できます。
レプリケーションの基本的なセットアップには、主に書き込みを処理する1つのマスターサーバーと、読み取りのみを処理する1つ以上のスレーブが含まれます。より高度なバリエーションは、マスターマスター構成のバリエーションです。これにより、複数のサーバーに同時に書き込みを行うことで、書き込みをスケーリングすることもできます。
各構成には長所と短所がありますが、それらすべてが共有する1つの問題は、レプリケーションの遅延です。MySQLレプリケーションは非同期であるため、すべてのノードが常に最新のデータを持っているわけではありません。これには、アプリケーションがレプリケーションを認識し、レプリケーション対応クエリを組み込んで期待どおりに機能する必要があります。一部のアプリケーションでは、これは問題にならない場合がありますが、常に最新のデータが必要な場合は、多少複雑になります。
レプリケーションでは、ノード間で負荷を分割するためにある程度の負荷分散が必要です。これは、アプリケーションコードにいくつかの変更を加えるか、専用のソフトウェアおよびハードウェアソリューションを使用するだけの簡単なものにすることができます。
シャーディングとパーティショニング
シャーディングは、データベースソリューションを拡張するために一般的に使用されるアプローチです。データを小さなシャードに分割し、それらをさまざまなサーバーノードに分散させます。これには、アプリケーションが必要な情報の場所を知る必要があるため、アプリケーションが効率的に機能するためにデータストレージの変更を認識している必要があります。
HibernateORMの拡張機能であるHibernateShards(残念ながらJavaにあります。私はPHPを使用しています)など、データシャーディングの処理に役立つ抽象化フレームワークがあります。HiveDBは、シャードリバランスもサポートするもう1つのソリューションです。
その他
スフィンクス
Sphinxは全文検索エンジンであり、テスト検索以外にも使用できます。多くのクエリでは、MySQLよりもはるかに高速で(特にグループ化と並べ替えの場合)、リモートシステムに並列にクエリを実行して結果を集約できるため、シャーディングでの使用に非常に役立ちます。
一般に、スフィンクスは、利用可能なハードウェアとインフラストラクチャをより多く取得するために、他のスケーリングソリューションと一緒に使用する必要があります。欠点は、アプリケーションコードを賢く使用するためにスフィンクスを認識する必要があることです。
概要
スケーリングソリューションは、それを必要とするアプリケーションのニーズによって異なります。私たちにとって、そしてほとんどのWebアプリケーションにとって、レプリケーション(おそらくマルチマスター)は、負荷を分散するロードバランサーを使用する方法であると私は信じています。特定の問題領域(巨大なテーブル)のシャーディングも、水平方向にスケーリングできるようにするために必須です。
また、Continuent Sequoiaを試して、アプリケーションコードへの変更が最小限で済むため、実際に約束どおりに実行できるかどうかを確認します。