Pourquoi le système de fichiers est-il préféré pour les journaux au lieu du SGBDR?

44

La question devrait être claire de son titre. Par exemple, Apache enregistre ses accès et ses journaux d’erreurs dans des fichiers plutôt que dans un SGBDR, quelle que soit la taille de l’utilisation.

Pour RDMS, nous devons simplement écrire des requêtes SQL et le travail sera effectué, tandis que pour les fichiers, nous devons choisir un format particulier, puis écrire des expressions rationnelles ou des analyseurs syntaxiques pour les manipuler. Et ceux-ci pourraient même échouer dans des circonstances particulières si un grand soin n'était pas apporté.

Pourtant, tout le monde semble préférer le système de fichiers pour la maintenance des journaux. Je ne suis partisan d'aucune de ces méthodes, mais j'aimerais savoir pourquoi cela se pratique de la sorte. Est-ce la vitesse ou la maintenabilité ou autre chose?

Yasir
la source
10
Comment consigneriez-vous les erreurs de base de données (db indisponible, par exemple) si votre système de journalisation enregistre dans une base de données?
Marjan Venema
17
@Marjan Comment enregistrer les erreurs du système de fichiers en cas d'échec?!
Yasir
5
Tout à fait vrai, mais si cela échoue, il est probable que votre base de données soit également inaccessible ... Après tout, où / comment écrirait-il sur ses tables sans le système de fichiers?
Marjan Venema
2
@Yasir: envoie tous les messages du journal à un serveur syslog avant de se connecter au système de fichiers :)
Brian
1
@MarjanVenema le si le jeu est inutile. Que se passe-t-il si le disque local est plein, votre journalisation échouera mais l'application et le système d'exploitation pourront continuer. Si vous vous connectez à un serveur de base de données distant, vous pourrez toujours vous connecter. Il existe des avantages et des inconvénients à stocker les messages de journalisation, et le meilleur choix dépend de ce que vous essayez de sortir de la journalisation. Désolé, je vais laisser le troupeau revenir au fichier, c'est la seule façon.
Andy

Réponses:

37
  1. Trop de choses peuvent échouer avec la base de données et la journalisation de ces échecs est également importante.

  2. À moins que vous n'ayez un système de base de données autorisant des transactions autonomes (ou aucune transaction), la journalisation nécessiterait une connexion distincte afin qu'une annulation ou une validation dans la journalisation n'interfère pas avec l'annulation ou la validation dans l'application.

  3. Beaucoup de choses qui méritent d'être enregistrées se produisent au démarrage, c'est-à-dire éventuellement avant que la connexion à la base de données ait été établie.

  4. Dans ce qui pourrait être une configuration typique, un nouveau fichier journal est créé chaque jour, les anciens fichiers journaux sont compressés et conservés pendant 2 semaines, avant d'être finalement supprimés. Ce n'est pas facile de faire la même chose dans un SGBDR.

utilisateur281377
la source
1
J'ai essayé cette expérience et ça ne s'est pas bien passé. Le SGBDR est conçu autour de l'idée que les données sont écrites relativement peu par rapport au nombre de lectures. L’exploitation forestière est fondamentalement le contraire. Vous écrivez tout le temps et lisez rarement. C’est un excellent moyen d’ennuyer votre DBA.
JimmyJames
1
On pourrait toutefois envisager d’utiliser un système de base de données chronologique tel que InfluxDB pour conserver les journaux; il me semble que cela convient un peu mieux à la tâche que, par exemple, PostgreSQL. Néanmoins, l’avantage par rapport aux anciens fichiers journaux est à peine là.
user281377
L'utilisation d'une base de données non relationnelle avec indexation de jetons, etc. est certainement utile et si vous choisissez judicieusement, ils peuvent gérer le tuyau d'incendie. Cela fait partie de la façon dont des choses comme splunk et flume fonctionnent.
JimmyJames
Le n ° 4 n'est pas vraiment un problème. DELETE FROM dbo.Log WHERE LogDate < today minus 2 weeks
Robert Harvey
@RobertHarvey Cela fonctionne bien jusqu'à ce que vous l'essayiez dans un environnement de charge lourde, où de telles opérations en bloc peuvent causer de graves problèmes sans précautions supplémentaires. Redo se connecte en remplissant votre espace disque, en annulant l’espace de table devenant trop plein, la réplication en prenant beaucoup de temps pour répliquer la suppression, etc.
user281377
16

J'ai déjà vu des journaux écrits dans la base de données (et vous obtenez parfois des options configurables pour la journalisation, où la trace est stockée dans un fichier, les erreurs dans la base de données, fatals dans le journal des événements Windows).

Les raisons principales sont la vitesse et la taille, permettant au traçage de produire de très grandes qualités de journalisation - j'ai parcouru les fichiers journaux en gigaoctets. L'autre raison principale est que la lecture des journaux doit être séquentielle, il n'est pas vraiment nécessaire d'interroger le journal, sauf pour rechercher une certaine erreur ou entrée - et la recherche dans le fichier fonctionne parfaitement pour cela.

gbjbaanb
la source
Mais j'ai une confusion pour cela. Mon bloc-notes, wordpad, gedit ou notepad ++ ou tout navigateur Web ne seront pas heureux d'ouvrir un fichier de 4 Go. Le même navigateur pourra toutefois me montrer une liste de mille pages contenant chacune 500 notices imprimées. Droite?
Yasir
7
@Yasir parce que vous utilisez des éditeurs qui tentent de charger le fichier entier en mémoire. Essayez d'utiliser un éditeur plus intelligent, capable de «diffuser» le gros fichier. Vim est un bon exemple.
Nakhli
6
@Yasir: C'est vrai, mais vous essayez d'optimiser la mauvaise chose. La plupart du temps, les journaux sont écrits et ne sont jamais lus. Vous créez donc des journaux très rapidement, car c’est le cas habituel.
Unholysampler
5
Euh, j’ai déjà terminé la connexion à la base de données et pouvoir interroger facilement les messages du journal était extrêmement bénéfique, en particulier lorsque nous activons la journalisation au niveau de débogage pour repérer un bogue difficile à répliquer.
Andy
2
@gbjbaanb Je ne l'ai pas trouvé surestimé et, franchement, vous proposez d'utiliser des lignes de repère et de couper / coller pour interroger est une blague. Nous n'avons pas seulement cherché, nous avons analysé les tendances pour trouver des serveurs qui rencontraient plus de problèmes que les autres, le type d'erreur que les utilisateurs voyaient le plus souvent, etc.
Andy
15

La vitesse est une des raisons; d'autres sont:

  • Éliminer les points d'échec. Un système de fichiers échoue rarement dans des conditions où un SGBD ne le ferait pas, mais il existe de nombreuses conditions d'erreur dans les bases de données qui n'existent pas simplement dans les systèmes de fichiers.
  • Accessibilité de basse technologie. Si les choses vont vraiment très mal, vous pouvez démarrer dans un shell de secours ou monter le disque sur un autre système tout en conservant les outils adéquats pour inspecter les fichiers journaux. Si c'est une base de données, vous n'êtes nulle part sans un serveur de base de données en cours d'exécution.
tdammers
la source
3

Tout d'abord.

Et ceux-ci pourraient même échouer dans des circonstances particulières si un grand soin n'était pas apporté.

Les transactions de base de données ne peuvent pas échouer lorsque vous ne faites pas attention?

L'écriture dans un fichier texte présente de nombreux avantages, le plus important étant:

  • Le texte est lisible par l'homme. N'importe qui peut ouvrir un fichier journal avec un éditeur de texte de base et voir quels sont les messages. Vous n'avez pas besoin de comprendre comment la base de données est organisée.
  • La vitesse. Écrire du texte sur un disque est beaucoup plus rapide qu’un service de base de données qui détermine où le texte est placé dans une base de données, l’écrit là-bas et s’assure que la transaction est terminée.
unholysampler
la source
De toute évidence, tout peut échouer si nous ne faisons pas attention. Mais pour cette question, je parlais de programmeur de haut niveau. Par exemple, le programmeur peut vouloir séparer les valeurs en utilisant un caractère particulier. Ainsi, sa regex fonctionnera comme un charme mais échouera si le même caractère est contenu dans un bloc de valeur. De cette façon, il doit s'occuper de cas similaires et il n'a pas besoin d'y penser s'il économisait en DB. Aussi, pouvez-vous s'il vous plaît voir mon commentaire sur la réponse de gbjbaanb?
Yasir
1
Et si vous écrivez votre code SQL à la main, vous avez le même problème. La différence étant que l'écriture échouera (ou corrompra vos données) au lieu de gêner légèrement un développeur, car sa chaîne de recherche a généré des résultats erronés. Oui, il existe des frameworks qui vous évitent d'écrire en SQL, mais chaque couche supplémentaire ralentit le processus. Et rappelez-vous que cela ne fait que consigner. Chaque cycle que vous utilisez pour vous connecter est un cycle que vous n'utilisez pas pour effectuer un travail réel.
Unholysampler
@unholysampler Votre argument de performance est faible, la journalisation peut être effectuée très rapidement et sur un thread en arrière-plan d'une base de données, et la journalisation sur les f, bien que potentiellement plus rapide, n'est pas non plus libre, surtout si elle n'est pas effectuée en arrière-plan.
Andy
2

Vous soulevez spécifiquement Apache, je vais donc en discuter en détail.

Apache peut être configuré pour se connecter à une base de données, bien que cela nécessite un plugin externe . L'utilisation d'un tel plug-in peut faciliter l'analyse des journaux, mais uniquement si vous avez l'intention d'écrire votre propre logiciel d'analyse des journaux. Les analyseurs de journaux standard disponibles supposent que vos journaux sont dans des fichiers, vous ne pourrez donc pas les utiliser.

Lorsque je faisais cela, j’ai également rencontré des problèmes de fiabilité: si le tampon d’écriture du serveur de base de données était saturé (ce qui peut arriver avec mysql si vous utilisez votre quota de système de fichiers pour l’utilisateur sous lequel il est exécuté), il commence à mettre en file d'attente les requêtes jusqu’à ce qu’ils soient capables. Pour commencer, Apache commence à attendre qu’elle se termine, ce qui entraîne des demandes bloquées sur votre site Web.

(Ce problème peut maintenant être corrigé, bien sûr - il y a de nombreuses années que je l'ai fait)

Jules
la source
1

Un système de fichiers est une base de données. C'est en effet une base de données hiérarchique plus simple au lieu d'un SGBD relationnel, mais c'est quand même une base de données.

La raison pour laquelle la connexion à un système de fichiers est populaire est que les journaux de texte sont parfaitement compatibles avec la philosophie Unix: "Le texte est l'interface universelle".

Unix avait développé de nombreux outils à usage général pouvant fonctionner avec les journaux de texte. Peu importe que les journaux de texte soient générés par mysql, apache, votre application personnalisée, un logiciel tiers qui est depuis longtemps sans support, l'administrateur système peut utiliser des outils Unix standard tels que grep, sed, awk, sort, uniq, cut, tail , etc., pour parcourir les journaux de la même manière.

Si chaque application se connecte à sa propre base de données, une à MySQL, une autre à Postgres, une autre à Elasticsearch, une autre souhaite se connecter à ELK, une autre ne peut se connecter qu'à MongoDB, il vous faudra alors apprendre vingt outils différents pour scruter les journaux de chaque application. Le texte est un support universel auquel tout le monde peut se connecter.

Même si vous parvenez à ce que tous les journaux soient placés dans une seule base de données, par exemple, MySQL, vous constaterez peut-être que chaque application voudra se connecter avec différents schémas de table, de sorte que vous devrez toujours écrire un outil personnalisé pour interroger les journaux de chaque. application. Et si vous avez en quelque sorte bourré toutes les applications pour vous connecter à un seul schéma, vous constaterez probablement que ce schéma générique ne peut pas vraiment vous donner l'historique complet de chaque application. Vous devez donc quand même analyser les textes du journal.

Se connecter à une base de données ne rend souvent pas les choses beaucoup plus faciles dans la pratique.

La connexion à une base de données peut être utile lorsque vous avez une analyse spécifique à l'esprit ou pour une exigence spécifique d'audit d'audit, pour laquelle vous pouvez concevoir un schéma de base de données spécifique pour collecter uniquement les données à ces fins spécifiques. Mais pour les analyses judiciaires et de débogage et lorsque vous collectez des journaux sans objectif spécifique, les journaux de texte sont généralement suffisamment bons pour que le coût d'apprentissage ou de création d'outils spécialisés n'en vaut souvent pas la peine.

Lie Ryan
la source
0

Regardons ceci sur quelques couches:

  1. Couche de machine
  2. Couche système d'exploitation
  3. Couche de service
  4. Couche d'application

En bref:

  • Sur la couche machine, vous ne pouvez vraiment pas vous connecter, autre qu’une sorte de vidage.
  • Sur la couche de système d'exploitation, vous pouvez effectuer une journalisation, mais vous ne disposez que du système de fichiers.
  • Les services peuvent se connecter au système de fichiers, mais ils ne peuvent pas faire confiance aux autres services en cours d'exécution, ils ne peuvent donc pas s'y connecter.
  • Les applications peuvent se connecter aux services et au système de fichiers.

Ensuite, nous avons l'approche par cas d'utilisation:

Voulez-vous consigner les erreurs spécifiques à un nœud dans un SGBDR à échelle horizontale dans lequel vous devez effectuer le travail supplémentaire pour rechercher l'erreur d'un nœud spécifique alors que vous pouvez simplement ouvrir le capot du nœud et le voir à cet endroit? D'autre part, votre application doit éventuellement se connecter à un SGBDR pour collecter les erreurs et les notifications au niveau de l'application.

Que se passe-t-il lorsque le SGBDR doit se connecter lui-même, car la base de données ne peut pas être écrite?

ojrask
la source
-2

Complexité. L'ajout de SGBDR augmentera la complexité de l'ensemble du système de manière astronomique. Et la capacité à gérer la complexité est la principale caractéristique qui distingue les programmeurs des producteurs de code source.

le midi
la source
1
Pourriez-vous préciser ce que vous entendez par complexité en ce qui concerne la connexion à une base de données par rapport à un système de fichiers? D'après mon expérience, il n'y a pas eu de différence significative de complexité dans un environnement professionnel.
Adam Zuckerman
Vraiment? SqlLite augmente la complexité de façon astronomique? Et, bien qu'un serveur Web n'ait normalement pas besoin d'une base de données, de nombreuses applications métier en utilisent déjà une, ce qui ne génère aucun coût supplémentaire.
Andy
@AdamZuckerman bien sûr, tout SGBDR a besoin de maintenance, est sujet à corruption, peut nécessiter un réglage particulier, peut être affecté par une mauvaise configuration, peut nécessiter une récupération spéciale, comporte ses propres limitations, possède ses propres dépendances, ses plates-formes prises en charge, les problèmes de mise à niveau, des bugs, les licences, etc. .
Noonex
@Andy tout d’abord, SQLite n’est pas un SGBDR classique, c’est un "SGBDR intégré". Et oui - requérir SQLite pour la journalisation augmentera beaucoup la complexité.
Noonex
1
@noonex Vous faites simplement une distinction arbitraire entre le serveur intégré et le serveur complet, contrairement au SGBDR. SqlLite fournit la conformité ACID, ce qui est vraiment ce que sont les SGBDR. Et cela augmente beaucoup la complexité? Je peux seulement imaginer que vous n’avez travaillé que sur la plus triviale des applications. Enfin, bon travail ignorant complètement mon point sur de nombreuses applications métier nécessitaient déjà une base de données de toute façon.
Andy
-4

Est-ce la vitesse ou la maintenabilité ou autre chose?

La vitesse.

S.Lott
la source