Je crée un système qui interroge les périphériques pour des données sur des métriques variables telles que l'utilisation du processeur, l'utilisation du disque, la température, etc. à (probablement) 5 minutes d'intervalle en utilisant SNMP. Le but ultime est de fournir des visualisations à un utilisateur du système sous la forme de graphiques chronologiques.
J'ai envisagé d'utiliser RRDTool dans le passé, mais je l'ai rejeté car le stockage des données capturées indéfiniment est important pour mon projet, et je souhaite un accès de plus haut niveau et plus flexible aux données capturées. Donc ma question est vraiment:
Quoi de mieux, une base de données relationnelle (comme MySQL ou PostgreSQL) ou une base de données non relationnelle ou NoSQL (comme MongoDB ou Redis) en ce qui concerne les performances lors de l'interrogation des données pour la représentation graphique.
Relationnel
Étant donné une base de données relationnelle, j'utiliserais une data_instances
table dans laquelle serait stockée chaque instance de données capturées pour chaque métrique mesurée pour tous les appareils, avec les champs suivants:
Des champs: id
fk_to_device
fk_to_metric
metric_value
timestamp
Lorsque je veux dessiner un graphique pour une métrique particulière sur un appareil particulier, je dois interroger cette table singulière en filtrant les autres appareils et les autres métriques en cours d'analyse pour cet appareil:
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
Le nombre de lignes dans ce tableau serait:
d * m_d * f * t
où d
est le nombre d' appareils , m_d
est le nombre cumulé de métriques enregistrées pour tous les appareils, f
est la fréquence à laquelle les données sont interrogées et t
est la durée totale pendant laquelle le système a collecté des données.
Pour un utilisateur enregistrant 10 métriques pour 3 appareils toutes les 5 minutes pendant un an, nous aurions un peu moins de 5 millions d' enregistrements.
Index
Sans index fk_to_device
et sans fk_to_metric
analyse, cette table en expansion continue prendrait trop de temps. Ainsi, l'indexation des champs susmentionnés et également timestamp
(pour créer des graphiques avec des périodes localisées) est une exigence.
Non relationnel (NoSQL)
MongoDB a le concept d'une collection , contrairement aux tables, celles-ci peuvent être créées par programme sans configuration. Avec ces derniers, je pourrais partitionner le stockage des données pour chaque appareil, ou même chaque métrique enregistrée pour chaque appareil.
Je n'ai aucune expérience avec NoSQL et je ne sais pas s'ils fournissent des fonctionnalités améliorant les performances des requêtes telles que l'indexation, mais le paragraphe précédent propose de faire la plupart du travail de requête relationnelle traditionnel dans la structure par laquelle les données sont stockées sous NoSQL.
Indécis
Une solution relationnelle avec une indexation correcte se réduirait-elle à une exploration dans l'année? Ou la structure basée sur la collection des approches NoSQL (qui correspond à mon modèle mental des données stockées) offre-t-elle un avantage notable?