2013-06-12 11 views
5

私はリアルタイムの監視プログラムを持っていますが、クラスアーキテクチャは複雑すぎます。そして、これは本当に私を邪魔しています。プログラムを説明することから始めましょう。監視ログデータのクラスアーキテクチャ

ユーザとの対話

これは、ユーザーとの対話を持つ監視プログラムです。つまり、ユーザーはさまざまなディメンション、さまざまな指標を選択したり、それらを含めたり、除外したり、グループ化したり、ユーザーの意思決定に応じてリアルタイムチャートの変更を毎回行うことができます。それはすべての列だとDB

Req Success OrderFunction 5 60ms WebServer2 
Req Failed OrderFunction 2 176ms WebServer5 
Resp Success SuggestFunction 8 45ms WebServer2 

変換

から

例のログデータには、すべての行が重要です。そして、このようにクライアント側になければなりません。ユーザーはWebServer2またはすべての失敗したリクエストなどで成功したOrderFunctionsまたはすべての関数を表示することを選択できるので、これらの列の間のすべての関係が必要です。

もう1つは、データベースからの値です。私はまた、ユーザーが見る必要があるテキストを保持するこれらの値のルックアップを持っています。 Req is Requestのように、RespはResponseです。

私はこの質問を一般的なものとして見ることができます。しかし、私は方法を見つけようとしています。この種のクラス・アーキテクチャーは業界でも名を上げているかもしれません。私はちょうど正しい方法で私を導くいくつかのアドバイスのためにここにいる。

どうもありがとう

+0

データベース内の通常のタプルのように見えます。 – darijan

+0

はい、それはクラスのように、痛みです。 3分間隔で15kのレコードがあります。 – Xelom

+1

次に、それをリレーショナルデータベースに保持し、一連のサービスを通じて必要な情報をマイニングすることについて考えてみましょう。または、現在の構造と実際のオブジェクトですべてを行うことができますが、オブジェクトデータベース(たとえばVersantを参照)にオブジェクトの永続性(通常は作成と変更時に自動的に)を有効にすることができます。 – darijan

答えて

1

15Kは3分毎に記録し、私は(SNMP環境のようなものに非常にうるさい取得することができます)、データセンターにおけるネットワーク監視アプリケーションを確認するために使用したもののようにたくさんの音。私たちが何をするかは、必要なデータの量、どのくらいの期間、どの程度の粒度で、どの種類のロールアップ戦略を使用するか、またどれくらいのストレージスペースが必要かを判断することになります問題を投げる時間軸の行を結合して列をマージするロールアップ戦略を使用すると、データベースのサイズに一定の制限があることを確認できます。

最近、おそらく新しいツールがありますが、私はこの種の監視の問題にRRD(http://oss.oetiker.ch/rrdtool/)とBerkeleyDBを使用していました。また、ソフトウェアの重複排除機能を利用することもできます。これは、行の内容が元の行と似ている場合にカウントを更新するだけのアプローチです。私たちは、イベントの嵐がNOC画面を氾濫させたり、技術者が重大なイベントを見逃したりするのを防ぐためにこれを使用しました。ところで、私はコメントとしてこれを残していたが、stackoverflowは私を妨げるこの評判の事を行い、私は昨日ここで質問に答えるようになったばかりです。

だから、例として、あなたのデータを使用して、より完全なものにする:

Req Success OrderFunction 5 60ms WebServer2 
Req Failed OrderFunction 2 176ms WebServer5 
Resp Success SuggestFunction 8 45ms WebServer2 

私は必須/ Respのを前提とは、2つのだけの値です - 要求と応答に対応しますか?このような場合は、要求の有無に関わらず、その列のバイナリを1ビットにします。 2番目の列「Success/Failed」は、1ビット、最悪の3進数、2ビットフィールドのように聞こえます。関数(OrderFunction、SuggestFunctionなど)はおそらく列挙できます。ここで重複排除を実行する場合は、ビットマスクにすることもできます。また、このために外部キーをジョイン・テーブルに使用することもできます。列挙されたオプションでは、これらのうちの256より小さいが128より大きいバイトを使用するとします。行を節約するためにイベント重複排除ソリューションでそれらをロールアップする場合は、特にそういう高速で来るときは256のオプションがあります。そうでなければ、ビットマスクにはそのビット数が正確に必要ですすべてのパーミュテーションを表現する必要がない場合は、パーミュテーションの最大数を計算します。これは、重複排除が正しくロールアップされるためのビットマスク内のビット数です。次の列に5,2,8が入っていますが、それが何を表しているのか、何らかの種類の整数か、単なるバイトではないでしょうか? millisecondsは、SQLの方言と、表現する必要があると予想される最大ミリ秒数に応じて、intまたは多分unsigned short、または単に短くてもかまいません(基本的に約32.7秒です)。 shortまたはunsigned shortを使用する場合は、アプリケーションロジックで、maxを超える値がmaxで表され、ゼロではないことを確認してください。最後の列はサーバーを表す文字列のように見えるので、おそらく重複排除またはロールアップの手引きに役立つ列です。おそらくそれを外国の鍵にすることができます。

とにかく、RRDは以前は本当にうまくいっていましたが、私は約12年も使っていませんでした。私はそれを取り戻しました。私はRRDを12年以上使っていません。私はBerkeleyDBがこの種のもののためにはまだ良いデータベースだと確信しています - そのようなツールやツールをチェックしてください。良い解決策が出てくると確信しています。

希望に役立ちます!

+0

詳細な回答ありがとうございます。私は自分のデータベース構造については問題ありません。唯一の問題は、データがアプリケーションにあることです。そして、あなたは私の問題を本当にうまく説明しました。重複排除。私はすべてのデータを保持し、ユーザーにそれを変更させたいので、それをフィルタリングまたはグループ化します。私は重複したデータをたくさん保持しています。例えば、ユーザが失敗したトランザクションを見たくない場合。私はアプリケーションで失敗したすべての行をフィルターに掛ける必要があり、失敗したOrderFunction番号を減らさなければなりません。 – Xelom

+0

1つのアプローチは、アプリケーション・ロジックをより薄くすることです。つまり、パフォーマンスを向上させるために、アプリケーション・ロジックをより薄くすることです。つまり、データベースへのより多くのトリップを交換し、アプリケーション層またはクライアントでクランチされる行の数を制限します。複雑さを軽減する。あなたは、ストアドプロシージャを使用してクランチングを実行することができます。レプリケートされたデータベースまたはスレーブデータベースでクランチを行い、インサートのマスタを予約することさえできます。挿入時の重複排除は、エンドユーザーの照会をより迅速にしますが、照会時の重複排除は将来の要件に柔軟性をもたらします。 – hoonto

+0

したがって、アプリケーションやクライアントではフィルタリングが行われる場合がありますが、データは少なくなります。また、実際に多くの生データをフィルタリングする必要がある場合は、フィルタリングオプションを使用してストアドプロシージャとして実行します。 – hoonto