2012-01-30 1 views
1

Je suis actuellement aux prises avec le bon format de données à utiliser avec Cassandra. Je suppose que cela est dû à la profondeur supplémentaire qu'il offre par rapport aux stockages de valeurs-clés standard.Stockage de données dans Cassandra

Mon format de données est actuellement défini comme ceci:

  • Keyspaces pour différentes applications.
  • Familles de colonnes pour différentes parties d'application.
  • Dans ces familles de colonnes, j'ai les données.

La plupart des données sont stockées dans une seule colonne de famille dans le format:

Key: UUID-1|UUID-2|UUID-3 
Value: Array of PHP Values 

Après avoir inséré plusieurs 100.000 entrées (< 1kb chacun) Je vois une dégradation des performances lors de la lecture des données. D'après ce que j'ai compris, les familles de colonnes devraient être exactement où stocker la partie principale de mes données. Avoir la plupart de mes données dans une seule famille de colonnes au lieu de plusieurs différentes ne devrait pas être le point.

Dois-je envisager de fractionner mes données dans différentes familles de colonnes ou est-ce que l'approche est correcte, mais quelque chose d'autre pourrait être la cause du problème?


Modifier pour répondre aux questions de l'ADN dans le commentaire:

Je compare le temps de lecture nécessaire pour une seule touche, je l'ai inséré avant de commencer mes tests.

La clé de test a toujours lu < 0,0010s pendant plus de 1000 fois au début tant que la base de données est vide. Les données écrites dans les essais est structuré comme celui-ci:

  • Une ligne identifiée par un haut clé avec 5 caractères + 20 numéros
  • avec une colonne (1 Personnage) contenant l'horodatage unix courant

J'ai ajouté des entrées et réexécuté le même test de lecture pour comparer les temps de lecture. Les temps de lecture, je suis la liste ici sont les chiffres inférieurs:

Entries | Read Time 
     0 | 0.0010 
    150.000 | 0.0013 
    300.000 | 0.0014 
    500.000 | 0.0016 
    750.000 | 0.0019 
1.000.000 | 0.0022 

Parce que c'est uniquement pour les tests de base, c'est exécuté uniquement sur un seul nœud (instance EC2) sur Amazon. Le temps de lecture semble augmenter d'environ 0,0003s pour chaque 250 000 nouvelles lignes. Je sais que ce sont vraiment de petits nombres et ils sont géniaux, mais la croissance linéaire du temps de lecture n'est pas ce à quoi je m'attendais.

Je prévois de déplacer un grand serveur MySQL avec un grand nombre de petites entrées à Cassandra. Il contient actuellement environ 75 milliards d'entrées et la quantité de nouveaux ensembles de données qu'il collecte est vraiment rapide, une augmentation linéaire du temps de lecture me fait donc me demander si je vais dans la bonne direction.

+0

Quelles performances voyez-vous et quelles performances espérez-vous? Que vous utilisiez un CF ou plusieurs CF dépend généralement de la structure des données que vous stockez et des types de requêtes dont vous avez besoin. Pouvez-vous donner plus de détails sur la structure de vos données, et les types de requête de lecture que vous faites? Quelle version de Cassandra utilisez-vous, sur quel matériel? – DNA

+0

@DNA: Le tableau de valeurs PHP que je sauvegarde contient des chaînes (environ 10-20, chacune avec une longueur de 10-500). J'ai également édité ma question pour (j'espère) mieux expliquer pourquoi je pose la question et d'où viennent mes «soucis». Je travaille avec la version 0.7.6-2 dans mon environnement de test. – favo

Répondre

2

Merci de mettre à jour la question.

Vous devriez probablement lire cet article sur le Netflix benchmarking. L'analyse comparative avec un nombre relativement faible de lignes ne vous dira rien de l'évolutivité pour les grands ensembles de données. Il n'est pas difficile d'exécuter ce type de test sur plusieurs millions de lignes.

Si vous testez simplement pour le moment, vous devriez probablement passer à la branche 1.0 (actuellement 1.0.7) car elle est nettement plus rapide que 0.7.

Les performances sur les serveurs cloud peuvent ne pas être très représentatives des performances sur du matériel local réel - bien que les serveurs cloud soient une excellente idée pour tester les clusters. Si la latence en lecture est votre principale préoccupation, assurez-vous de connaître les paramètres de cache de Cassandra (keys_cached et rows_cached), par exemple http://wiki.apache.org/cassandra/StorageConfiguration.

+1

Merci pour l'article Netflix. J'ai laissé tomber beaucoup plus de données dans la base de données et les données ne semblent plus augmenter après le million d'entrées. Avec environ 100.000 millions d'entrées, le temps de lecture restait autour de 0.002s. Plus tard aujourd'hui, je suis passé à la dernière version de Cassandra et j'ai relancé les tests. Le temps de lecture était quelque part rester le même quelque part autour de ~ 0.0016. L'augmentation linéaire semble simplement s'arrêter après avoir atteint une «bonne taille» de données. – favo

Questions connexes