2012-04-05 13 views
1

大量のデータを生成してディスクに保存するシステムを開発中です。以前に開発されたシステムのシステムでは、通常のファイルを使用してデータを保存していましたが、いくつかの理由から管理が非常に難しくなりました。多くの書き込み用NoSQLデータベース

私はNoSQLデータベースが良い解決策であると信じています。私たちが保存しようとしているのは、一般に、いくつかのメタデータを注釈したドキュメント(通常は約100Kですが、場合によってはもっと大きくても小さくてもかまいません)です。クエリのパフォーマンスは最優先事項ではありません。優先順位は、I/Oができるだけ小さな混乱になるように書くことです。データの生成速度は約1Gbpsですが、将来は10Gbps(またはそれ以上)になる可能性があります。

私の他の要件は、(よく書かれている)C APIが利用可能であることです。私は現在MongoDBをテスト中です。これは良い選択ですか?そうでない場合、私はどのような他のデータベースシステムを使用できますか?

+0

「redis」試してみてください。http://redis.io/ – Baba

答えて

2

データの生成速度は約1Gbpsです。現在、MongoDBをテスト中です。これは良い選択ですか?

OK、明らかにすると、データレートは10秒あたり〜1ギガバイトです。だから、20分ごとに1TBのハードドライブを充填していますか?

MongoDBは書き込み率がかなり高いですが、RAMとデータの比率が適度に低い状況で理想的に使用されます。 を少なくとものプライマリインデックスといくつかのデータと共にメモリに保存します。

私の経験では、5-10GBのデータごとに約1GBのRAMが必要です。その数を超えると、読み取りパフォーマンスが大幅に低下します。 100GBのデータに対して1GBのRAMになると、索引がRAMに収まるのを止めると、新しいデータを追加することも遅くなる可能性があります。ここ

大きなキーは、次のとおりです。

何クエリあなたが実行するために、どのようにMongoDBは、簡単にこれらのクエリを実行している作るん計画していますか?

データは非常に迅速に基本的にすべてのクエリがディスクに移動するのに十分な領域を占有します。非常に特定の索引付けとシャーディング戦略がない限り、ディスクスキャンを実行するだけです。

さらに、MongoDBは圧縮をサポートしていません。そうすれば、たくさんのディスク容量を使用することになります。

他のデータベースシステムを使用することはできますか?

圧縮されたフラットファイルはありますか? Cが重要な要件である場合、または、おそらくビッグデータマップ/ Hadoopの(私はHadoopのはJavaで書かれている知っている)

のようなシステムを軽減し、多分あなたはTokyo/Kyoto Cabinetを見てみたいですか?


EDIT:詳細

MongoDBのないサポートフルテキスト検索を行います。そんなことをするためには、他のツール(Sphinx/Solr)を見なければなりません。

インデックスを使用する目的を大きくするために、インデックスを大きくします。

あなたの数字によれば、10Mのドキュメント/ 20分または約30M /時を書いています。各ドキュメントには、インデックスエントリのために約16 +バイトが必要です。 ObjectIDの場合は12バイト、2GBファイルへのポインタの場合は4バイト、ファイルへのポインタ+パディングの場合は1バイト。

すべてのインデックスエントリが約20バイト必要で、インデックスが600MB /時間または14.4GB /日で増加しているとします。これはデフォルトの_idインデックスです。

4日後、メインインデックスがRAMに収まらなくなり、パフォーマンスが大幅に低下します。 (これはMongoDBで十分に文書化されています)

これで、実行するクエリを特定することが重要になるでしょう。

+0

ディスク容量は大きな制限ではありませんが、RAMです。現在、システムには48GBのRAMが搭載されています。私たちが10Gbps以上に移行すれば、RAMを増やすことができます。クエリは、メタデータまたはある種の全文索引のいずれかで実行されます(ところで、MongoDBはフルテキスト索引付けをサポートしていますか?)。最終的なデータベースのサイズについては、2カ月(またはそれ以上)のデータを保持する必要があります。私は東京/京都に慣れていない。私はそれらについてもっと読む必要があります。 – Elektito

+0

Nitpick:1Gbpsは、通常1ギガバイトではなく、1ギガバイトを意味します(http://en.wikipedia.org/wiki/Gigabyteから「ギガバイトの単位記号はGBまたはGBですが、Gb(小文字のb)はありません)。通常はギガビットで使用されています)。)まだかなり速いようですが、金融市場データがこのレートで配信された状況で働いています。 –

+0

ところで、5〜10GBのデータごとに1GBのRAMが私には大変なように聞こえます。なぜそんな高い比率?私が見た指数はずっと小さい。インデックスを大きくすると、インデックスを使用する目的が無効になります。 – Elektito

2

Cassandraをご覧ください。書き込みを実行すると、読み取りよりもはるかに高速です。おそらく、それはあなたが探しているものです。

+0

私が間違っていると私を訂正しますが、多くの列を持っているときに適したソリューションのようなCassandraはBigTableではありませんか?それはSchemalessデータベースとして動作しますか?また、Cassandraに利用可能なC APIがないようです。 – Elektito

+1

@Homayoon実際には、カサンドラは略図です。 Read http://www.datastax.com/solutions/schema-less-database 少なくともThriftトランクにはC glibサポートがあります。つまり、CassandraのCクライアントを作成することができます。まだ十分にテストされていません.Cassandra 0.7をサポートするC++クライアントも開始しましたが、すでに完了しているかどうかはわかりません。 https://github.com/thobbs/Coroebus –

関連する問題