読み取り/書き込みを多用するアプリケーション向けに、フェールオーバークラスタリングを備えたドキュメントデータベースストレージソリューションを検討しています。
データベースには、毎秒平均40Kの同時書き込みが行われます(ピークは70,000に達する可能性があります)-ほぼ同じ数の読み取りが発生する可能性があります。
また、dbが新しく書き込まれたレコードについて通知するメカニズムも必要です(dbレベルでの何らかのトリガー)。
ドキュメントデータベースの適切な選択と関連する容量計画の観点から、どのようなオプションが適切でしょうか?
更新済み
期待の詳細。
「20,000同時書き込み」が挿入を意味する場合、CouchDBにアクセスして、トリガーに「_changes」APIを使用します。しかし、20.000回の書き込みでは、安定したシャーディングも必要になります。次に、 bigcouch を確認することをお勧めします
そして、「20.000」の同時書き込みが「ほとんど」の更新で構成されている場合、「その場での更新」はかなり素晴らしいので、MongoDBに確実に行きます。ただし、トリガーを手動で処理する必要がありますが、別のコレクションを使用して一般的なドキュメントを適切に更新すると、便利なソリューションになります。再びシャーディングに注意してください。
最後に、同時実行だけではデータベースを選択できないと思います。API(データを取得する方法)を計画して、手元にあるオプションを確認する必要があります。
MongoDBをお勧めします。私の要件はあなたの要件ほど高くはありませんでしたが、それはかなり近いものでした。 C#を使用する場合は、公式のMongoDB C#ドライバーとInsertBatchメソッドとSafeModeがオンになっています。ファイルシステムが処理できるのと同じくらい高速に文字通りデータを書き込みます。いくつかの警告:
そうは言っても、RavenDBも調べることをお勧めします。それはあなたが探しているものすべてをサポートしますが、私の人生の中で、私はそれをモンゴの近くのどこでも実行させることができませんでした。
MongoDBに近づいた唯一の他のデータベースは Riak でした。そのデフォルトのBitcaskバックエンドは、キースペースを格納するのに十分なメモリがある限り、途方もなく高速ですが、私が覚えているように、それはトリガーをサポートしていません。
Membase(および間もなくリリースされるCouchbase Server)は、ニーズを簡単に処理し、動的なスケーラビリティ(オンザフライでノードを追加または削除)、フェイルオーバー付きのレプリケーションを提供します。上部のmemcachedキャッシングレイヤーは200k ops/secを簡単に処理し、複数のノードで線形にスケールアウトして、データをディスクに永続化することをサポートできます。
レイテンシが非常に低いことを示す最近のベンチマークがいくつかあります(これはおおむねハイスループットに相当します): http://10gigabitethernet.typepad.com/network_stack/2011/09/couchbase-goes-faster -with-openonload.html
サポートされているエンタープライズクラスの製品の後ろにエンジニアリングリソースとQAリソースがあることがどれほど重要かわからないが、それも利用できる。
編集:組み込みのトリガーインターフェイスが既にあることを忘れてしまったため、データがディスクにヒットする(永続化される)か、レプリケートされるかを追跡するためにさらに拡張します。
ペリー
十分なキャッシュとソリッドディスクが非常に高速であることを前提として、GoogleのLevelDBバックエンドでRiakを実行します(ここに 素晴らしいベンチマーク がGoogleから提供されています)。文書の構造とそのサイズ(2KBと述べた)によっては、もちろんそれをベンチマークする必要があります。 [データを(ビジネス的に)シャーディングできる場合は、単一ノードで40K/sのスループットを維持する必要がないことに注意してください]
LevelDBのもう1つの利点は、データ圧縮=>ストレージです。ストレージに問題がない場合は、圧縮を無効にすることができます。その場合、LevelDBは文字通り飛行します。
セカンダリインデックス付きのRiakを使用すると、データ構造をドキュメント化されたとおりに作成できます=>検索対象のフィールドのみにインデックスを付けます。
成功して無痛Fail Over
はRiakの2番目の名前です。ここは本当に輝いています。
信頼できるpre-commit
およびpost-commit hooks
Riakでその動作を実現しますが、トリガーとしては、価格=>パフォーマンス/保守性が伴います。
Riakはディスクに書き込みます(非同期のMongoDBサプライズはありません)=> reliably readable
直ちに。整合性を高める必要がある場合は、Riakのクォーラムを挿入用に構成できます。挿入が成功したと見なされるまでに戻ってくるノードの数
一般的に、fault tolerance
/concurrency
/fail over
/scalability
はあなたにとって重要です。Erlangが長年これらの問題を解決してきたため、Erlangで記述されたデータストアを使用します。