97 votes

Meilleur magasin de données pour des milliards de lignes

J'ai besoin d'être en mesure de stocker de petits morceaux de données (environ 50 à 75 octets) pour des milliards d'enregistrements (~3 milliards d'euros/mois pendant un an).

La seule exigence est rapide inserts et rapide des recherches pour tous les enregistrements avec le même GUID et la possibilité d'accéder à la banque de données .net.

Je suis un SQL server gars et je pense que SQL Server peut le faire, mais avec tous les discours sur BigTable, CouchDB, et d'autres les solutions nosql, il sonne de plus en plus comme une alternative à la traditionnelle RDB peut-être mieux, en raison des optimisations pour les requêtes distribuées et mise à l'échelle. J'ai essayé de cassandra et de la .net les bibliothèques ne sont pas actuellement compiler ou sont tous sujets à changement (avec cassandra elle-même).

J'ai regardé dans de nombreux magasins de données nosql disponibles, mais ne peut pas trouver celle qui répond à mes besoins en tant que robuste de production de la plate-forme.

Si vous avez eu pour stocker 36 milliards de petits, à plat des dossiers afin qu'ils soient accessibles depuis .net, ce qui choisiriez-vous et pourquoi?

111voto

Remus Rusanu Points 159382

Le stockage de ~3,5 to de données et l'insertion d'environ 1K/s 24x7, et aussi de l'interrogation, à un taux qui n'est pas spécifié, il est possible avec SQL Server, mais il y a plus de questions:

  • quelles exigences de disponibilité, vous avez pour cela? Une disponibilité de 99,999% ou 95%, est-ce assez?
  • quelle fiabilité exigence que vous avez? Ne manquant un insert vous coûter de $1M?
  • ce recouvrabilité exigence que vous avez? Si vous perdez un jour de données, importe-t-il?
  • quelle cohérence exigence que vous avez? Ne une écriture doivent être garantis pour être visible sur la prochaine lecture?

Si vous avez besoin de toutes ces exigences, je l'ai souligné, la charge que vous proposez va coûter des millions de dollars dans le matériel et les licences sur un système relationnel, tout système, peu importe ce que les gimmicks vous essayez (sharding, partitionnement, etc). Un nosql système, de par leur définition même, de ne pas répondre à toutes ces exigences.

Alors, évidemment, vous avez déjà assoupli certaines de ces exigences. Il y a une belle visual guide de comparaison de la nosql offres basées sur le " pick 2 de 3 le paradigme de au de Guide Visuel pour le NoSQL Systèmes:

nosql comparisson

Après l'OP commentaire de mise à jour

Avec SQL Server, cette e et directe de la mise en œuvre:

  • une seule table en cluster (GUID, temps). Oui, va devenir fragmenté, mais est la fragmentation affecte les lectures anticipées et les lectures anticipées ne sont nécessaires que pour importante analyse de la plage. Puisque vous n'requête pour GUID spécifique et de la plage de dates, la fragmentation ne sera pas question beaucoup. Oui, c'est une des clés à l'échelle, de sorte que les pages non-feuille va avoir une mauvaise clé de la densité. Oui, cela conduira à un mauvais facteur de remplissage. Et oui, le fractionnement des pages peut se produire. En dépit de ces problèmes, étant donné les exigences, est encore la meilleure clé cluster choix.
  • la partition de la table par temps de sorte que vous pouvez mettre en œuvre efficace de suppression des enregistrements expirés, par le biais d'un coulissante automatique de la fenêtre. Augmenter ce avec un index en ligne reconstruction de partition du mois dernier pour éliminer les pauvres facteur de remplissage et de la fragmentation introduit par le GUID de clustering.
  • activer la compression de page. Depuis le cluster groupes clés par le GUID d'abord, tous les enregistrements d'un GUID sera unes à côté des autres, en donnant la compression de page a de bonnes chances pour déployer dictionnaire de compression.
  • vous aurez besoin d'un rapide IO chemin d'accès du fichier journal. Vous êtes intéressé à haut débit, pas sur une faible latence pour un journal pour suivre 1K insertions/sec, donc le décapage est un must.

Le partitionnement de la compression de page et chaque nécessitent une Édition Enterprise de SQL Server, ils ne fonctionnent pas sur l'Édition Standard et les deux sont très important pour répondre aux exigences.

Comme une note de côté, si les enregistrements proviennent d'un front-end Web, les serveurs de la ferme, je mettrais Exprimer sur chaque serveur web et au lieu de l'INSÉRER sur le back-end, j'aurais SEND l'info à l'extrémité arrière, à l'aide d'une connexion locale/transaction sur l'Express co-localisé avec le serveur web. Cela donne un beaucoup beaucoup mieux la disponibilité de l'histoire de la solution.

Donc, c'est comment j'allais le faire en SQL Server. La bonne nouvelle, c'est que les problèmes que vous devrez faire face sont bien compris et que les solutions sont connues. cela ne veut pas forcément dire que c'est mieux que ce que vous pourriez réaliser avec Cassandra, BigTable ou Dynamo. Je vais laisser quelqu'un de plus knowleageable dans les choses non-sql-ish à l'argument de leur cas.

Notez que je n'ai jamais mentionné le modèle de programmation .Net de soutien et de. Honnêtement, je pense qu'ils sont hors de propos dans les déploiements à grande échelle. Ils faire une énorme différence dans le processus de développement, mais une fois déployée, elle n'a pas d'importance à quelle vitesse le développement a été, si l'ORM généraux tue performance :)

17voto

Aaronaught Points 73049

Contrairement à la croyance populaire, le NoSQL n'est pas sur les performances, ou encore l'évolutivité. C'est principalement au sujet de minimiser les soi-disant Objet-Relationnelles, d'adaptation d'impédance, mais aussi horizontale évolutivité vs le plus typique de la verticale de l'évolutivité d'un SGBDR.

Pour la simple exigence de jeûnes inserts et rapide des recherches, presque n'importe quel produit de base de données ne pourra le faire. Si vous souhaitez ajouter des données relationnelles, ou des jointures, ou ont aucun complexe transactionnelle de la logique ou des contraintes que vous avez besoin de mettre en place, alors vous voulez une base de données relationnelle. Pas de NoSQL produit peut comparer.

Si vous avez besoin d'schemaless de données, vous voulez aller avec un document de base de données orientée comme MongoDB ou CouchDB. Le lâche schéma est l'attraction principale de ces; personnellement, j'aime MongoDB et de l'utiliser dans quelques personnalisé des systèmes de reporting. Je trouve qu'il est très utile lorsque les exigences en matière de données sont en constante évolution.

Les autres principaux NoSQL option est distribué Clé-Valeur dans les Magasins comme BigTable ou Cassandra. Ils sont particulièrement utiles si vous souhaitez mettre à l'échelle votre base de données à travers de nombreuses machines de course matériel de base. Ils fonctionnent très bien sur les serveurs aussi, évidemment, mais ne prenez pas avantage de matériel haut de gamme ainsi que SQL Server ou Oracle ou autre base de données conçue à la verticale de mise à l'échelle, et, évidemment, ils ne sont pas relationnelles et ne sont pas bons pour l'application de la normalisation ou de contraintes. Aussi, comme vous l'avez remarqué, .NET support tend à être totalement négligée.

Tous relationnel de la base de données produits prennent en charge le partitionnement limité de la sorte. Ils ne sont pas aussi flexibles que BigTable ou d'autres DKVS systèmes, ils n'ont pas de partition facilement à travers des centaines de serveurs, mais il n'a vraiment pas l'air comme c'est ce que vous cherchez. Ils sont assez bien à la manipulation nombre d'enregistrements dans la des milliards, aussi longtemps que vous index et de normaliser les données correctement, exécutez la base de données sur les puissants du matériel (en particulier les Ssd si vous avez les moyens), et la partition sur 2 ou 3 ou 5 disques physiques si nécessaire.

Si vous répondez aux critères ci-dessus, si vous travaillez dans un environnement d'entreprise et avez de l'argent à dépenser sur le matériel décent et optimisation de bases de données, je collerais avec SQL Server pour l'instant. Si vous pincer pennies et besoin pour exécuter ce sur bas de gamme cloud Amazon EC2 matériel informatique, vous auriez probablement souhaitez opter pour Cassandra ou Voldemort à la place (en supposant que vous pouvez obtenir pour travailler avec .NET).

11voto

Andrew Points 14278

Très peu de personnes travaillent à la multi-milliard de lignes taille de l'ensemble, et la plupart des fois que je vois une demande de ce genre sur un débordement de pile, les données ne sont pas où près de la taille, il est rapporté que.

36 milliards, 3 milliards de dollars par mois, c'est environ 100 millions de dollars par jour, de 4,16 millions de dollars, une heure, ~70k lignes par minute, 1.1 k lignes d'une seconde à entrer dans le système, de manière continue pendant 12 mois, si aucun temps d'arrêt.

Ces chiffres ne sont pas impossibles par une longue marge, j'ai fait de grands systèmes, mais vous voulez vérifier que c'est vraiment les quantités que vous voulez dire - très peu d'applications ont vraiment cette quantité.

En termes de stockage / récupération et de tout un aspect critique vous n'avez pas mentionné, c'est le vieillissement de données les plus anciens - la suppression n'est pas libre.

La normale de la technologie est de regarder à l'est de partitionnement, cependant, la recherche ou l'extraction d'être basés sur GUID seraient le résultat d'une mauvaise performance, en supposant que vous avez pour obtenir tous les correspondants de la valeur dans l'ensemble de la période de 12 mois. Vous pouvez placer un index cluster sur la colonne GUID obtiendrez vos données associées clusterd pour lire / écrire, mais à ceux des quantités et de la vitesse d'insertion, la fragmentation sera beaucoup trop élevée à l'appui, et il va tomber sur le sol.

Je dirais aussi que vous allez avoir besoin d'un très décent budget matériel si c'est une candidature sérieuse avec OLTP type de réponse de la vitesse, qui est par certains approximative devine, en supposant que très peu de frais généraux de l'indexation sage, environ 2,7 to de données.

Dans SQL Server camp, la seule chose que vous voulez regarder, c'est le nouveau parallèle de l'entrepôt de données de l'édition (madison) qui est conçu plus pour la fragmentation des données et de l'exécution en parallèle des requêtes pour fournir une haute vitesse contre les grandes datamarts.

3voto

goranBiljetina Points 51

"J'ai besoin d'être en mesure de stocker de petits morceaux de données (environ 50 à 75 octets) pour des milliards d'enregistrements (~3 milliards d'euros/mois pendant un an).

La seule exigence est rapide inserts et rapide des recherches pour tous les enregistrements avec le même GUID et la possibilité d'accéder à la banque de données .net."

Je peux vous dire par expérience que c'est possible dans SQL Server, parce que je l'ai fait au début de 2009 ... et il est encore en fonctionnement à ce jour et assez rapide.

La table est partitionnée en 256 partitions, gardez à l'esprit, c'était en 2005 de SQL version ... et nous avons fait exactement ce que tu dis, et c'est pour stocker des bits de l'info par le GUID et de récupérer par GUID rapidement.

Quand j'ai quitté nous avons eu autour de 2 à 3 milliards de dossiers, et la récupération des données est encore en assez bon état (1 à 2 secondes si obtenir par le biais de l'INTERFACE utilisateur, ou moins si sur SGBDR), même si la politique de conservation des données est sur le point d'être instancié.

Donc, c'est une longue histoire courte, j'ai pris les 8 char (c'est à dire quelque part dans le moyen-ish) de la chaîne GUID et SHA1 haché et jeté comme de minuscules int (0 à 255) et stockées dans la partition appropriée et utilisés de la même appel de fonction lors de l'obtention des données de retour.

ping-moi si vous avez besoin de plus d'infos...

1voto

Josef Richberg Points 488

Il est un fait inhabituelle qui semble négligé.

"Fondamentalement, après l'insertion 30Mil lignes en une journée, j'ai besoin de récupérer toutes les lignes avec le même GUID (peut-être 20 lignes) et d'être raisonnablement sûr que j'avais tous les ramener"

Nécessitant seulement 20 colonnes, un index non ordonné en clusters sur le GUID fonctionnent très bien. Vous pourriez cluster sur une autre colonne pour les données de la dispersion à travers des partitions.

J'ai une question concernant l'insertion de données: Comment est-il inséré?

  • Est-ce un bulk insert sur un certain calendrier (par minute, par heure, etc)?
  • De quelle source ces données sont obtenues à partir (fichiers plats, OLTP, etc)?

Je pense que ces le besoin d'être répondu pour aider à comprendre une partie de l'équation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X