Je suis en train de créer un système qui interroge les périphériques pour obtenir des données sur diverses métriques telles que l'utilisation du CPU, l'utilisation du disque, la température, etc. à des intervalles de 5 minutes (probablement) en utilisant SNMP. Le but ultime est de fournir des visualisations à un utilisateur du système sous la forme de graphiques de séries temporelles.
J'ai envisagé d'utiliser RRDTool dans le passé, mais je l'ai rejeté car le stockage indéfini des données capturées est important pour mon projet, et je veux un accès de plus haut niveau et plus souple aux données capturées. Ma question est donc la suivante :
Qu'est-ce qui est le 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 de données pour la création de graphiques.
Relationnel
Dans le cas d'une base de données relationnelle, j'utiliserais un fichier data_instances
dans lequel serait stocké chaque instance de données capturées pour chaque métrique mesurée pour tous les dispositifs, avec les champs suivants :
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 filtrage les autres appareils, et les autres paramètres analysés 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
donde d
est le nombre de dispositifs , m_d
est le cumulatif nombre de mesures en cours d'enregistrement pour tous les appareils, f
est le fréquence à laquelle les données sont recherchées et t
est le montant total de temps le système a collecté des données.
Pour un utilisateur enregistrant 10 mesures pour 3 appareils toutes les 5 minutes pendant un an, nous aurions un peu moins de 5 millions les dossiers.
Indices
Sans index sur fk_to_device
y fk_to_metric
Le balayage de ce tableau en constante expansion prendrait trop de temps. Ainsi, l'indexation des champs mentionnés ci-dessus et aussi timestamp
(pour créer des graphiques avec des périodes localisées) est une exigence.
Non-rationnel (NoSQL)
MongoDB a le concept d'un collection Contrairement aux tables, celles-ci peuvent être créées par programme, sans configuration. Avec ceux-ci, 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 des systèmes NoSQL et je ne sais pas s'ils offrent des fonctions d'amélioration de la performance des requêtes telles que l'indexation, mais le paragraphe précédent propose de faire la plupart du travail traditionnel de requête relationnelle 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 à l'état d'un crawl dans l'année ? Ou la structure basée sur les collections des approches NoSQL (qui correspond à mon modèle mental des données stockées) offre-t-elle un avantage notable ?
1 votes
Question très pertinente, j'ai moi-même réfléchi à la question de savoir si la base de données relationnelle est le bon moyen de stocker une structure de données qui est en fait hiérarchique (structure SNMP). Parfois, lorsque j'écris une requête pour récupérer des données, même triviales, la requête est trop compliquée, j'ai l'impression que les données doivent être manipulées dans une forme qui n'est pas la leur. Par exemple, faire correspondre les ifnames et leurs index est censé être une tâche triviale, les deux étant des enfants du même oid parent. Mais la façon dont elles sont stockées dans les bases de données relationnelles ne correspond pas à leur structure d'origine et je pense qu'il est plus efficace de les stocker de façon hiérarchique.
1 votes
"Pour un utilisateur enregistrant 10 mesures pour 3 appareils toutes les 5 minutes pendant un an, nous aurions un peu moins de 5 millions d'enregistrements." Est-ce que 10 * 3 * 365 * 24 * 12 n'est pas approximativement égal à 3 millions, ce qui n'est pas juste moins de 5 millions ?