2012-05-09 3 views
37

Avez-vous une expérience de la connexion aux bases de données NoSQL pour les applications évolutives? J'ai fait quelques recherches sur les bases de données NoSQL pour la journalisation et j'ai trouvé que MongoDB semble être un bon choix. En outre, j'ai trouvé log4mongo-net qui semble être une option très simple.Quelle base de données NoSQL dois-je utiliser pour la journalisation?

Recommanderiez-vous ce type d'approche? Y a-t-il d'autres propositions?

Répondre

47

J'ai décidé de réviser cette réponse acceptée car l'état de l'art a considérablement changé au cours des 18 derniers mois, et de bien meilleures alternatives existent.

Nouvelle réponse

MongoDB est un choix de sous-par une solution de journalisation évolutive. Il y a les raisons habituelles pour cela (écrire des performances sous charge par exemple). Je voudrais en proposer un de plus, c'est-à-dire qu'il ne résout qu'un seul cas d'utilisation dans une solution de journalisation.

Une forte étapes solution doit couvrir au moins l'exploitation forestière suivantes:

  • Collection
  • Transport
  • Traitement
  • Stockage
  • Recherche
  • Visualisation

MongoDB en tant que choix résout seulement le cas d'utilisation de stockage (quoique quelque peu mal). Une fois la chaîne complète analysée, il existe des solutions plus appropriées.

@KazukiOhta mentionne quelques options. Ma fin préférée à la solution de fin de ces jours implique:

T L'utilisation sous-jacente d'ElasticSearch pour le stockage des données de journalisation utilise la meilleure solution NoSQL actuelle pour la consignation et la recherche du cas d'utilisation. Le fait que Logstash-Forwarder/Logstash/ElasticSearch/Kibana3 soient sous l'égide de ElasticSearch est un argument encore plus convaincant. Puisque Logstash peut également agir comme un proxy Graphite, une chaîne très similaire peut être construite pour le problème associé de collecte et d'analyse des mesures (pas seulement les journaux).

Vieille réponse

MongoDB Capped Collections sont extrêmement populaires et suitable for logging, avec l'avantage supplémentaire d'être « schéma moins », ce qui est généralement un ajustement sémantique pour l'exploitation forestière. Souvent, nous ne savons que ce que nous voulons enregistrer dans un projet, ou après que certains problèmes ont été trouvés dans la production. Les bases de données relationnelles ou les schémas stricts ont tendance à être difficiles à modifier dans ces cas, et les tentatives de les rendre «flexibles» tendent simplement à les rendre «lents» et difficiles à utiliser ou à comprendre. Mais si vous préférez manage your logs in the dark and have lasers going and make it look like you're from space, il y a toujours Graylog2 qui utilise MongoDB dans le cadre de son infrastructure globale, mais qui en offre beaucoup plus, comme un format commun et extensible, un serveur de collecte de journaux dédié, une architecture distribuée et un interface utilisateur funky.

+0

Graylog2, impressionnant. Merci pour le conseil! – ikrain

+3

Juste un mot d'avertissement, nous avons rencontré de graves problèmes avec MongoDB lors de l'écriture de plus de quelques milliers d'événements par seconde pour les collections de journaux. La performance d'écriture terne de MongoDB peut être le coupable. –

+0

À propos de Graylog2, veuillez prendre note: "Tout fonctionne sur la JVM existante dans votre centre de données." Si vous manquez cela, vous ne verrez rien tant que vous ne regarderez pas le troisième ou le quatrième paragraphe des instructions d'installation du paquet de téléchargement ("Vous devez également utiliser Java 7!"). Je pense toujours que c'est drôle de voir comment les projets basés sur Java oublient de mentionner qu'ils sont des projets basés sur Java lorsqu'ils se vendent. Juste IMO. – L0j1k

0

Vous devez spécifier le type de messages de journal que votre application génère. Si vous consignez seulement beaucoup de messages simples, MongoDB est un très bon choix car il est très bon. Mais si vous avez besoin d'éléments d'authentification complexes ou de beaucoup de hiérarchie, j'utiliserais un rdbms traditionnel.

17

J'ai vu beaucoup d'entreprises utilisent MongoDB pour stocker les journaux d'application. Son schéma-affranchissement est vraiment flexible pour les journaux d'application, au cours de laquelle le schéma a tendance à changer de temps en temps. En outre, sa fonctionnalité Capped Collection est vraiment utile car elle purge automatiquement les anciennes données pour conserver les données dans la mémoire.

Les personnes regroupent les journaux par Grouping normal ou MapReduce, mais ce n'est pas si rapide. Surtout MapReduce de MongoDB ne fonctionne que dans un seul thread et son temps d'exécution JavaScript est énorme. New aggregation framework pourrait résoudre ce problème. Lorsque vous utilisez MongoDB pour la journalisation, le problème est le conflit par des débits d'écriture élevés. Bien que l'insertion de MongoDB soit un style ignoré par défaut, l'appel de insert() provoque un conflit de verrouillage en écriture lourd. Cela peut affecter les performances de l'application et empêcher les lecteurs d'agréger/filtrer les journaux stockés.

Une solution pourrait être d'utiliser le cadre de collecteur journal tels que Fluentd, Logstash ou Flume. Ces démons sont censés être lancés sur tous les nœuds d'application et récupèrent les journaux des processus d'application.

Fluentd plus MongoDB

Ils tampon les journaux et de manière asynchrone écrit les données à d'autres systèmes comme MongoDB/PostgreSQL/etc L'écriture se fait par lots, il est donc beaucoup plus efficace que d'écrire directement à partir de applications. Ce lien décrit comment mettre les logs dans Fluentd à partir du programme PHP.

Voici quelques tutoriels sur MongoDB + Fluentd.

problème de MongoDB est-il commence à ralentir lorsque le volume de données dépasse la taille de la mémoire. À ce stade, vous pouvez passer à d'autres solutions comme Apache Hadoop ou Cassandra.Si vous avez une couche de journalisation distribuée mentionnée ci-dessus, vous pouvez instantanément passer à une autre solution à mesure que vous grandissez. Ce tutoriel explique comment stocker des journaux dans HDFS en utilisant Fluentd.

Questions connexes