2013-06-12 17 views
5

Ho un programma di monitoraggio in tempo reale, ma l'architettura di classe è troppo complessa. E questo mi disturba davvero tanto. Lasciatemi iniziare spiegando il programma.Architettura di classe dei dati del registro di monitoraggio

User Interaction

Si tratta di un programma di monitoraggio con l'interazione dell'utente. Il che significa che l'utente può selezionare diverse dimensioni, metriche diverse, includerle, escluderle o raggrupparle e ogni volta che il grafico in tempo reale cambia in base alle decisioni dell'utente.

Esempio registrare dati da DB

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

La Conversione

Così ogni fila è importante è ogni colonna. E deve essere sul lato client come questo. Perché l'utente può scegliere di vedere i buoni ordini riusciti o tutte le funzioni su WebServer2 o Tutte le richieste non riuscite, ecc. Ho bisogno di tutte le relazioni tra queste colonne per fare ciò.

Un'altra cosa sono questi sono i valori che vengono dal Database. Ho anche la ricerca di questi valori che contiene il testo che gli utenti devono vedere. Come Req è richiesta, Resp è risposta.

So che puoi vedere questa domanda come generale. Ma sto cercando di trovare un modo. Potrebbe essere questo tipo di architettura di classe ha un nome nel settore. Sono qui solo per alcuni consigli per guidarmi nel modo giusto.

Grazie mille

+0

Mi sembra una normale tupla nel database. – darijan

+0

Sì, ma tenerlo così in classe è un dolore. Ci sono 15k record in un intervallo di 3 minuti. – Xelom

+1

Quindi pensa di tenerlo in un database relazionale e di estrarre le informazioni necessarie attraverso una serie di servizi. OPPURE, si potrebbe fare tutto ciò con la struttura corrente e gli oggetti reali, ma abilitando la persistenza di quegli oggetti (di solito automatici, su creazione e modifica) in un database di oggetti (si veda ad esempio Versant). – darijan

risposta

1

15k registra ogni 3 minuti, suona molto simile a quello che ho usato per vedere con applicazioni di monitoraggio di rete nei data center (SNMP può diventare molto rumoroso in quel tipo di ambiente). Quello che faremmo è determinare quanti dei dati abbiamo bisogno, per quanto tempo, a quale livello di granularità, e quali informazioni vanno a determinare quale tipo di strategia di roll-up usare - anche, quanto spazio di archiviazione eravamo disposti gettare il problema Con una strategia di roll-up in cui si combinano le righe temporali, unendo le colonne, è possibile assicurarsi che vi sia un limite limitato alle dimensioni del database.

Probabilmente ci sono nuovi strumenti in questi giorni ma ho utilizzato RRD (http://oss.oetiker.ch/rrdtool/) e BerkeleyDB per esempio per questo tipo di problemi di monitoraggio. È anche possibile trarre vantaggio da qualche deduplicazione software, un approccio in cui si aggiorna semplicemente un conteggio se una riga viene trovata simile a una riga precedente, in base alla natura del contenuto delle sue colonne. Lo facevamo per evitare che le tempeste degli eventi invadessero gli schermi NOC e facessero perdere ai tecnici eventi critici. A proposito, avrei lasciato questo come commento, ma StackOverflow fa questa cosa di reputazione che mi impedisce e ho iniziato a rispondere alle domande qui ieri.

Quindi, per essere più completo, utilizzando i dati come esempio:

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

presumo Req/Resp sono gli unici due valori - corrispondente alla richiesta e risposta? Se questo è il caso, rendi quella colonna binaria, 1 bit - che si tratti di una richiesta o meno. La seconda colonna, Successo/Non riuscito, ha un tono simile a 1 bit o al peggiore ternario, a 2 bit. Le funzioni (OrderFunction, SuggestFunction, ecc.) Possono probabilmente essere enumerate - o se stai facendo la deduplicazione qui potresti renderla una maschera di bit. Potresti anche usare una chiave esterna per questo in una tabella di join. Nell'opzione enumerata, diciamo che hai meno di 256 di questi, ma più di 128, usa un byte.Se si riescono a raggrupparli in una soluzione di deduplicazione di un evento per salvare le righe, specialmente quando arrivano velocemente così, e si hanno 256 opzioni, allora è necessario esattamente quel numero di bit per la propria maschera di bit, a meno che non sia il caso in cui non è richiesta la rappresentazione di tutte le permutazioni, nel qual caso, calcolare il numero massimo di permutazioni, e cioè il numero di bit nella maschera di bit per la deduplicazione da ottenere correttamente. La prossima colonna con 5,2 e 8 in esso, non sono sicuro di ciò che rappresenta, un numero intero di qualche tipo o forse solo un byte? I millisecondi possono essere rappresentati, a seconda del tuo dialetto SQL e dei massimi millisecondi che ti aspetti di dover rappresentare, con un int o forse un corto senza segno, o forse solo un corto (che sarebbe sostanzialmente di circa 32,7 secondi). Se si utilizza il cortocircuito breve o senza segno, accertarsi che un valore oltre il limite massimo sia rappresentato come massimo e non uguale a zero nella logica dell'applicazione. L'ultima colonna sembra una stringa che rappresenta i tuoi server, quindi è probabilmente una colonna che useresti per guidare la deduplicazione o il rollup. Quindi potresti renderlo una chiave straniera, forse.

In ogni caso, RRD era molto buono, ma non l'ho usato da più di una dozzina di anni. Lo riprendo, non uso RRD da più di una dozzina di anni :). Sono sicuro che BerkeleyDB sia ancora un buon database per questo tipo di cose - quindi dai un'occhiata a quegli strumenti e strumenti come loro e sono sicuro che ne uscirà una buona soluzione.

Spero che questo aiuti!

+0

Grazie per la tua risposta dettagliata. Non ho alcun problema con la mia struttura di database. L'unico problema sono i miei dati nell'applicazione. E hai spiegato il mio problema molto bene. De-duplicazione. Dal momento che voglio conservare tutti i dati e voglio che l'utente lo cambi, filtralo o raggruppalo. Ho un sacco di dati duplicati. Ad esempio, se l'utente non desidera vedere transazioni non riuscite. Devo filtrare ogni riga con esito negativo nella mia applicazione e deve ridurre i numeri di OrderFunction non riusciti. – Xelom

+0

Un approccio potrebbe essere quello di rendere la logica dell'applicazione più sottile, ovvero lo scambio di più viaggi nel database e la limitazione del numero di righe restituite da crimpare nel livello applicazione o nel client al fine di aumentare le prestazioni e diminuire la complessità.È possibile utilizzare stored procedure per eseguire il crunch, si potrebbe anche eseguire il crunch su un database replicato o slave e riservare il master per gli inserti. La deduplicazione su insert renderà più veloci le query degli utenti finali, mentre la deduplicazione al momento della query offre flessibilità per i requisiti futuri. – hoonto

+0

Quindi alcuni filtri potrebbero aver luogo nell'applicazione o nel client, ma su un set di dati ridotto. Inoltre, per i casi in cui è davvero necessario filtrare su molti dati non elaborati, farlo come stored procedure con le opzioni di filtro. – hoonto

Problemi correlati