Die Frage sollte aus dem Titel hervorgehen. Beispielsweise speichert Apache seine Zugriffs- und Fehlerprotokolle in Dateien anstelle von RDBMS, unabhängig davon, wie groß oder klein sie verwendet werden.
Für RDMS müssen wir nur SQL-Abfragen schreiben, und dies erledigt die Arbeit, während wir für Dateien ein bestimmtes Format festlegen und dann Regex schreiben müssen oder Parser sein müssen, um sie zu manipulieren. Und diese könnten unter bestimmten Umständen sogar scheitern, wenn nicht viel Sorgfalt aufgewendet würde.
Dennoch scheint jeder das Dateisystem für die Verwaltung der Protokolle zu bevorzugen. Ich bin gegen keine dieser Methoden voreingenommen, möchte aber wissen, warum dies so praktiziert wird. Ist es Geschwindigkeit oder Wartbarkeit oder etwas anderes?
Antworten:
Zu viele Dinge können mit der Datenbank fehlschlagen, und es ist auch wichtig, diese Fehler zu protokollieren.
Sofern Sie kein Datenbanksystem haben, das autonome Transaktionen (oder überhaupt keine Transaktionen) zulässt, erfordert die Protokollierung eine separate Verbindung, sodass ein Rollback oder ein Commit bei der Protokollierung das Rollback oder das Commit in der Anwendung nicht beeinträchtigt.
Viele Dinge, die es wert sind, protokolliert zu werden, passieren beim Start, dh möglicherweise bevor die Datenbankverbindung hergestellt wurde.
In einer typischen Konfiguration wird jeden Tag eine neue Protokolldatei erstellt, alte Protokolldateien werden komprimiert und 2 Wochen lang aufbewahrt, bevor sie schließlich gelöscht werden. In einem RDBMS ist es nicht einfach, dasselbe zu tun.
quelle
DELETE FROM dbo.Log WHERE LogDate < today minus 2 weeks
Ich habe bereits zuvor in die Datenbank geschriebene Protokolle gesehen (und manchmal erhalten Sie konfigurierbare Optionen für die Protokollierung, bei der die Ablaufverfolgung in eine Datei verschoben wird, Fehler in die Datenbank, Fatale in das Windows-Ereignisprotokoll).
Die Hauptgründe dafür sind Geschwindigkeit und Größe. Wenn Sie diese Option aktivieren, kann die Ablaufverfolgung zu einer enormen Anzahl von Protokolldateien führen. Ich habe die Größe von Protokolldateien in Gigabyte durchgesehen. Der andere Hauptgrund ist, dass das Lesen der Protokolle sequentiell sein muss, es besteht keine wirkliche Notwendigkeit, das Protokoll abzufragen, außer um einen bestimmten Fehler oder Eintrag zu finden - und die Suche in der Datei funktioniert perfekt.
quelle
Geschwindigkeit ist ein Grund; andere sind:
quelle
Zuerst.
Datenbanktransaktionen können nicht fehlschlagen, wenn Sie nicht vorsichtig sind?
Das Schreiben in eine Textdatei hat eine Reihe von Vorteilen, von denen der wichtigste ist
quelle
Sie erheben Apache spezifisch, also werde ich dies im Detail besprechen.
Apache kann so konfiguriert werden, dass es sich bei einer Datenbank anmeldet, obwohl dazu ein externes Plugin erforderlich ist . Die Verwendung eines solchen Plugins kann die Protokollanalyse vereinfachen, jedoch nur, wenn Sie beabsichtigen, eine eigene Protokollanalysesoftware zu schreiben. Standardmäßige Protokollanalysatoren gehen davon aus, dass sich Ihre Protokolle in Dateien befinden, sodass Sie diese nicht verwenden können.
Dabei traten auch Zuverlässigkeitsprobleme auf: Wenn der Schreibpuffer des Datenbankservers voll ist (was bei mysql passieren kann, wenn Sie Ihr Dateisystemkontingent für den Benutzer verwenden, unter dem es ausgeführt wird), werden Abfragen in die Warteschlange gestellt, bis sie in der Lage sind Ab diesem Zeitpunkt wartet Apache darauf, dass der Vorgang abgeschlossen wird, was dazu führt, dass Anfragen an Ihre Website hängen bleiben.
(Dieses Problem kann jetzt natürlich behoben werden - das habe ich vor vielen Jahren getan.)
quelle
Ein Dateisystem ist eine Datenbank. Es ist zwar eine einfachere, hierarchische Datenbank anstelle eines relationalen DBMS, aber es ist dennoch eine Datenbank.
Der Grund, warum die Protokollierung in einem Dateisystem beliebt ist, liegt darin, dass Textprotokolle gut zur Unix-Philosophie passen: "Text ist die universelle Schnittstelle."
Unix hatte mit vielen Allzweckwerkzeugen entwickelt, die gut mit Textprotokollen zusammenarbeiten können. Es spielt keine Rolle, ob die Textprotokolle von MySQL, Apache, Ihrer benutzerdefinierten Anwendung oder Software von Drittanbietern erstellt werden. Der Sysadmin kann Standard-Unix-Tools wie grep, sed, awk, sort, uniq, cut, tail verwenden usw, um trotzdem die Protokolle zu durchsuchen.
Wenn sich jede App in einer eigenen Datenbank anmeldet, eine in MySQL, eine andere in Postgres, eine andere in Elasticsearch, eine andere in ELK, eine andere kann sich nur in MongoDB anmelden, dann müssten Sie zwanzig verschiedene Tools erlernen, um die Protokolle von jeder zu durchsuchen Anwendung. Text ist ein universelles Medium, auf das sich jeder einloggen kann.
Selbst wenn Sie es schaffen, dass alle Protokolle in einer einzigen Datenbank abgelegt werden, beispielsweise in MySQL, möchten Sie möglicherweise von jeder Anwendung unterschiedliche Tabellenschemata verwenden. Daher müssen Sie immer noch ein benutzerdefiniertes Tool schreiben, um die Protokolle für jede Datenbank abzufragen Anwendung. Und wenn Sie alle Anwendungen irgendwie überlastet haben, um sich in einem einzelnen Schema anzumelden, werden Sie wahrscheinlich feststellen, dass dieses generische Schema Ihnen nicht wirklich die gesamte Geschichte jeder Anwendung erzählen kann, sodass Sie die Protokolltexte trotzdem analysieren müssen.
Die Protokollierung in einer Datenbank macht die Arbeit in der Praxis oft nicht wirklich einfacher.
Die Protokollierung in einer Datenbank kann hilfreich sein, wenn Sie eine bestimmte Analyse im Auge haben oder eine bestimmte Anforderung an die Aufbewahrung von Audits haben, für die Sie ein bestimmtes Datenbankschema entwerfen können, um nur die Daten für diese bestimmten Zwecke zu erfassen. Für die Forensik und das Debuggen sowie für das Erfassen von Protokollen ohne bestimmte Zielsetzung sind Textprotokolle in der Regel so gut, dass sich die Kosten für das Erlernen oder Erstellen der speziellen Tools häufig nicht lohnen.
quelle
Schauen wir uns das auf ein paar Ebenen an:
In Kürze:
Dann haben wir den Use-Case-basierten Ansatz:
Möchten Sie knotenspezifische Fehler in einem horizontal skalierten RDBMS protokollieren, in dem Sie die zusätzliche Arbeit aufwenden müssen, um den Fehler eines bestimmten Knotens zu ermitteln, wenn Sie nur die Abdeckung für den einen Knoten öffnen und dort anzeigen können? Andererseits sollte sich Ihre Anwendung möglicherweise in einem RDBMS anmelden, um Fehler und Hinweise auf Anwendungsebene zu sammeln.
Was passiert, wenn das RDBMS sich selbst protokollieren muss, weil in die Datenbank nicht geschrieben werden kann?
quelle
Komplexität. Durch Hinzufügen von RDBMS wird die Komplexität des gesamten Systems astronomisch erhöht. Die Fähigkeit, mit Komplexität umzugehen, ist das Wichtigste, was Programmierer von Quellcode-Produzenten unterscheidet.
quelle
Geschwindigkeit.
quelle