2017-05-03 5 views
-1

J'essaye de concevoir un système qui a des données de série temporelle. Voici les exigences du système:Base de données de timeséries avec agrégation multi-colonnes

  • Les données arrivent dans le système à tout moment de la journée à partir de plusieurs villes et départements.
  • Ces enregistrements individuels devraient être disponibles à vie. (facultatif)
  • La plupart des requêtes sont des agrégations. Cependant, ils se produisent sur plusieurs colonnes. Exemple requêtes:
    • Somme de toutes les mesures sur un jour donné dans une ville
    • Somme de toutes les mesures dans un (dernier) mois dans un département
    • Somme de toutes les mesures dans un (dernier) semaine une ville pour un département
    • Somme de toutes les mesures sur un jour donné dans un état (Etat fera également partie du dossier)
  • toutes les requêtes doivent être calculées avec une latence très faible (300-500 < ms)

Voici les contraintes que j'ai:

  • Je suis passé par plusieurs bases de données de séries chronologiques. D'après ce que je sais, tous nécessitent un matériel coûteux. Je voudrais savoir s'il y a moyen de le faire fonctionner avec du matériel de base.
  • Je ne sais pas combien de données seront disponibles au début. Idéalement, il serait d'environ 100 Mo en pointe (par jour). Donc, je ne suis pas prêt à dépenser des centaines de dollars au début.
  • Une autre idée à laquelle je pensais est d'avoir une instance Amazon RDS et d'avoir plusieurs index sur différentes colonnes et de les agréger si nécessaire. Je ne suis pas sûr si c'est une bonne idée cependant.

Répondre

0

Vous pouvez essayer Akumuli (avertissement: je suis l'auteur). Akumuli peut effectuer des agrégations assez rapidement (sous la milliseconde) parce que c'est une base de données orientée colonne et il pré-calcule certains agrégats pour vous. Et il peut effectuer toutes les requêtes dont vous avez besoin, par ex. si votre série ressemble à ceci:

${measurement_name} city=${city_name} dept=${department_name} state=${state_name} 

Et les données réelles ressemble à ceci (par exemple, c'est une donnée de consommation d'énergie mesurée en watts):

W city=Jersey_City state=New-Jersey dept=1 
W city=Jersey_City state=New-Jersey dept=2 
W city=Paris state=Iowa dept=1 
W city=Paris state=Iowa dept=2 
W city=Texas state=Texas dept=1 
W city=Texas state=Texas dept=3 
W city=Paris state=Arkansas dept=1 
W city=Paris state=Arkansas dept=2 

Vous pouvez regrouper toutes les données avec dept=1 et dept=2 tags utilisant cette requête:

{ 
    "aggregate": { "W": "sum" }, 
    "range": { "from": "20170501T000000", 
       "to": "20170502T000000" }, 
    "group-by": [ "dept" ], 
    "where": { "dept": [1, 2] } 
} 

Vous obtiendrez la somme pour chaque département mais seuls les départements 1 et 2 seront inclus.

Vous pouvez diviser par la ville à la place:

{ 
    "aggregate": { "W": "sum" }, 
    "range": { "from": "20170501T000000", 
       "to": "20170502T000000" }, 
    "group-by": [ "city" ], 
} 

Vous obtiendrez somme pour chaque nom de la ville (tous les services dans une ville seront rejoints). De cause, vous pouvez filtrer par tag en utilisant la clause where.

Si vous avez plusieurs villes avec le même nom (par exemple Paris dans l'Iowa et de l'Arkansas), vous pouvez les valeurs du groupe par ville et de l'État:

{ 
    "aggregate": { "W": "sum" }, 
    "range": { "from": "20170501T000000", 
       "to": "20170502T000000" }, 
    "group-by": [ "city", "state" ], 
} 

Vous obtiendrez une valeur pour Paris Arkansas et un autre pour Paris Iowa .

0

Les agrégations que vous avez décrites sont plutôt standard. Il serait difficile de trouver une base de données qui ne les supporterait pas.

Vous pouvez essayer Axibase TSD. Il peut calculer efficacement des agrégats de calendrier (par exemple des totaux quotidiens) avec plusieurs dimensions dans le fuseau horaire défini par l'utilisateur. Ce serait utile si les mesures que vous recueillez sont entraînés par l'activité de l'utilisateur final:

SELECT date_format(time, "yyyy-MMM-dd", "US/Eastern"), 
    entity AS 'city', SUM(value) 
FROM "email.active_sessions" 
    WHERE datetime >= current_year 
    AND entity.tags.state = 'PA' 
GROUP BY entity, PERIOD(1 DAY, "US/Eastern") 

intervalles Les peuvent être facilement spécifiés avec des mots clés étendues/fonctions. Voici comment « (dernière) semaine » état ressemble:

WHERE datetime >= previous_week AND datetime < current_week 

Se reporter à SQL docs pour d'autres exemples. ATSD s'exécute sur la plupart des distributions Linux et peut être exécuté dans les deux modes stand-along et distribués.

Divulgation: Je travaille pour Axibase.