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