Question

NoSQL fait référence à des banques de données non relationnelles qui rompent avec l'histoire des bases de données relationnelles et des garanties ACID. open populaires sources magasins de données NoSQL comprennent:

Je voudrais savoir des problèmes spécifiques que vous - le lecteur SO -. A résolu en utilisant des banques de données et ce magasin de données NoSQL vous avez utilisé

Questions:

  • Quels sont les problèmes d'évolutivité avez-vous utilisé les magasins de données NoSQL pour résoudre?
  • Quel magasin de données NoSQL avez-vous utilisé?
  • Qu'est-ce que la base de données avez-vous utilisé avant de passer à un magasin de données NoSQL?

Je suis à la recherche d'expériences de première main, alors s'il vous plaît ne pas répondre à moins que vous ayez cela.

Était-ce utile?

La solution

Je suis passé un petit sous-projet de MySQL à CouchDB, pour être en mesure de gérer la charge. Le résultat était incroyable.

Il y a environ 2 ans, nous avons publié un logiciel libre écrit sur http://www.ubuntuusers.de/ (ce qui est probablement le plus grand site communautaire allemand Linux). Le site est écrit en Python et nous avons ajouté un middleware WSGI qui a pu attraper toutes les exceptions et les envoyer à un autre petit site alimenté par MySQL. Ce petit site a utilisé un hachage pour déterminer différents bogues et stocké le nombre d'occurrences et la dernière occurrence ainsi.

Malheureusement, peu de temps après la sortie, le site retraçage-bûcheron ne répond plus. Nous avons eu quelques problèmes de verrouillage avec la DB de production de notre site principal qui a été levée des exceptions presque toutes les demande, ainsi que plusieurs autres bugs que nous avons pas exploré au cours de la phase de test. Le cluster de serveurs de notre site principal, appelé le retraçage-enregistreur soumettre la page plusieurs fois k par seconde. Et ce fut une manière trop pour le petit serveur qui a accueilli l'enregistreur de retraçage (il était déjà un ancien serveur, qui a été utilisé uniquement à des fins de développement).

A cette époque CouchDB était assez populaire, et donc j'ai décidé de l'essayer et écrire un petit retraçage-enregistreur avec elle. Le nouvel enregistreur ne se composait que d'un seul fichier python, qui a fourni une liste de bug avec le tri et les options de filtrage et soumettre page. Et en arrière-plan, j'ai commencé un processus CouchDB. Le nouveau logiciel a répondu très rapidement à toutes les demandes et nous avons pu voir l'énorme quantité de rapports automatiques de bogues.

Une chose intéressante est que la solution avant, était en cours d'exécution sur un ancien serveur dédié, où le nouveau site basé CouchDB d'autre part n'a été en cours d'exécution sur une instance Xen partagée avec des ressources très limitées. Et je ne l'ai pas encore utilisé la force des magasins les valeurs-clés à l'échelle horizontale. La capacité de CouchDB / Erlang Bureau du Procureur pour gérer les requêtes simultanées sans bloquer quoi que ce soit était déjà suffisant pour répondre aux besoins.

Maintenant, l'enregistreur CouchDB-traceback rapidement écrit est toujours en cours d'exécution et est un moyen utile d'explorer des bugs sur le site principal. Quoi qu'il en soit, environ une fois par mois la base de données devient trop grand et le processus CouchDB est tué. Mais alors, la commande compacte db de CouchDB réduit la taille de plusieurs GBs à certains KBS à nouveau et la base de données est en cours d'exécution à nouveau (peut-être que je devrais envisager d'ajouter un cronjob il ... 0o).

Dans un résumé, CouchDB était sûrement le meilleur choix (ou au moins un meilleur choix que MySQL) pour ce sous-projet et il fait bien son travail.

Autres conseils

Mon projet actuel fait.

Stockage 18.000 objets dans une structure normalisée: 90.000 rangées dans 8 tables différentes. 1 minute pour récupérer et les associer à notre modèle d'objet Java, qui est avec tout correctement indexé etc.

les stocker sous forme de paires clé / valeur en utilisant une représentation de texte léger:. 1 table, 18.000 lignes, 3 secondes pour les récupérer tous et reconstruire les objets Java

En termes d'affaires: première option n'a pas été possible. Deuxième option signifie que nos travaux d'application.

Détails de la technologie: en cours d'exécution sur MySQL pour SQL et NoSQL! Avec MySQL pour coller un bon support des transactions, la performance et ses preuves pour ne pas altérer les données, mise à l'échelle assez bien, le soutien aux clusters, etc.

Notre modèle de données MySQL est maintenant seulement les champs clés (entiers) et le grand champ « valeur »: juste un grand champ TEXTE essentiellement

.

Nous ne sommes pas allés avec l'un des nouveaux joueurs (CouchDB, Cassandra, MongoDB, etc.), car bien qu'ils puissent offrent des caractéristiques / performances dans leur propre droit, il y avait des inconvénients toujours nos circonstances (par exemple manquant / support Java immature ).

Avantage supplémentaire de (ab) en utilisant MySQL -. Les bits de notre modèle ne travail peut être facilement relationnellement liée à nos données de stockage de clés / valeur

Mise à jour: Voici un exemple de la façon dont nous représentions le contenu du texte, pas notre domaine d'activité réelle (nous ne travaillons pas avec des « produits ») comme mon boss'd me tirer dessus, mais donne l'idée, y compris l'aspect récursif (un entité, ici un produit, « contenant » les autres). Si tout va bien, il est clair comment dans une structure normalisée cela pourrait être tout à fait quelques tables, par exemple adhérer à un produit à sa gamme d'arômes, d'autres produits qui sont contenus, etc

Name=An Example Product
Type=CategoryAProduct
Colour=Blue
Size=Large
Flavours={nice,lovely,unpleasant,foul}
Contains=[
Name=Product2
Type=CategoryBProduct
Size=medium
Flavours={yuck}
------
Name=Product3
Type=CategoryCProduct
Size=Small
Flavours={sublime}
]

Todd Hoff highscalability.com a beaucoup d'une grande couverture des NoSQL, y compris des études de cas.

Le Vertica colonnaire SGBD pourrait répondre à vos besoins (même si elle prend en charge SQL): il est très rapide par rapport à DBMSs relationnelles traditionnelles pour les requêtes d'analyse. Voir Stonebraker, et al. article récent CACM contraste Vertica sur la carte -Réduire.

Mise à jour: Et Cassandra sélectionné Twitter sur plusieurs autres, y compris HBase, Voldemort, MongoDB, memcachedb, Redis et HyperTable.

Mise à jour 2: Rick Cattell vient de publier une comparaison de plusieurs systèmes NoSQL dans les magasins de données à haute performance . Et la prise de highscalability.com sur le papier de Rick est .

Nous avons déménagé une partie de nos données de MySQL à MongoDB, non pas tant pour l'évolutivité, mais plus parce qu'il est un meilleur ajustement pour les fichiers et les données non tabulaires.

Dans la production, nous enregistrons actuellement:

  • 25 mille fichiers (60Go)
  • 130 millions d'autres "documents" (350GB)

avec un chiffre d'affaires quotidien d'environ 10 Go.

La base de données est déployé dans une configuration de "apparié" à deux noeuds (6x450GB sas RAID10) avec les clients Apache / wsgi / python en utilisant l'API python mongodb (de pymongo). La configuration du disque est probablement exagéré mais c'est ce que nous utilisons pour MySQL.

En dehors de quelques problèmes avec threadpools de pymongo et la nature blocage du serveur MongoDB il a été une bonne expérience.

Je me excuse pour aller à l'encontre de votre texte en gras, puisque je n'ai pas d'expérience de première main, mais cet ensemble de messages de blog est un bon exemple de la résolution d'un problème avec CouchDB.

CouchDB: Étude de cas

Pour l'essentiel, le TextMe application utilisée CouchDB pour faire face à leur problème de données explose. Ils ont constaté que SQL était trop lent pour traiter de grandes quantités de données d'archives, et déplacèrent vers CouchDB. Il est une excellente lecture, et il traite tout le processus de déterminer quels sont les problèmes CouchDB pourrait résoudre et comment ils ont fini par les résoudre.

Nous avons délocalisé une partie de nos données, nous avons utilisé pour stocker dans Postgresql et Memcached dans Redis . magasins de valeurs-clés sont beaucoup mieux adaptés pour le stockage de données d'objets hiérarchiques. Vous pouvez stocker des données blob beaucoup plus rapidement et avec beaucoup moins de temps de développement et d'efforts que d'utiliser un ORM pour cartographier votre blob à un SGBDR.

Je open source c # Redis client qui vous permet de stocker et de récupérer Les objets POCO avec une ligne:

var customers = redis.Lists["customers"]; //Implements IList<Customer>
customers.Add(new Customer { Name = "Mr Customer" });

magasins de valeur clés sont également beaucoup plus facile de « scale-out » que vous pouvez ajouter un nouveau serveur, puis partitionner votre charge également d'inclure le nouveau serveur. Il est important, il n'y a pas de serveur central qui limitera votre évolutivité. (Bien que vous aurez toujours besoin d'une stratégie cohérente pour le hachage pour distribuer vos demandes).

Je considère Redis comme un « fichier texte géré » sur les stéroïdes qui offre un accès rapide, en même temps atomique et pour plusieurs clients, donc tout ce que je l'habitude d'utiliser un fichier texte ou base de données intégrée car j'utilise maintenant Redis. par exemple. Pour obtenir en temps réel journal des erreurs de roulement combiné pour tous nos services (qui a notoirement été une tâche difficile pour nous), est maintenant accomplie avec seulement quelques lignes par juste avant l'attente de l'erreur à une liste côté serveur Redis puis coupe la liste de sorte que les 1000 dernières sont conservées, par exemple:

var errors = redis.List["combined:errors"];
errors.Insert(0, new Error { Name = ex.GetType().Name, Message = ex.Message, StackTrace = ex.StackTrace});
redis.TrimList(errors, 1000);

Je n'ai pas d'expériences de première main., Mais je trouve cette entrée de blog très intéressant.

Je trouve l'effort de cartographier les objets du domaine des logiciels (par exemple aSalesOrder, acustomer ...) à la base de données relationnelle en deux dimensions (lignes et colonnes) prend beaucoup de code pour enregistrer / mettre à jour, puis de nouveau à instancier une instance d'objet de domaine à partir de plusieurs tables. Sans oublier le succès de la performance d'avoir tous les rejoint, tous les disques se lit ... juste pour voir / manipuler un objet de domaine comme une commande client ou dossier client.

Nous sommes passés à l'objet Base de données des systèmes de gestion (ODBMS). Ils sont au-delà des capacités des systèmes NoSQL énumérés. La pierre précieuse / S (pour Smalltalk) est un tel exemple. Il existe d'autres solutions ODBMS qui ont des pilotes pour de nombreuses langues. Un avantage clé de développeur, votre hiérarchie de classe est automatiquement votre schéma de base de données, et tous les sous-classes. Il suffit d'utiliser votre langage orienté objet pour faire des objets persistants à la base de données. Les systèmes ODBMS fournissent une intégrité des transactions de niveau d'acide, il fonctionne également dans les systèmes financiers.

Je suis passé de MySQL (InnoDB) à cassandra pour un système M2M, qui stocke essentiellement des séries chronologiques de capteurs pour chaque appareil. Chaque donnée est indexé par (device_id, date) et (device_id, type_of_sensor, date). La version MySQL contenait 20 millions de lignes.

MySQL:

  • Configuration de synchronisation maître-maître. Peu problème est apparu autour de perte de synchronisation . Il était stressant et surtout au début pourrait prendre des heures à corriger.
  • Temps d'insertion n'a pas été un problème, mais interrogation nécessaire de plus en plus de mémoire que les données ont augmenté. Le problème est que les indices sont considérés dans leur ensemble. Dans mon cas, je ne faisais que l'aide d'une des parties très minces des indices qui ont été nécessaires pour charger en mémoire (seulement quelques pour cent des appareils étaient souvent surveillés et il était sur les données les plus récentes).
  • Il était difficile à sauvegarder . Rsync ne peut pas faire des sauvegardes rapides sur les grands fichiers de table InnoDB.
  • Il est rapidement apparu que n'a pas été possible de mettre à jour le schéma de lourdes tables , parce qu'il a fallu trop de temps (heures).
  • Importer des données a pris des heures (même lors de l'indexation a été fait à la fin). Le meilleur plan de sauvetage a été de toujours garder quelques copies de la base de données (fichier de données + logs).
  • Déplacement d'une société d'hébergement à un autre était vraiment un gros problème . La réplication doit être traitée avec beaucoup d'attention.

Cassandra:

  • Encore plus facile à installer que MySQL.
  • nécessite beaucoup de RAM. Une instance de 2 Go ne pouvait le faire fonctionner dans les premières versions, maintenant il peut fonctionner sur une instance de 1 Go, mais ce n'est pas idée (beaucoup trop de données) Bouffées. Lui conférant 8 Go était assez dans notre cas.
  • Une fois que vous comprenez comment vous organisez vos données, le stockage est facile. Demande est un peu plus complexe. Mais une fois que vous obtenez autour d'elle, il est très rapide (vous ne pouvez pas vraiment faire erreur, sauf si vous voulez vraiment).
  • Si l'étape précédente a été bien fait, il est et reste ultra-rapide.
  • Il semble presque comme les données sont organisées à Backupées. Chaque nouvelles données sont ajoutées en tant que nouveaux fichiers. Personnellement, je, mais ce n'est pas une bonne chose, vider les données tous les soirs et avant chaque arrêt (généralement mise à niveau) afin que la restauration prend moins de temps, parce que nous avons moins à lire les journaux. Il ne crée pas les fichiers beaucoup sont-ils sont compactés.
  • Importation de données est rapide comme l'enfer. Et plus les hôtes vous ont le plus rapide. Exportation et importation gigaoctets de données ne sont pas un problème.
  • Ne pas avoir un schéma est une chose très intéressante parce que vous pouvez vous faire suivre les données évoluez vos besoins. Ce qui pourrait vouloir dire avoir différentes versions de vos données en même temps sur la même famille de la colonne.
  • Ajout d'un hôte était facile (pas vite cependant), mais je n'ai pas fait sur une configuration multi-centre de données.

Note: J'ai aussi utilisé ElasticSearch (document orienté basé sur Lucene) et je pense qu'il devrait être considéré comme en tant que base de données NoSQL. Il est distribué, fiable et souvent rapide (certaines requêtes complexes peuvent effectuer très mal).

Je ne sais pas. Je voudrais utiliser un simple et un magasin sans valeur clé que je peux appeler dans le processus, mais une telle chose n'existe pas sur la plate-forme afaik de Windows. Maintenant, j'utiliser SQLite mais je voudrais utiliser quelque chose comme Tokyo Cabinet. BerkeleyDB a permis des « problèmes ».

Toutefois, si vous souhaitez utiliser les systèmes d'exploitation Windows votre choix de bases de données NoSQL est limitée. Et il n'y a pas toujours un fournisseur C #

J'ai essayé MongoDB et il était 40 fois plus rapide que SQLite, alors peut-être que je devrais l'utiliser. Mais je l'espère encore pour une simple solution de traitement.

je redis pour stocker la journalisation des messages à travers des machines. Il était très facile à mettre en œuvre, et très utile. Redis roches vraiment

Nous avons remplacé une base de données postgres avec une base de données de documents CouchDB, car ne pas avoir un schéma fixe était un fort avantage pour nous. Chaque document a un nombre variable d'indices utilisés pour accéder à ce document.

Je l'ai utilisé Couchbase dans le passé et nous avons rencontré des problèmes de rééquilibrage et foule d'autres questions. Actuellement, je suis en utilisant Redis dans plusieurs projets de production. J'utilise redislabs.com qui est un service géré pour Redis qui prend soin de mise à l'échelle vos clusters Redis. J'ai publié http://thomasjaeger.wordpress.com une vidéo sur la persistance des objets sur mon blog qui montre comment d'utiliser Redis dans un modèle de fournisseur et comment stocker vos objets C # en Redis. Jetez un coup d'oeil.

J'encourage toute personne lisant cela pour essayer Couchbase une fois de plus maintenant que 3.0 est la porte. Il y a plus de 200 fonctionnalités nouvelles pour commencer. Les performances, la disponibilité, l'évolutivité et les fonctions de gestion facile de Couchbase Server permet une base de données extrêmement flexible, hautement disponible. L'interface de gestion est intégré et les API découvrir automatiquement les nœuds du cluster donc il n'y a pas besoin d'un équilibreur de charge de l'application à la DB. Bien que nous ne disposons d'un service géré à ce moment vous pouvez exécuter Couchbase sur des choses comme AWS, Gears RedHat, Cloudera, Rackspace, Docker conteneurs comme Cloudsoft, et bien plus encore. En ce qui concerne le rééquilibrage dépend de ce que précisément vous faites allusion, mais Couchbase ne ne rééquilibrera pas automatiquement après une défaillance d'un nœud, comme prévu, mais un administrateur peut basculement automatique de configuration pour la première défaillance d'un noeud et en utilisant nos API, vous pouvez également accéder à la réplique vbuckets pour la lecture avant de les activer ou en utilisant l'RestAPI vous pouvez appliquer un basculement par un outil de surveillance. Ceci est un cas particulier, mais on peut faire.

Nous avons tendance à ne pas rééquilibrer dans à peu près tous les modes, sauf si le nœud est complètement déconnecté et ne jamais revenir ou un nouveau nœud est prêt à être mis en balance automatiquement. Voici quelques guides pour aider toute personne intéressée à voir ce que l'une des bases de données les plus NoSQL hautement performant est tout au sujet.

  1. Couchbase Server 3.0
  2. Guide d'administration
  3. API REST
  4. Guides de développement

Enfin, je vous encourage à consulter N1QL pour effectuer des requêtes distribués:

  1. N1QL Tutorial
  2. Guide N1QL

Merci pour la lecture et laissez-moi ou d'autres savoir si vous avez besoin d'aide!

Austin

Je l'ai utilisé Vertica dans la past.It repose sur la compression et colonnaire disque lit et accélère réduit le stockage doit tirer le meilleur parti de votre matériel. Chargement plus rapide des données et vous permet de plus concurrency servent des données d'analyse à plus d'utilisateurs avec une latence minimale.

Un peu plus tôt, nous avons été Interrogation base de données Oracle ayant des milliards d'enregistrements et de la performance a été très sous-optimale. Les requêtes ont été 8 à 12 ans à courir, même après l'optimisation des SSD. Par conséquent, nous avons ressenti le besoin d'utiliser une lecture optimisée, base de données d'analyse orientée plus rapide. Avec Vertica Clusters derrière la couche de service maigre, nous pourrions exécuter des API avec des performances sous-secondes.

Vertica stocke les données dans les projections dans un format qui permet d'optimiser l'exécution de la requête. Semblable à des vues matérialisées, les projections des jeux de résultats magasin sur le disque ou SSD plutôt que de les calculer à chaque fois qu'ils sont utilisés dans un query.Projections présente les avantages suivants:

  1. Compresser et encoder des données pour réduire l'espace de stockage.
  2. simplifier la distribution à travers le cluster de bases de données.
  3. Fournir une haute disponibilité et la récupération.

Vertica optimise la base de données en distribuant des données à travers cluster en utilisant Segmentation.

  1. Segmentation place une partie des données sur un noeud.
  2. Il distribue également des données sur tous les nœuds. Ainsi, chaque noeud effectue un élément du processus d'interrogation.
  3. La requête est exécutée sur le cluster et chaque nœud reçoit la requête plan.
  4. Les résultats des requêtes sont regroupées et utilisées pour créer la sortie.

Pour en savoir plus, s'il vous plaît se référer à la documentation Vertica @ https://www.vertica.com/knowledgebase/

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