MySQLとInnodbは、優れた汎用ソリューションを提供し、それほど高価ではないハードウェアでパフォーマンス要件に非常に簡単に対応できる可能性があります。適切なディスクを備えたデュアルクアッドコアボックスで、1秒あたり数千の更新を簡単に処理できます。組み込みの非同期レプリケーションを使用すると、可用性要件にほとんど対応できますが、プライマリに障害が発生すると、数秒分のデータが失われる可能性があります。この失われたデータの一部は、プライマリが修復されたときに回復可能であるか、アプリケーションログから回復可能である可能性があります。これを許容できるかどうかは、システムの動作に依存します。損失は少ないですが、速度は遅くなりますが、プライマリユニットとフェールオーバーユニットの間で共有ディスクを使用してMySQL Innodbを使用することもできます。この場合、フェールオーバーユニットは、プライマリに障害が発生してもデータを失うことなくディスクを引き継ぎます。ただし、プライマリに何らかのディスクの大惨事が発生していない場合に限ります。共有ディスクが使用できない場合は、DRBDを使用して、ディスクブロックを書き込み時にフェイルオーバーユニットに同期的にコピーすることでこれをシミュレートできます。これは、パフォーマンスに影響を与える可能性があります。
Innodbと上記のレプリケーションソリューションの1つを使用すると、データがフェールオーバーユニットにコピーされます。これは、リカバリの問題の大部分が解決されますが、フェールオーバーユニットをオンラインにするためにシステムを再構成するには、追加の接着剤が必要です。これは通常、RHCS、Pacemaker、Heartbeat(Linuxの場合)などのクラスターシステム、またはWindows用のMSClusterのものを使用して実行されます。これらのシステムはツールキットであり、環境に適したソリューションにそれらを構築するために手を汚す必要があります。ただし、これらすべてのシステムでは、プライマリに障害が発生したことをシステムが認識し、フェイルオーバーユニットを使用するようにシステムを再構成する間、短時間の停止期間があります。これは数十秒かかる場合があります。これを減らすと、障害検出システムの感度が高くなりすぎる可能性があります。
上に移動すると、MySQL NDBはリカバリまでの時間を短縮し、パフォーマンスを向上させるためにデータベースをある程度スケールアップすることを目的としています。ただし、MySQLNDBの適用範囲は非常に狭いです。システムはリレーショナルデータベースを分散ハッシュテーブルにマップするため、テーブル間の複数の結合を含む複雑なクエリの場合、MySQLコンポーネントとストレージコンポーネント(NDBノード)の間にかなりのトラフィックがあり、複雑なクエリの実行が遅くなります。ただし、適切なクエリは実際に非常に高速に実行されます。私はこの製品を数回見ましたが、既存のデータベースは複雑すぎてうまく収まらず、優れたパフォーマンスを得るには多くの再設計が必要になります。ただし、新しいシステムの設計段階にある場合は、その制約を念頭に置いておくことができれば、NDBはうまく機能します。また、
MySQL NDBでさえ、サイト全体の損失(データセンターでの火災、管理者エラーなど)に対処できません。この場合、通常、DRサイトに対して実行されている別のレプリケーションストリームが必要です。これは通常非同期で行われるため、サイト間リンクの接続ブリップによってデータベース全体が停止することはありません。これはNDBの地理的複製オプション(有料の電話会社バージョン)で提供されますが、MySQL5.1以降はこれをネイティブに提供できると思います。
残念ながら、私はZookeeperとChubbyについてほとんど知りません。うまくいけば、他の誰かがこれらの側面を理解することができます。