2009-07-29 7 views
2

Je rassemble un vecteur de paires temps/valeur, dans ce cas la latence d'E/S en fonction du temps pour un serveur. Je voudrais les stocker dans une base de données MySQL pouvant être interrogée par date, serveur et autres métadonnées.Comment stocker un vecteur de données de temps/valeur dans une base de données

Exemples:

  • Je veux être en mesure d'interroger les E/S latences 13h00-à-15:00 pour le serveur Atriedes le 19 Août 2007.
  • Je veux aussi être en mesure d'interroger les temps que la latence d'E/S sur le serveur Harkonnen où les latences d'E/S sont supérieures à 40 ms.
  • Je veux trouver tous les serveurs qui avaient des latences supérieures à 100 ms le 1er Août 2007.

Comment dois-je structurer ma base de données pour permettre facilement cela?

Répondre

1
CREATE TABLE t_latency (
     id INT NOT NULL PRIMARY KEY, 
     server_id INT NOT NULL, 
     ts DATETIME NOT NULL, 
     latency FLOAT NOT NULL, 
     KEY ix_latency_server_time_latency (server_id, ts, latency), 
     KEY ix_latency_server_latency (server_id, latency), 
     KEY ix_latency_time (ts) 
     ) 

Je veux être en mesure d'interroger les E/S latences 13h00-15h00 pour le serveur Atriedes sur August 19th, 2007

SELECT * 
FROM t_latency 
WHERE server_id = @id_of_atriedes 
     AND ts BETWEEN '2007-08-19 01:00' AND '2007-08-19 03:00' 
-- will use ix_latency_server_time_latency 

Je veux aussi être en mesure d'interroger les temps que la latence d'E/S sur le serveur Harkonnen où les latences d'E/S sont supérieures à 40 ms.

SELECT * 
FROM t_latency 
WHERE server_id = @id_of_harkonnen 
     AND latency > .04 
-- will use ix_latency_server_latency 

Je veux trouver tous les serveurs qui avaient latences ci-dessus 100 ms sur August 1st, 2007.

SELECT DISTINCT server 
FROM t_latency 
WHERE ts >= '2007-08-01 00:00' 
     AND ts < '2007-08-02 00:00' 
     AND latency > 0.1 
-- will use ix_latency_time 
+0

Pas besoin de la colonne ID; le serveur plus l'horodatage doit être unique et donc la combinaison doit être la clé primaire. –

+0

@Jonathan: comment savez-vous qu'ils seront uniques? – Quassnoi

0

serverName, IOLatency, transactionStart

où ServerName est le nom du serveur IOLatency est le moment où l'opération a pris transactionStart est l'heure de début de la transaction.

Vous pouvez également utiliser l'option transactionEnd time au lieu de IOlatency, ou les deux, en fonction du type de requêtes que vous souhaitez optimiser et des considérations de stockage.

0

Même si je comprends que vous spécifiez MySQL, si cela est un nouveau projet de développement et il y a une flexibilité sur cette exigence que vous pourriez envisager RRDTool. Il s'agit d'une base de données simple à utiliser (avec de nombreux packages qui permettent l'intégration) pour les données de séries temporelles, en particulier pour les tâches sysadmin telles que décrites.

0

Une ligne par mesure qui a quelque chose comme ces colonnes:

create table measurements (
    id int primary key, 
    servername varchar(64) not null, 
    tstamp timestamp not null, 
    latency int not null 
); 
Questions connexes