Perché il filesystem è preferito per i log anziché per RDBMS?


44

La domanda dovrebbe essere chiara dal suo titolo. Ad esempio Apache salva i suoi accessi e registra i log degli errori nei file anziché in RDBMS, indipendentemente da quanto grande o piccola scala venga utilizzata.

Per RDMS non ci resta che scrivere query SQL e farà il lavoro mentre per i file dobbiamo decidere un particolare formato e quindi scrivere regex o potrebbero essere parser per manipolarli. E quelli potrebbero anche fallire in circostanze particolari se non si prestasse grande cura.

Eppure tutti sembrano preferire il filesystem per mantenere i log. Non sono di parte nei confronti di nessuno di questi metodi, ma vorrei sapere perché è praticato in questo modo. È velocità o manutenibilità o qualcos'altro?


10
Quindi come registrereste errori DB (ad esempio db non disponibile) se il vostro sistema di registrazione registra su un DB?
Marjan Venema,

17
@Marjan Come registrerei gli errori del filesystem se falliscono ?!
Yasir,

5
Abbastanza vero, ma se fallisce, è probabile che anche il tuo DB sia inaccessibile ... Dopotutto, dove / come scriverebbe sulle sue tabelle senza il file system?
Marjan Venema,

2
@Yasir: invia tutti i messaggi di log a un server syslog prima di accedere al filesystem :)
Brian

1
@MarjanVenema the what if se il gioco è inutile. Che cosa succede se il disco locale è pieno, la registrazione non riuscirà ma l'app e il sistema operativo possono continuare. Se stai accedendo a un server DB remoto, sarai comunque in grado di accedere. Esistono vantaggi e svantaggi per archiviare i messaggi di registro e la cosa migliore dipende da cosa si sta tentando di uscire dalla registrazione. Mi dispiace, lascerò che la mandria torni al registro dei file è l'unico vero modo.
Andy,

Risposte:


37
  1. Troppe cose possono fallire con il database e anche la registrazione di questi errori è importante.

  2. A meno che non si disponga di un sistema di database che consenta transazioni autonome (o nessuna transazione), la registrazione richiederebbe una connessione separata in modo che un rollback o un commit nella registrazione non interferiscano con il rollback o il commit nell'applicazione.

  3. Molte cose degne di nota accadono durante l'avvio, cioè probabilmente prima che sia stata stabilita la connessione al database.

  4. In quella che potrebbe essere un'impostazione tipica, ogni giorno viene creato un nuovo file di registro, i vecchi file di registro vengono compressi e conservati per 2 settimane, prima di essere infine eliminati. Non è facile fare lo stesso in un RDBMS.


1
Ho provato questo esperimento e non è andato bene. RDBMS è progettato attorno all'idea che i dati vengono scritti relativamente di rado rispetto al numero di volte che vengono letti. La registrazione è sostanzialmente l'opposto. Scrivi sempre e leggi raramente. Questo è un ottimo modo per infastidire il tuo DBA.
JimmyJames,

1
Si potrebbe prendere in considerazione l'utilizzo di un sistema di database di serie temporali come InfluxDB per conservare i registri, tuttavia; mi sembra che sia un po 'più adatto all'attività rispetto ad esempio a PostgreSQL. Tuttavia, il vantaggio rispetto ai file di log vecchio stile è quasi impossibile.
user281377,

L'uso di un DB non relazionale con l'indicizzazione di token, ecc. È sicuramente utile e se lo scegli con saggezza, possono gestire la manichetta antincendio. Questo è parte del modo in cui funzionano come Splunk e Flume.
JimmyJames,

# 4 non è davvero un problema. DELETE FROM dbo.Log WHERE LogDate < today minus 2 weeks
Robert Harvey,

@RobertHarvey Funziona bene fino a quando non lo si prova in un ambiente di carico pesante, dove tali operazioni in blocco possono causare seri problemi senza ulteriori precauzioni. Ripristina i log riempiendo lo spazio su disco, annulla il tablespace diventando troppo pieno, la replica diventa molto occupata con la replica
dell'eliminazione,

16

Ho già visto registri scritti nel DB in precedenza (e talvolta si ottengono opzioni configurabili per la registrazione, dove traccia va al file, errori al DB, fatali al registro degli eventi di Windows).

Le ragioni principali sono la velocità e le dimensioni, abilitare alcune tracce può produrre enormi e vaste qualità di registrazione: ho esplorato file di registro di dimensioni gigabyte. L'altro motivo principale è che la lettura dei registri deve essere sequenziale, non è realmente necessario interrogare il registro, tranne per trovare un determinato errore o voce - e find-in-file funziona perfettamente per quello.


Ma ho una confusione per questo. Il mio blocco note, wordpad, gedit o notepad ++ o qualsiasi browser Web non saranno felici di aprire un file di 4 GB. Lo stesso browser, tuttavia, sarà in grado di mostrarmi un elenco di migliaia di pagine, ciascuna contenente 500 record stampati. Destra?
Yasir,

7
@Yasir perché stai utilizzando editor che provano a caricare l'intero file in memoria. Prova a utilizzare un editor più intelligente in grado di "trasmettere" il file di grandi dimensioni. Vim è un buon esempio.
nakhli,

6
@Yasir: questo è vero, ma stai cercando di ottimizzare la cosa sbagliata. Nella maggior parte dei casi, i registri vengono scritti e mai letti. In questo modo la creazione dei registri è molto rapida perché è il caso comune.
Unholysampler,

5
Eh, ho già effettuato la registrazione nel database e poter interrogare facilmente i messaggi di registro è stato immensamente utile, soprattutto quando si attiva la registrazione a livello di debug per rintracciare un bug difficile da replicare.
Andy,

2
@gbjbaanb Non l'ho trovato sopravvalutato, e francamente stai suggerendo di usare le linee di marcatura e taglia e incolla per interrogare è uno scherzo. Non è solo ricerca, abbiamo analizzato le tendenze per trovare server che presentavano più problemi di altri, che tipo di errori gli utenti vedevano più spesso, ecc.
Andy,

15

La velocità è una ragione; altri sono:

  • Eliminare i punti di errore. Un filesystem raramente fallisce in condizioni in cui un DBMS non lo farebbe, ma ci sono molte e molte condizioni di errore nei database che non esistono nei filesystem.
  • Accessibilità a bassa tecnologia. Se le cose vanno davvero male, è possibile avviare una shell di ripristino o montare il disco su un sistema diverso e avere ancora strumenti adeguati disponibili per ispezionare i file di registro. Se si tratta di un database, non ci si trova da nessuna parte senza un server database in esecuzione.

3

Prima di tutto

E quelli potrebbero anche fallire in circostanze particolari se non si prestasse grande cura.

Le transazioni del database non possono fallire quando non stai attento?

Scrivere in un file di testo ha una serie di vantaggi, l'essere più importante

  • Il testo è leggibile dall'uomo. Chiunque può aprire un file di registro con un editor di testo di base e vedere quali sono i messaggi. Non è necessario capire come è organizzato il database.
  • Velocità. Scrivere testo su disco è molto più veloce di un servizio di database per capire dove va il testo in un database, scriverlo lì e garantire che la transazione sia completata.

Ovviamente qualsiasi cosa può fallire se non stiamo attenti. Ma per questa domanda mi riferivo a un programmatore di alto livello. Come semplice esempio, il programmatore potrebbe voler separare i valori usando un carattere particolare. Quindi la sua regex funzionerà come un incantesimo ma fallirà quando lo stesso personaggio è contenuto in un blocco di valori. In questo modo ha bisogno di occuparsi di casi simili simili e non ha bisogno di pensarci se stava salvando in DB. Inoltre, puoi vedere il mio commento sulla risposta di gbjbaanb?
Yasir,

1
E se stai scrivendo a mano il tuo SQL, hai lo stesso problema. La differenza è che la scrittura fallirà (o corromperà i tuoi dati) invece di infastidire leggermente alcuni sviluppatori perché la sua stringa di ricerca ha portato alcuni risultati negativi. Sì, ci sono framework che significano che non devi scrivere SQL, ma ogni livello aggiuntivo rallenta il processo. E ricorda che questa è solo registrazione. Ogni ciclo che usi per registrare è un ciclo che non stai usando per fare un vero lavoro.
unholysampler,

@unholysampler L'argomento relativo alle prestazioni è debole, la registrazione può essere eseguita molto rapidamente e su un thread in background in un database, e la registrazione in f mentre potenzialmente più veloce non è ancora libera, soprattutto se non viene eseguita in background.
Andy,

2

Sollevi Apache in modo specifico, quindi ne discuterò in dettaglio.

Apache può essere configurato per accedere a un database, anche se per farlo è necessario un plugin esterno . L'utilizzo di tale plug-in può semplificare l'analisi dei log, ma solo se si intende scrivere il proprio software di analisi dei log. Gli analizzatori di log standard disponibili presuppongono che i log siano in file, quindi non sarà possibile utilizzarli.

Quando lo facevo, ho riscontrato anche problemi di affidabilità: se il buffer di scrittura del server di database si riempiva (cosa che può accadere con mysql se si utilizza la quota del file system per l'utente con cui viene eseguito) inizia a mettere in coda le query fino a quando non sono in grado per continuare, a quel punto Apache inizia ad aspettare che finisca, dando luogo a richieste bloccate sul tuo sito web.

(Questo problema ora può essere risolto, ovviamente - è stato molti anni fa che l'ho fatto)


1

Un filesystem è un database. È davvero un database gerarchico più semplice invece di un DBMS relazionale, ma è comunque un database.

Il motivo per cui la registrazione su un filesystem è popolare è perché i log di testo si adattano bene alla filosofia Unix: "Il testo è l'interfaccia universale".

Unix aveva sviluppato molti strumenti generici che possono funzionare bene con i log di testo. Non importa se i log di testo sono prodotti da mysql, apache, la tua applicazione personalizzata, software di terze parti che non è più supportato, l'amministratore di sistema può utilizzare strumenti Unix standard come grep, sed, awk, sort, uniq, cut, tail , ecc., per navigare tra i registri lo stesso.

Se ogni app accede al proprio database, uno su MySQL, un altro su Postgres, un altro su Elasticsearch, un altro vuole accedere a ELK, un altro può accedere solo a MongoDB, quindi dovresti imparare venti diversi strumenti per esplorare i registri di ciascuno applicazione. Il testo è un supporto universale a cui tutti possono accedere.

Anche quando riesci a farlo in modo che tutti i registri vadano su un singolo database, ad esempio MySQL, potresti scoprire che ogni applicazione vorrebbe accedere con schemi di tabella diversi, quindi dovresti comunque scrivere uno strumento personalizzato per interrogare i registri per ogni applicazione. E se in qualche modo hai riempito tutte le applicazioni per accedere a un singolo schema, probabilmente scoprirai che quello schema generico non potrebbe davvero raccontarti la storia completa di ogni applicazione, quindi devi comunque analizzare i testi del registro.

La registrazione in un database spesso non semplifica notevolmente le cose nella pratica.

La registrazione in un database può essere utile quando si ha in mente un'analisi specifica o per requisiti di conservazione del controllo specifici, per i quali è possibile progettare uno schema di database specifico per raccogliere solo i dati per quegli scopi specifici. Ma per scopi forensi e di debug e quando si raccolgono registri senza obiettivi specifici in mente, i registri di testo sono in genere abbastanza buoni da non valerne la pena i costi di apprendimento o creazione di strumenti specializzati.


0

Diamo un'occhiata a questo su alcuni livelli:

  1. Strato macchina
  2. Livello del sistema operativo
  3. Livello di servizio
  4. Livello di applicazione

In breve:

  • A livello di macchina, non è possibile effettuare registrazioni diverse da una sorta di dump.
  • A livello di sistema operativo è possibile eseguire la registrazione ma in realtà è disponibile solo il file system.
  • I servizi possono accedere al file system, ma non possono fidarsi di altri servizi in esecuzione, quindi non possono accedere lì.
  • Le applicazioni possono accedere ai servizi e al file system.

Quindi abbiamo l'approccio basato sul caso d'uso:

Vuoi registrare gli errori specifici del nodo su un RDBMS in scala orizzontale dove devi fare il lavoro extra per trovare l'errore di un nodo specifico quando puoi semplicemente aprire il cofano per un nodo e vederlo lì? D'altra parte, l'applicazione potrebbe probabilmente accedere a un RDBMS per raccogliere errori e notifiche a livello di applicazione.

Cosa succede quando RDBMS deve eseguire la registrazione autonomamente perché non è possibile scrivere il database?


-2

Complessità. L'aggiunta di RDBMS aumenterà astronomicamente la complessità dell'intero sistema. E la capacità di gestire la complessità è la cosa principale che distingue i programmatori dai produttori di codice sorgente.


1
Potresti espandere ciò che intendi per complessità in relazione alla registrazione su un DB rispetto a un file system? Dalla mia esperienza, non c'è stata una differenza significativa nella complessità in un ambiente aziendale.
Adam Zuckerman,

Veramente? SqlLite aumenta la complessità astronomicamente? E mentre un web server normalmente non avrebbe bisogno di un DB, molte app LOB ne stanno già utilizzando uno, quindi non ci sono costi aggiuntivi.
Andy,

@AdamZuckerman, ovviamente, qualsiasi RDBMS richiede manutenzione, soggetto a corruzione, potrebbe richiedere una messa a punto speciale, potrebbe essere influenzato da una configurazione errata, potrebbe aver bisogno di un recupero speciale, porta limiti propri, ha dipendenze proprie, piattaforme supportate, problemi di aggiornamento, bug, licenze e così via .
noonex,

@Andy prima di tutto, SQLite non è RDBMS nel classico seance - è "RDBMS incorporato". E sì: richiedere SQLite per la registrazione aumenterà molto la complessità.
noonex,

1
@noonex Stai solo facendo una distinzione arbitraria tra server incorporato e server completo, quando RDBMS no. SqlLite fornisce la conformità ACID, che è in realtà l'RDBMS. E aumenta molto la complessità? Posso solo immaginare che non hai lavorato su nulla, tranne sulla più banale delle applicazioni. Alla fine, un buon lavoro ignorando completamente il mio punto su molte applicazioni LOB aveva già bisogno di un database comunque.
Andy,

-4

È velocità o manutenibilità o qualcos'altro?

Velocità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.