75

We're developing a really big project and I was wondering if anyone can give me some advice about what DB backend should we pick.

Our system is compound by 1100 electronic devices that send a signal to a central server and then the server stores the signal info (the signal is about 35 bytes long). How ever these devices will be sending about 3 signals per minute each, so if we do de numbers, that'll be 4.752.000 new records/day on the database, and a total of 142.560.000 new records/month.

We need a DB Backend that is lighting fast and reliable. Of course we need to do some complex data mining on that DB. We're doing some research on the MongoDB/Cassandra/Redis/CouchDB, however the documentation websites are still on early stages.

Any help? Ideas?

Thanks a lot!

4

8 に答える 8

101

空間規模 (1000 台以上のデバイス) が、計算規模やストレージ規模について誤解を招かないようにしてください。1 秒あたり数十回の 35 バイトの挿入は、ローエンドのハードウェアで実行されている場合でも、主流の DBMS にとって些細な作業負荷です。同様に、1 か月あたり 1 億 4,200 万件のレコードは、インデックスを含む圧縮なしで、1 か月あたり 1 ~ 10 ギガバイトのストレージにすぎません。

質問のコメントで、あなたは次のように述べました。

「信頼性、スケーラビリティ、スピードがすべてです。ノードを追加するだけでソリューションが簡単にスケールできること (MongoDB オートシャーディング?) が非常に重要であり、スピードも非常に重要です。

信頼性?主流のDBMSはこれを保証できます(データが破損せず、クラッシュしないことを意味すると仮定します-この回答の下部にあるCAP定理に関する私の議論を参照してください)。スピード?1 台のマシンでも、この 10 ~ 100 倍の作業負荷は問題になりません。スケーラビリティ? 現在の速度では、圧縮されていない、完全に索引付けされた 1 年分のデータでも、100 ギガバイトのディスク・スペースに簡単に収まります (同様に、挿入速度が問題にならないことは既に確認済みです)。

そのため、NoSQL のような風変わりなソリューションや、分散データベースでさえも明確に必要とは思いません。MySQL のような単純で古いリレーショナル データベースで十分です。フェールオーバーが心配な場合は、マスター/スレーブ構成でバックアップ サーバーをセットアップするだけです。現在のスケールの 100 倍または 1000 倍の話をしている場合は、データ収集デバイスの ID に基づいていくつかのインスタンスを水平に分割します (つまり、 {partition index} = {device id} modulo {number of partitions})。

リレーショナル データベースの世界の安全で快適な領域を離れるということは、その表現モデル豊富なツールセットの両方を放棄することを意味することに注意してください。これにより、「複雑なデータマイニング」がはるかに困難になります。データをデータベースに入れるだけでなく、データを取得する必要もあります。

そうは言っても、MongoDB と CouchDB はデプロイと操作が非常に簡単です。それらは非常に楽しいものでもあり、多くの人 (プログラマーだけでなく、エグゼクティブも!) にとってあなたをより魅力的にするでしょう。

一般的な知恵は、あなたが提案した3つのNoSQLソリューションのうち、Cassandraが挿入量が多い場合に最適であるということです(もちろん、相対的に言えば、挿入量が多いとは思いません-これはFacebookで使用するように設計されました) ; これは、作業がより困難になることによって打ち消されます。したがって、言及していない奇妙な要件がない限り、ユースケースには反対することをお勧めします。

NoSQL の導入に積極的に取り組んでいる場合は、CAP の定理を検討することをお勧めします。これは、MongoDB と CouchDB のどちらかを決定するのに役立ちます。ここに良いリンクがあります: http://blog.nahurst.com/visual-guide-to-nosql-systems。それはすべて、「信頼性」が何を意味するかにかかっています。MongoDB は可用性と一貫性を交換しますが、CouchDB は一貫性と可用性を交換します。(Cassandra では、クエリごとに、書き込み/読み取りが成功するために書き込み/読み取りが必要なサーバーの数を指定することで、このトレードオフを巧みに調整できます。更新: BigCouchを使用して CouchDB も可能です!非常にエキサイティングです...)

あなたのプロジェクトで頑張ってください。

于 2010-10-01T22:21:28.653 に答える
28

答えの多くは、収集した後に何をしたいかによって異なります。大量のデータを保存するのは簡単です。ログ ファイルに書き込むだけで、データベースは必要ありません。一方、複雑な分析やデータ マイニングを実行する場合は、データベースが役に立ちます。

次の質問は、どのような分析を行うかです。特定のプロパティを持つデータのサブセットに対して実行されますか? 過去の時間/日/週/月のみ、データを集約または事前に計算できますか? つまり、収集された形式でデータセット全体にアクセスする必要がありますか? 古くなりすぎて面白くなくなったデータをアーカイブできますか? データを集計し、集計に対して分析を実行できますか?

広告分析 (広告露出に関する数十億のデータ ポイントを収集する) を扱った私の経験では、集計が重要です。生データを収集し、サニタイズしてから、MongoDB、Cassandra、さらには MySQL などのデータベースに配置して、更新やクエリを実行できます。次に、データを定期的に集計し、データベースから削除します (ただし、生データはアーカイブします。後で必要になる場合があります)。

集計では、基本的に、データについて尋ねたいすべての質問を行い、特定の質問に対する回答を簡単に取得できる形式でデータを保存します。X が最も多い曜日を知りたいとします。これの単純な実装は、記録されたすべての信号を巨大なテーブルに保持し、X を含むすべての行を合計するクエリを実行することです。信号が大きくなると、このクエリはますます時間がかかります。これには、いくらインデックス作成、シャーディング、または最適化を行っても役に立ちません。代わりに、毎日、毎時、毎分 (正確なユース ケースと、レポートをどの程度最新にする必要があるかによって異なります)、記録した新しいシグナルを確認し、X ごとに、その数を追跡するカウンターをインクリメントします。 X 月曜日なら月曜日、火曜日なら火曜日など。そうすれば、後で曜日ごとにカウントを取得して比較できます。回答できるようにしたいすべての質問に対してこれを行い、データベースから信号を削除します (ただし、生データは保持します)。

集計を記録するデータベースの種類は、着信信号を保存するものと同じにすることができますが、それほど凝ったものである必要はありません。特定の回答を表すキーと、通常は単なる数値である値を格納します。

古い学校のデータ ウェアハウスでは、入力信号を格納するデータベースは OLTP (オンライン トランザクション処理用) と呼ばれ、集計を格納するデータベースは OLAP (オンライン分析処理用) と呼ばれます。OLTP は挿入用に最適化されており、OLAP はクエリ用に最適化されています。この用語は古く、人々がそれらを聞くとすぐに SQL やスタースキーマなどを思い浮かべる傾向があります。使うべきではないかもしれませんが、便利な用語です。

とにかく、OLTP には、データをすばやく挿入できるだけでなく、データのインデックス作成と検索をサポートするものが必要です。集計は、合計と最大値と最小値の検索の半分の作業をデータベースが行うことで大幅に支援されます。MongoDB はとても簡単にセットアップして操作できるので、とても気に入っています。私が扱っているデータは乱雑になりがちで、すべてのアイテムが同じプロパティ セットを持っているわけではないため、Mongo の寛容なスキーマレスは恩恵です。一方、あなたのデータははるかに均一に聞こえるので、Mongo はおそらくそれほど多くの利益をもたらさないでしょう. ただし、古き良きリレーショナル データベースを見逃さないでください。多くの合計などを行う場合は、SQL が最適です。そのために構築されています。

OLAP の場合は、はるかに簡単に機能します。必要なのはキー値ストアだけです。私は Redis を使用しています。Redis も操作とセットアップが非常に簡単だからです。また、スカラー値以外も格納できるので便利です。値が実際にはリストまたはハッシュである場合があり、ほとんどのキー値ストアではそのような値をエンコードする必要がありますが、Redis はそれをネイティブに処理します。Redis の欠点は、クエリを実行できないことです (「Y に対してこの値を持つすべての行を教えてください」など)。データのインデックスを自分で保持する必要があります。一方、すべての質問に対する回答は事前に計算されているため、インデックスはあまり必要ありません。質問によって定義されたキーで回答を検索するだけで済みます。上記の質問では、どの曜日に X が最も多いかを調べます。月曜日、火曜日などの X 勤務の数を調べます。おそらくあなたは'

結論として、MongoDB と Redis は私にとって非常にうまく機能します。MongoDB はあなたのユースケースにはあまり適していないと思いますが、代わりに、実際には従来の SQL データベースからより多くの恩恵を受ける可能性があると思います (ただし、データが本当に単純な場合は、Redis をずっと使用できる可能性があります)。最も重要なことは、データを 1 つのデータベースに保持し、それを永久に保持する必要があると誤解しないことです。古いデータの集約と廃棄が重要です。

于 2011-01-20T07:58:49.267 に答える
13

CouchDBは非常に信頼性が高く、優れた耐久性を提供し、CPU負荷が非常に低くなります。また、オンデマンドまたは継続的に、複数のノード間で複製するのにも優れています。

レプリケーション機能とRESTfulAPI(APIにHTTPを使用)のおかげで、成熟したツールを使用して水平方向に非常に簡単にスケーリングできます。(リバースプロキシ、HTTPロードバランサーなどの場合はNginxまたはApache)

クエリを事前計算するために、JavaScriptでmap/reduce関数を記述します。結果はディスク上に段階的に蓄積されます。つまり、信号ごとに1回だけ計算する必要があります。つまり、クエリを最後に実行してから記録された信号データに対して計算を実行するだけでよいため、クエリは非常に高速になります。

CouchDBはディスクスペースをパフォーマンスと交換するため、多くのディスクスペースを使用することが予想されます。クエリを適切に実装すると、クエリが非常に高速になり、ディスク容量を節約できます。

CouchDBを試してみてください。

大型ハドロン衝突型加速器の科学者がBBCでCouchDBCouchDBをフォールトトレラントでスケーラブルなマルチデータセンターのKey-Valueストアとして使用している理由を確認してください

于 2010-08-29T07:48:20.037 に答える
9

~3000 信号/分 = 50 書き込み/秒。これらのシステムのいずれかで簡単に処理できます。

ただし、Cassandra は、データ セットがメモリよりも大きくなるとおそらく最適に機能し、Hadoop 統合はデータ マイニングに役立ちます。

于 2010-08-15T04:33:05.450 に答える
4

データマイニングのために中央データベースにデータを保存していますか? オンライン取引処理はありませんか?

耐久性に関しては、MongoDB が良い仕事をしているとは思いません。http://nosql.mypopescu.com/post/392868405/mongodb-durability-a-tradeoff-to-be-aware-ofを参照してください。

おそらく、分析データベース Infobright を使用できます。コミュニティ版があります: http://www.infobright.org/ ?

于 2010-08-13T21:58:05.220 に答える
4

「非常に高速な」書き込み (ディスクに永続化されたデータ) を許可できるデータストアを探しており、データ マイニングは後の段階で行われます (これは READ サイクルです)。また、あなたが述べた数字を考慮すると、1 日あたり 159 MB、または 1 か月あたり約 5 GB の情報をすべて収集することがわかります。

この場合、Redis を見てみましょう。

毎日の Redis データ ファイルをいつでもアーカイブし、後で参照することができます (5 GB 以上の RAM スペースをロードする懸念がある場合は、このアーカイブが回避策になる可能性があります)。

そのサイトで公開されている数値に基づくと、Redis はかなり高速です。お役に立てれば。キラン

于 2010-08-16T09:53:32.100 に答える
2

IncanterのMongoDB を使用して気に入っています。このような大規模なデータセットの速度については語れませんが、Clojure (Incanter のベースとなっている) は、トランザクション管理に関して非常に信頼性があります。Incanter はいくつかの優れた分析ツールも提供するため、そのすべてのデータを分析することを計画している場合、MongoDB + Incanter は強力な組み合わせになる可能性があります。

于 2010-08-13T16:43:10.877 に答える
2

Cassandra の最初から設計された水平方向のスケーリング機能、可用性に対する一貫性の調整などの機能が気に入っている場合は、機能セットは似ていますがアプローチが異なるRiakも検討することをお勧めします。 .

于 2010-08-14T05:10:43.123 に答える