Question

Je suis en train de créer un système de dispositifs sondages pour les données sur les paramètres variables telles que l'utilisation du processeur, l'utilisation du disque, la température, etc. à (probablement) les 5 minutes en utilisant le protocole SNMP. Le but ultime est de fournir à un utilisateur visualisations du système sous forme de graphiques de séries chronologiques.

J'ai regardé en utilisant RRDTool dans le passé, mais il a rejeté comme le stockage des données capturées indéfiniment est important à mon projet, et je veux plus haut niveau et un accès plus souple aux données capturées. Donc, ma question est vraiment:

Ce qui est 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.

Relational

Compte tenu d'une base de données relationnelle, j'utiliser une table de data_instances, dans laquelle seraient stockées toutes les occurrences de données capturées pour chaque être mesurée métrique pour tous les appareils, avec les champs suivants:

Domaines: id fk_to_device fk_to_metric metric_value timestamp

Quand je veux dessiner un graphique pour une métrique particulière sur un dispositif particulier, je dois interroger ce tableau singulier filtrer les autres appareils, et les autres mesures 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

d est le nombre de Appareils , m_d est le accumulative nombre de paramètres en cours d'enregistrement pour tous les appareils, f est le Fréquence lesquelles données sont interrogés et t est la quantité totale de temps le système recueille des données.

Pour un utilisateur d'enregistrement 10 paramètres pour 3 appareils toutes les 5 minutes pendant un an, nous aurions un peu moins de 5 millions records.

Index

Sans index sur fk_to_device et fk_to_metric la numérisation de cette table 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 consanguine (NoSQL)

MongoDB a le concept de collection , contrairement à ces tableaux peuvent être créés par programme sans installation. Avec cela, je pouvais diviser le stockage de données pour chaque périphérique, ou même chaque mesure enregistrée pour chaque périphérique.

Je n'ai aucune expérience avec NoSQL et ne savent pas si elles fournissent une performance des requêtes fonctions d'amélioration telles que l'indexation, mais le paragraphe précédent propose de faire la plupart des travaux de recherche relationnelle traditionnelle dans la structure par laquelle les données sont stockées sous NoSQL.

Indécis

Would une solution relationnelle avec l'indexation correcte de réduire à une exploration dans l'année? Ou la structure à base de collecte des approches NoSQL (qui correspond à mon modèle mental des données stockées) fournissent un avantage notable?

Était-ce utile?

La solution

Certainement Relationnel. Flexibilité illimitée et de l'expansion.

Deux corrections, à la fois dans le concept et l'application, suivie d'une élévation.

Correction

  1. Il est pas « filtrer les données non nécessaires »; il est en sélectionnant uniquement les données nécessaires. Oui, bien sûr, si vous avez un index pour appuyer les colonnes identifiées dans la clause WHERE, il est très rapide, et la requête ne dépend pas de la taille de la table (saisir 1000 lignes d'une 16 milliards de table de ligne est instantanée) .

  2. Votre table a un sérieux obstacle. Compte tenu de votre description, la PK réelle est (périphérique, métrique, DateTime). (. S'il vous plaît ne pas appeler TimeStamp, cela veut dire quelque chose d'autre, mais qui est un problème mineur) L'unicité de la ligne est identifié par:

       (Device, Metric, DateTime)
    
    • La colonne Id ne fait rien, il est totalement et complètement redondant.

      • Une colonne de Id est jamais une clé (lignes en double, qui sont interdites dans une base de données relationnelle, doivent être évités par d'autres moyens).
      • La colonne Id nécessite un indice supplémentaire, ce qui empêche évidemment la vitesse de INSERT/DELETE, et ajoute à l'espace disque utilisé.

      • Vous pouvez vous débarrasser de celui-ci. S'il vous plaît.

Altitude

  1. Maintenant que vous avez supprimé l'obstacle, vous ne pouvez pas avoir reconnu, mais votre table est en sixième normale forme. Très haut débit, avec un seul indice sur le PK. Pour comprendre, lisez cette réponse du Qu'est-ce sixième normal formulaire? rubrique partir.

    • (j'ai un indice, et non trois, sur la non-SQLs vous devrez peut-être trois indices).

    • J'ai la même table exacte (sans Id "clé", bien sûr). J'ai une Server colonne supplémentaire. Je soutiens plusieurs clients à distance.

      (Server, Device, Metric, DateTime)

    Le tableau peut être utilisé pour faire pivoter les données (p. Devices à travers le dessus et sur le côté Metrics ou pivoté) en utilisant exactement le même code de SQL (oui, passer les cellules). J'utilise la table pour construire une variété illimitée de graphiques et de tableaux pour les clients re leurs performances du serveur.

    • Statistiques Moniteur modèle de données .
      (Trop grand pour en ligne, certains navigateurs ne peuvent pas charger en ligne,.. Cliquez sur le lien qui est également la version de démonstration obsolète, pour des raisons évidentes, je ne peux pas vous montrer DM produit commercial)

    • Il me permet de produire Charts Like This , six frappes après avoir reçu un dossier de surveillance brut du client, en utilisant une seule commande SELECT . Notez que le mélange et match; OS et le serveur sur le même graphique; une variété de Pivots. Bien sûr, il n'y a pas de limite au nombre de matrices de statistiques, et donc les tableaux. (Avec l'aimable autorisation du client.)

    • Les lecteurs qui ne connaissent pas la norme pour la modélisation des bases de données relationnelles peuvent trouver le notation IDEF1X utile.

One More Thing

Last but not least, SQL est un IEC / ISO / ANSI. Le freeware est en fait non-SQL; il est frauduleux d'utiliser le terme SQL si elles ne fournissent pas la norme. Ils peuvent fournir des « extras », mais ils sont absents les éléments de base.

Autres conseils

trouvé très intéressant les réponses ci-dessus. Essayer d'ajouter quelques considérations plus ici.

1) données de vieillissement

La gestion du temps de la série ont généralement besoin de créer des politiques de vieillissement. Un scénario typique (CPU du serveur de surveillance par exemple) afin de stocker:

  • 1-sec échantillons bruts pour une courte période (par exemple, pendant 24 heures)

  • 5 min voir échantillon global pour une période de moyenne (par exemple 1 semaine)

  • 1 heure détail sur cette (par exemple jusqu'à 1 an)

Bien que les modèles relationnels permettent à coup sûr (ma société a mis en œuvre des bases de données massives centralisées pour certains gros clients avec des dizaines de milliers de séries de données) pour le gérer de façon appropriée, la nouvelle génération de magasins de données ajouter des fonctionnalités intéressantes à explorer comme:

  • automatisé de données de purge (voir Redis' commande EXPIRE)

  • agrégations multidimensionnelles (carte-réduire par exemple un emploi-la-Splunk)

2) Collecte en temps réel

Plus important encore certains magasins de données non relationnelles sont intrinsèquement distribués et permettent un temps réel beaucoup plus efficace (ou quasi temps réel) la collecte de données qui pourrait être un problème avec SGBDR en raison de la création de points d'accès (gestion de l'indexation lors de l'insertion dans un seul tableau). Ce problème dans l'espace SGBDR est généralement résolu de revenir à des procédures d'importation de lots (nous avons réussi cette façon dans le passé) alors qu'aucun-sql technologies ont réussi à la collecte et l'agrégation temps réel massif (voir Splunk par exemple, mentionné dans les réponses précédentes) .

Tableau Vous contient des données table. Donc relationnelle vs non relationnelle n'est pas la question. Fondamentalement, vous avez besoin de lire un grand nombre de données séquentielles. Maintenant, si vous avez suffisamment de RAM pour stocker une valeur années de données alors rien comme l'utilisation Redis / MongoDB etc.

La plupart du temps les bases de données NoSQL stockera vos données sur le même emplacement sur le disque et sous forme comprimée pour éviter plusieurs accès au disque.

NoSQL fait la même chose que la création de l'index id et de l'ID métrique, mais à sa manière. Avec la base de données même si vous faites cela l'index et les données peuvent être à différents endroits et il y aurait beaucoup de disque IO.

Des outils tels que Splunk utilisent backends NoSQL aux données de séries chronologiques de magasin, puis en utilisant la carte Réduire pour créer des agrégats (qui pourrait être ce que vous voulez plus tard). Donc, à mon avis, l'utilisation NoSQL est une option que les gens l'ont déjà essayé de cas d'utilisation similaires. Mais est-ce un million de lignes apporter la base de données à ramper (peut-être pas, avec du matériel décent et configurations appropriées).

Créez un fichier, nommez-1_2.data. idée weired? ce que vous obtenez:

  • Vous économisez jusqu'à 50% de l'espace parce que vous n'avez pas besoin de répéter la fk_to_device et la valeur fk_to_metric pour chaque point de données.
  • Vous économisez encore plus d'espace parce que vous ne avez pas besoin d'indices.
  • Enregistrer paires de (horodatage, metric_value) au fichier en ajoutant les données afin que vous obtenez une commande par horodatage gratuitement. (En supposant que vos sources n'envoient pas des données de commande pour un appareil)

=> Requêtes par exécution d'horodatage incroyablement rapide, car vous pouvez utiliser la recherche binaire pour trouver le bon endroit dans le fichier à lire.

si vous aimez encore plus optimisé commencer à penser à diviser vos fichiers comme ça;

  • 1_2_january2014.data
  • 1_2_february2014.data
  • 1_2_march2014.data

ou de l'utilisation KDB + de http://kx.com parce qu'ils font tout cela pour vous :) en colonnes est- ce qui peut vous aider.

Il existe une solution orientée colonne en nuage apparaître, de sorte que vous pouvez consulter: http: // timeseries .guru

Si vous regardez les paquets GPL, RRDTool est un bon à Regarder. Il est un bon outil pour le stockage, l'extraction et représentant des données série fois. Votre apparence de cas d'utilisation exactement comme les données de séries chronologiques.

Ceci est un problème que nous avons dû résoudre à ApiAxle. Nous a écrit un billet de blog sur la façon dont nous l'avons fait à l'aide Redis. Il n'a pas été là pour très longtemps mais il révèle être efficace.

J'ai aussi utilisé RRDTool pour un autre projet qui était excellent.

Je pense que la réponse à ce genre de question devrait essentiellement tourner autour de la façon dont votre base de données utilise le stockage. Certains serveurs de base de données et l'utilisation RAM disque, une RAM d'utilisation uniquement (en option disque pour persistance), etc. La plupart des solutions de bases de données SQL communes utilisent de la mémoire + stockage sur disque et enregistre les données dans une mise en page par rangée (toutes premières inséré est écrit dans le même endroit). Pour les magasins de séries chronologiques, dans la plupart des cas, la charge de travail est quelque chose comme: intervalle relativement faible quantité massive d'inserts, tandis que les lectures sont en colonnes (dans la plupart des cas, vous voulez lire une gamme de données d'une colonne spécifique, ce qui représente une métrique)

J'ai trouvé les bases de données colonnaires (google, vous trouverez MonetDB, InfoBright, ParAccel, etc) font travail formidable pour les séries chronologiques.

Quant à votre question, je pense personnellement est un peu invalide (comme toutes les discussions en utilisant le terme de défaut NoSQL - OMI): Vous pouvez utiliser un serveur de base de données SQL qui peut parler d'une part, ce qui rend votre vie très facile car tout le monde sait SQL depuis de nombreuses années et cette langue a été mise au point encore et encore pour les requêtes de données; mais toujours utiliser RAM, CPU cache et disque d'une manière orientée colonnaire, ce qui rend votre solution meilleur ajustement Time Series

5 millions de lignes est rien pour les données diluviennes d'aujourd'hui. Attendez-vous à des données d'être dans la tuberculose ou PB en quelques mois. A ce stade, SGBDR n'échelle pas à la tâche et nous avons besoin de l'évolutivité linéaire des bases de données NoSQL. La performance serait atteint pour la partition colonnaire utilisée pour stocker les données, l'ajout de colonnes et des lignes moins genre de concept pour dynamiser la performance. Tirer parti de l'ajourés TSDB fait au-dessus de Hbase ou MapR_DB, etc.

je fais face à des exigences similaires régulièrement, et ont récemment commencé à utiliser Zabbix pour recueillir et stocker ce type de données. Zabbix a sa propre capacité graphique, mais il est assez facile d'extraire les données de la base de données Zabbix et le traiter comme bon vous semble. Si vous ne l'avez pas déjà vérifié Zabbix, vous trouverez peut-être utile de votre temps de le faire.

Vous devriez regarder dans base de données de séries chronologiques . Il a été créé à cet effet.

Une base de données de série temporelle (TSDB) est un système de logiciel qui est optimisée pour les données de séries temporelles de manutention, des tableaux de nombres indexés par le temps (a datetime ou une plage de date-heure).

Exemple populaire de base de données de séries chronologiques InfluxDB

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top