2017-07-05 10 views
0

私は半径サーバ用のフロントエンドシステムで作業しています。は、膨大な量のデータをmongoに保存しています

半径サーバは、180秒ごとにシステムに更新を渡します。つまり、もし私が1日に約7,200,000件のエントリーになる約15,000のクライアントを持っていれば...どれが多いですか。

私は、このデータを保存して取得する最良の方法がどのようなものか理解しようとしています。明らかに時間が経つにつれて、これは実質的になります。 MongoDBはこれを処理しますか?典型的な文書はそれほど多岐にわたっていませんが、これは何ものでもありません。

{ 
id: 1 
radiusId: uniqueId 
start: 2017-01-01 14:23:23 
upload: 102323 
download: 1231556 
} 

しかし、これらのレコードはたくさんあります。私は、これはSNMP NMSサーバーがデータを処理する方法と似ていると思いますが、これを行うためにRRDを使用していることが分かっています。

現在、私のテストでは、すべてのドキュメントを1つのコレクションにプッシュしています。だから私は)、

Aを求めていますモンゴは)仕事と Bのための適切なツールですデータ

EDIT保存するためのより良い/より好ましい/より最適な方法があります:

OKは、だから、誰かがこれを見て、何か助けを必要とするのを入れなさい。

私はしばらくモンゴーで走っていましたが、私は本当にパフォーマンスに満足していませんでした。これは私が実行していたハードウェア、おそらく私の知識レベル、または私が使っていたフレームワークにまで分けることができます。しかし私は非常にうまくいく解決策を見つけました。 InfluxDBは、これを箱からすぐに処理することができます。その時系列データベースは、実際に格納しようとしているデータです(https://github.com/influxdata/influxdb)。私のパフォーマンスは夜のようになった&日。もう一度、これを更新するだけですべて私のせいかもしれません。

EDIT 2:

だから、しばらく私はモンゴと後のことでしたパフォーマンスをやったことがなかった私はなぜ考え出したと思います。私はフレームワークとしてsailsjsを使用していますが、明らかに巨大なパフォーマンスヒットを持つregexを使ってidで検索しています。私は最終的に流入の代わりにモンゴに戻って移動し、それが良いかどうかを見極める。

+0

保存したいデータの量を分けてください。また、それを共有してください、あなたは特定の時間の後にもそのデータを必要としない場合は、機能を自動削除する必要がありますか? –

答えて

0

15,000クライアントが180秒ごとに更新する=〜83個の挿入/秒。これは、適度なサイズのDBサーバーであっても、特に挿入するレコードのサイズが非常に小さいため、大きな負荷ではありません。

私はMongoDBがその負荷でうまくいくと思います(正直言って、現代のほとんどのSQL DBもおそらくそれを維持できるでしょう)。 IMHOの重要なポイントは次のとおりです。

  • ハードウェア:十分なRAMがあることを確認してください。これは、主に定義する索引の数と実行している問合せの数に依存します。これが主に読まれることの少ないログの場合は、ワーキングセットには大量のRAMは必要ありません(ただし、索引には十分な必要があります)。しかし、クエリーも実行している場合は、さらに多くのリソースが必要になります
  • には、という広範なクエリが実行されている場合は、レプリカセットの設定を検討してください。こうすることで、マスターサーバーをデータの書き込み用に予約して信頼性を確保し、書き込みの信頼性に影響を与えずにクエリを処理できるスレーブを構成できます。
  • データ構造に関しては問題ないと思いますが、実際にどのような種類のクエリを実行したいかによって大きく変わります。たとえば、ほとんどのクエリでradiusIdを使用して別のテーブルを参照し、各レコードのデータを集めた場合、そのデータの一部を非正規化することを検討することができます。しかし、これも実際に実行するクエリに依存します。
  • 書き込み負荷を確実に管理することに本当に関心がある場合は、Mongoフロントエンドのみを使用して書き込みを管理し、データウェアハウスバックエンドにデータをダンプしてクエリを実行することを検討してください。上記のようにレプリカセットを実行することでこれを部​​分的に行うことができますが、レプリカセットの欠点はデータを再構成できないことです。レプリカセットの各メンバーのデータはまったく同じです(したがって、レプリカセットの名前:-) のデータ(正規化された小さなレコード)を書き込むための最善の構造は、のデータを読み取るのに最も適した構造ではありません。 (非正規化された大量のレコードで、必要なすべての情報と結合が完了している必要があります)。たくさんの複雑なクエリを実行していて、他のテーブルを参照している場合は、クエリ部分に真のデータウェアハウスを使用する方が良いかもしれません。
  • 書き込み負荷が増加するにつれて、シャーディングが考えられます。私はRadiusIdがRadiusサーバーのプールの中のそれぞれの特定のサーバーを指していると仮定しています。あなたはその鍵を破棄して、どのサーバがデータを送信しているかに基づいて書き込みを分けることができます。したがって、半径サーバを増やすと、書き込み信頼性を維持するために、mongoサーバを比例して増やすことができます。しかし、あなたが指定した負荷を適切にプロビジョニングされたサーバーで管理できるようになると、すぐにこれを行う必要はありません。

とにかく、私の予備的な提案です。

関連する問題