私の要件は:
現在、700の接続でハイCPUのエクストララージインスタンスを最大化しています。 8コアすべてが最大です。メモリは問題ないので、それは同時接続の数だと思います。書き込み自体は非常に単純です(検証により処理が遅くなります)。 3000にスケーリングするには、現在のオプションである複数のサーバーに移動する必要があります。
この数の接続を処理するには、いくつかの質問があります。
私の問題をうまく説明していないとすみません。質問してください。
MySQLをメインデータベースとして使用している場合は、MySQLレプリケーションを介してスタートポロジを使用することを検討してください。
UGHHH、ROFL、およびOMGをMySQLレプリケーションと言う前に、私に聞いてください。
スタートポロジでは、1つのDBサーバー(Distribution Mster [DM]と呼ばれます)に書き込み、SQLコマンドを複数のDBサーバーに送信できます。このようなDBインフラストラクチャをどのようにセットアップしますか?
ここに説明があります
5つのDBサーバーがあります(サーバーA、B、C、D、E)
サーバーA
サーバーB、C、D、E
私は以前にこれについて投稿したことがあります
MySQLレプリケーションを最高の形に保つには
MySQL Clusterは、シャーディングへの別のアプローチかもしれません。 ここで投稿を確認してください 。
私はまた、Cassandraの大ファンですが、それはデータモデルと実行するクエリに大きく依存します。 Cassandra書き込みは非常に高速です。なぜなら、それらは常にディスク上で連続しているからです。
マルチヘッドにする場合(本当に3Kのアクティブな接続が必要な場合に必要になるでしょう)おそらく、Riakまたは多分Cassandraを調べます。これは実際にアプリがどのように適合するかによって異なりますが、あなたが述べたことから、Riakのようなものに適合すると思います。
そうは言っても、データをセグメント化する良い方法を見つけることができ、クロスシャードの必要性を最小限に抑えることができれば、シャードアプローチはかなり実行可能のようです。私はmysqlのリング/スター/ mmmのものから離れて、ストレートシャーディングに固執します。実際、Postgresを使用するつもりであれば、herokuなどのスキーマを使用して簡単にプロトタイプを作成し、個々のノードを超えてデータベースをフォークして分割することができます。
ああ、あなたはこのようなものを垂直にスケーリングしようと試みることができると思いますが(単一ノードがすべての3K接続を処理する)、クラウドでそれを行うことができるとは思いません。
個人的には、管理のしやすさ、スケーラビリティ、一般的な使いやすさから、MongoDBを好みます。また、実際にRDBMSが必要でない限り、SQLなしを使用します。
そうは言っても、アプリケーションにとって最も意味のあるDBを選択してください。トランザクションが必要な場合、または結合なしでアプリを設計できない場合(または、結合を使用した方がわかりやすい場合)、RDBMS(MySQL、PostGresなど)を使用します。
私は個人的にはMongoDBを好みますが、MySQLはスケーリングしないか、高率のトランザクションを処理できないという考えは純粋に誤りです。 Facebookエンジニアリングチーム(およびその中のMySQLチーム)は、これについて非常に詳しく説明しています。また、Etsy Opsチームのブログもご覧ください。 MySQLも大好きです。
最後に、MySQLキャッシュにMongoDBを使用しません。そのためにMemcachedを使用します。
Redisは、特定のユースケースを処理するのに適した、RAM内のKey-Valueストアでもあります。 blog.agoragames.comには、いくつかの使用例を説明するブログエントリがあります。
No-SQLを考えている場合は、CouchDBもチェックしてください。ただ 通常のメンテナンスが必要なことに注意してください ディスクの使用率を抑えるためです。 (Disk utilの速度と利便性を犠牲にしています...)
最後に、キャパシティプランニングは予測が容易ではありません。できる限り現実的な条件でテストし、表示に基づいて修正する準備をする必要があります。残念ながら、「コンピュータサイエンス」は科学と同じくらいアートです。
特定のアプリケーションのオプションである場合は、非同期の方法を使用してデータベースにデータを書き込み(ワークキュー、バッチ挿入など)、および/またはプロキシを前に置いてデータベースから多くのクライアント接続をシフトすることができます。 。
シャーディングを使用すると、通常は適切にスケーリングできますが(2x db-servers == 2x接続)、データセットの性質と、シャード間で分割する方法に大きく依存します。