7

私はプロジェクトに取り組んでおり、大量のデータをOracleデータベースにバッチロードして保存しています。このデータベースは、Hibernateを介してこの1億以上のレコードテーブルに対して絶えず照会されています(読み取りは書き込みよりもはるかに頻繁です)。処理を高速化するために、一部のクエリ(特にジオバウンディングボックスクエリ)とHibernateの第2レベルのキャッシュにLuceneを使用していますが、それでも十分ではありません。Oracleに対するHibernateクエリにはまだボトルネックがあります(メモリが不足しているため、Hibernateの第2レベルのキャッシュに1億以上のテーブルエンティティをキャッシュしません)。

この状況で活用できる追加のNoSQLソリューション(Luceneを除く)は何ですか?

私が考えているいくつかのオプションは次のとおりです。

  1. Hibernateの第2レベルに分散ehca​​che(Terracotta)を使用して、マシン間でより多くのメモリを活用し、重複するキャッシュを減らします(現在、各VMには独自のキャッシュがあります)。

  2. H2のようなメモリSQLデータベースで完全に使用するには、残念ながら、これらのソリューションでは100以上のmlnテーブルを単一のVMにロードする必要があります。

  3. クエリにはLuceneを使用し、IDによるエンティティルックアップにはBigTable(または分散ハッシュマップ)を使用します。これにはどのBigTable実装が適していますか?私はHBaseを検討していました。

  4. MongoDBを使用して、データを保存し、IDによるクエリとルックアップを行います。

4

6 に答える 6

7

スケーラブルなシステムのためにElasticSearchでCassandraを推奨します(1億は彼らにとって何の意味もありません)。すべてのデータにはcassandraを使用し、アドホッククエリと地理クエリにはESを使用します。次に、レガシースタック全体を強制終了できます。Cass間のデータ同期には、rabbitmqのようなMQシステムが必要になる場合があります。およびES。

于 2011-06-23T18:44:46.373 に答える
3

それは本当にデータセットに依存します。NoSQL 設計の第 1 のルールは、最初にクエリ シナリオを定義することです。データのクエリ方法を本当に理解したら、さまざまな NoSQL ソリューションを調べることができます。デフォルトの配布単位はキーです。したがって、ノード マシン間でデータを効果的に分割できるようにする必要があることを覚えておく必要があります。そうしないと、水平方向にスケーラブルなシステムになり、すべての作業が 1 つのノードで実行されたままになります (場合によってはクエリが改善されますが)。

また、CAP 定理を思い返す必要があります。ほとんどの NoSQL データベースは結果整合性 (CP または AP) ですが、従来のリレーショナル DBMS は CA です。これは、データの処理方法や特定のものの作成に影響を与えます。たとえば、鍵の生成はトリッキーになる可能性があります。

また、HBase などの一部のシステムにはインデックス作成の概念がないことも覚えておいてください。すべてのインデックスはアプリケーション ロジックによって構築する必要があり、更新と削除はそのように管理する必要があります。Mongo を使用すると、実際にフィールドにインデックスを作成し、比較的迅速にクエリを実行できます。また、Solr を Mongo と統合することもできます。基本的にネストされたキーと値のペアを持つ列ファミリー(別名Google BigTableスタイルのデータベース)であるHBaseのように、MongoでIDでクエリする必要はありません。

繰り返しますが、データ、何を保存したいか、どのように保存するか、そして最も重要なのはどのようにアクセスしたいかということです。Lily プロジェクトは非常に有望に見えます。私が関わっている仕事では、ウェブから大量のデータを取得し、それを保存、分析、削除、解析、分析、ストリーミング、更新などを行います。1 つのシステムだけを使用するのではなく、多くのシステムを使用します。目の前の仕事に最適です。このプロセスでは、さまざまな段階でさまざまなシステムを使用します。これにより、必要な場所にすばやくアクセスでき、リアルタイムでデータをストリーミングおよび分析する機能が提供され、重要なことに、進行中のすべてを追跡できます (製品でのデータ損失として)システムは大したことではありません)。Hadoop、HBase、Hive、MongoDB、Solr、MySQL、さらには古き良きテキスト ファイルを使用しています。これらの技術を使用してシステムを製品化することは、サーバーに Oracle をインストールするよりも少し難しいことに注意してください。いくつかのリリースはそれほど安定していないため、最初にテストを行う必要があります。結局のところ、それはビジネスの抵抗のレベルとシステムのミッション クリティカルな性質に大きく依存します。

これまで誰も言及していないもう 1 つのパスは、NewSQL です。つまり、水平方向にスケーラブルな RDBMS です。MySQL クラスター (と思います) や VoltDB など、あなたの目的に合ったものはいくつかあります。

繰り返しますが、データとアクセス パターンを理解することになります。NoSQL システムは Non-Rel、つまり非リレーショナルでもあり、非リレーショナル データ セットにより適したものです。データが本質的にリレーショナルであり、デカルト積 (結合) などを実際に実行する必要がある SQL クエリ機能が必要な場合は、Oracle に固執し、インデックス作成、シャーディング、およびパフォーマンス チューニングに時間を費やす方がよいでしょう。

私のアドバイスは、実際にいくつかの異なるシステムで遊んでみることです。見る;

MongoDB - ドキュメント - CP

CouchDB - ドキュメント - AP

Redis - メモリ内のキー値 (列ファミリーではない) - CP

Cassandra - カラム ファミリー - 利用可能でパーティション トレラント (AP)

HBase - 列ファミリー - コンシステント & パーティション トレラント (CP)

Hadoop/ハイブ

VoltDB - 非常に見栄えの良い製品であり、分散型であり、あなたのケースで機能する可能性のある関係データベースです (より簡単な移動かもしれません)。また、製品環境により適したエンタープライズ サポートも提供しているようです (つまり、ビジネス ユーザーに安心感を与えます)。

とにかくそれが私の2cです。システムをいじってみることが、自分のケースで何が実際に機能するかを知る唯一の方法です。

于 2011-07-04T17:07:40.000 に答える
1

ご提案のとおり、MongoDB(または同様のNoSQL永続化ソリューション)が適切です。MongoDBで提案しているデータセットよりも大幅に大きいデータセットを使用してテストを実行しましたが、正常に機能します。特に、大量のMongoDBのシャーディングを読んだり、レプリケートセットメンバー間で読み取りを分散したりすると、クエリを大幅に高速化できます。ユースケースでインデックスのバランスを適切に保つことができる場合は、20ミリ秒のクエリに近づけるという目標は、それ以上キャッシュしなくても実現可能になるはずです。

于 2011-06-24T11:39:18.133 に答える
1

Lily プロジェクト (lilyproject.org) もチェックしてください。HBase と Solr を統合しました。内部的には、メッセージ キューを使用して、Solr と HBase の同期を維持します。これにより、信頼性の高いデータ ストレージ システムに支えられた solr インデックス作成 (シャーディングとレプリケーション) の速度を実現できます。

于 2011-06-24T16:05:23.307 に答える
0

リクエストをグループ化し、データセットに固有に分割し、単一(またはサーバーのグループ)のプロセスを作成できます。ここでは、データをキャッシュで使用できるようにして、パフォーマンスを向上させることができます。

例えば、

たとえば、従業員と可用性のデータは10個のテーブルを使用して処理されます。これらは、リクエストをロードして処理するようにHibernateキャッシュを構成するときに、サーバーの小さなグループで処理できます。

これを機能させるには、ロードバランサー(ビジネスシナリオごとに負荷を分散する)が必要です。

ここでどれだけ実装できるかわかりません。

于 2011-06-23T18:08:31.527 に答える
0

100M レコードでは、ボトルネックは Oracle ではなく Hibernate である可能性があります。当社の顧客は、Oracle ベースのデータ ウェアハウスの個々のファクト テーブルに何十億ものレコードを定期的に保持しており、それらを適切に処理します。

テーブルに対してどのようなクエリを実行しますか?

于 2011-06-23T20:26:42.970 に答える