Question

Je suis à la recherche dans NoSQL mise à l'échelle des alternatives à une base de données. Que dois-je faire si je veux que les choses basées sur les transactions qui sont sensibles à ce genre de choses?

Était-ce utile?

La solution

D'une manière générale, les solutions NoSQL ont la sémantique transactionnelle de poids plus léger que les bases de données relationnelles, mais encore des installations pour les opérations atomiques à un certain niveau.

En général, ceux qui font la réplication maître-maître fournissent moins de la manière de cohérence et une plus grande disponibilité. Donc, il faut choisir le bon outil pour le bon problème.

De nombreuses transactions d'offre au niveau document unique (ou une ligne, etc.). Par exemple avec MongoDB il est atomicité au document unique - mais les documents peut être assez riche pour que cela fonctionne généralement assez bien - plus d'info ici .

Autres conseils

Ceci est le plus proche réponse que je trouve qui s'appliquerait à toute base de données NoSQL. Il est sur un billet de blog 2007 d'Adam Wiggins de Heroku.com:

  

L'ancien exemple d'utiliser une base de données de transaction pour envelopper le transfert d'argent d'un compte bancaire à un autre est taureau totale. La bonne solution est de stocker une liste des événements du grand livre (transferts entre comptes) et de montrer l'équilibre actuel comme somme du grand livre. Si vous programmez dans un langage fonctionnel (ou penser de cette façon), cela est évident.

De: http://adam.heroku.com/past/2007 / 12/17 / a_world_without_sql / (Son site est idéal pour des idées sur l'évolutivité.)

J'interprété au paragraphe ci-dessus:

  1. Créer une base de données pour les comptes membres.
  2. Créer une file d'attente de messagerie. Pseudo ce "grand livre".
  3. Ajoutez les travailleurs de remplir chaque fond de demande dans la file d'attente.

Plus d'infos. les files d'attente / travailleurs de fond: http://adam.heroku.com/past/ 2009/4/14 / building_a_queuebacked_feed_reader_part_1 /

Le client (aka membre ou client) suit ces étapes pour retirer de l'argent:

  1. Déposer une demande de prendre l'argent.
  2. demande est envoyée au serveur.
  3. Serveur, il place dans une file d'attente. Le message est: "Retirez 5 000 $"
  4. Client est indiqué: "S'il vous plaît attendre que la demande est remplie ..."
  5. machines clientes serveur sondages toutes les 2 secondes demandant, « a la demande sont remplies? »
  6. Sur le serveur, les travailleurs de base sont répondre à des demandes antérieures d'autres membres en premier dans / premier sorti de la mode. Finalement, ils arrivent à la demande de votre client de prendre l'argent.
  7. Une fois que la demande a été remplie, le client reçoit un message avec leur nouvel équilibre.

Vous pouvez utiliser Heroku.com pour créer une petite maquette rapidement si vous êtes à l'aise avec Node.js ou Ruby / Rack.

L'idée générale semble assez facile et beaucoup mieux que d'utiliser les transactions cuites au four dans la base de données qui le rendent super-dur à l'échelle.

Disclaimer: Je ne l'ai pas mis en œuvre ce en aucune manière encore. Je lis ces choses pour la curiosité, même si je n'ai pas besoin pratique pour eux. Oui, @gbn est juste qu'un SGBDR avec des transactions serait probablement suffisante pour les besoins de Timmy et moi. , Il serait néanmoins amusant de voir jusqu'où vous pouvez prendre des bases de données NoSQL avec des outils open-source et un how-to site Web appelé " Une tornade de Razorblades ".

NoSQL couvre un ensemble diversifié d'outils et de services, y compris la clé-forte valeur, le document , magasins de graphique et de grande colonne. Ils tentent généralement d'améliorer l'évolutivité du stockage de données, généralement en distribuant le traitement des données. Les transactions exigent propriétés ACID de la façon dont BDs effectuer des opérations de l'utilisateur. ACID limite comment l'évolutivité peut être améliorée: la plupart des outils NoSQL assouplir les critères de cohérence des operatioins pour obtenir la tolérance aux pannes et la disponibilité de mise à l'échelle, ce qui rend la mise en œuvre des transactions ACID très dur.

A communément cité le raisonnement théorique des magasins de données distribuées est théorème de CAP : la cohérence, la disponibilité et la tolérance de partition ne peut pas être réalisée en même temps. outils SQL, NoSQL et newsql peuvent être classés en fonction de ce qu'ils abandonnent; un bon chiffre pourrait être trouvé .

A nouveau, plus faible ensemble d'exigences en remplaçant l'acide est BASE ( "essentiellement avalilable, doux état, cohérence éventuelle »). Cependant, éventuellement des outils cohérents ( « éventuellement tous les accès à un élément retourne la dernière valeur mise à jour ») ne sont guère acceptables dans les applications transactionnelles, comme la banque. Voici une bonne idée serait d'utiliser en mémoire, en colonnes et distribué des bases de données SQL / acide, par exemple VoltDB ; Je suggère à la recherche de ces solutions "newsql".

Je voulais juste faire des commentaires aux conseils des transactions d'argent sur ce fil. Les transactions sont quelque chose que vous voulez vraiment utiliser avec les transferts d'argent.

L'exemple comment faire què les transferts est très agréable et bien rangé.

Mais dans la vie réelle transférer de l'argent peuvent inclure des frais ou des paiements à d'autres comptes. Les gens bonus pour l'utilisation de certaines cartes qui viennent d'un autre compte ou ils peuvent obtenir les frais prélevés sur leur compte à un autre dans le même système. Les frais ou les paiements peuvent varier selon les transactions financières et vous pourriez avoir besoin de maintenir le système de comptabilité qui montre crédit et de débit de chaque transaction comme il vient.

Cela signifie que vous souhaitez mettre à jour plus d'une ligne en même temps puisque le crédit d'un compte peut être débiteur sur un ou plusieurs comptes. D'abord, vous verrouillez les lignes afin que rien ne peut changer avant la mise à jour vous assurer que les données écrites est compatible avec la transaction.

C'est pourquoi vous voulez vraiment utiliser des transactions. Si quelque chose va mal écrit à une ligne vous pouvez rollback tas de mises à jour sans que les données sur les transactions financières se terminant incompatibles.

Le problème avec une transaction et deux opérations (par exemple, un 5 000 $ paient, deuxième recevra 5 000 $) - est que vous avez deux comptes avec la même priorité. Vous ne pouvez pas utiliser un compte pour confirmer la deuxième (ou dans l'ordre inverse). Dans ce cas, vous pouvez garantir qu'un seul compte sera correct (ce qui est confirmé), deuxième (que confirmer) peut avoir échoue. Voyons pourquoi il peut échoue (à l'aide aproatch de message, l'expéditeur est confirmé par le récepteur):

  1. Ecrire + 5 000 $ au récepteur compte
  2. Si le succès - écriture - 5 000 $ au compte de l'expéditeur
  3. En cas d'échec - essayez againt ou annuler ou afficher un message

Il garantie pour économiser # 1. Mais qui garantie si # 2 échoue? Idem pour l'ordre inverse.

Mais cela est possible d'en œuvre pour être sûr sans les transactions et NoSQL. Vous êtes toujours autorisé l'utilisation troisième entité qui sera confirmé par l'expéditeur et destinataire et garantir votre opération a été effectuée:

  1. Génération numéro de transaction unique et la création d'une entité de transaction
  2. Ecrire + 5 000 $ au récepteur compte (en référence à l'ID de transaction)
  3. Si le succès - Etat jeu de transaction pour envoyer
  4. Ecrire - 5 000 $ à sedned compte de compte (en référence à l'ID de transaction)
  5. Si le succès - Etat ensemble de transaction pour recevoir

Cet enregistrement de transaction de garantie qui était ok pour envoyer / recevoir des massages. Maintenant, vous pouvez vérifier tous les messages par numéro de transaction et si elle a l'état ou reçu complété - vous le prendre en compte pour l'équilibre de l'utilisateur.

dépend de votre DB, mais ... je dirais en général, vous pouvez utiliser 'opérations Optimiste « pour y parvenir, mais j'imagine que l'on doit faire en sorte de comprendre la mise en œuvre de la base de données atomicité garanties (par exemple, quel type d'écriture et de lecture des opérations sont atomiques).

Il semble y avoir des discussions sur le net sur le HBase transactions, si c'est une aide.

Vous pouvez toujours utiliser une approche NoSQL dans une base de données SQL. NoSQL semble généralement utiliser « données clé / valeur stocke »: vous pouvez toujours mettre en œuvre dans vos SGBDR préférés et donc garder les bonnes choses comme les transactions, les propriétés ACID, le soutien de votre amicale DBA, etc, tout en réalisant les avantages de performance et de flexibilité NoSQL , par exemple par l'intermédiaire d'une table telle que

CREATE TABLE MY_KEY_VALUE_DATA
(
    id_content INTEGER PRIMARY KEY,
    b_content  BLOB
);

Bonus est que vous pouvez ajouter des champs supplémentaires ici pour lier votre contenu à d'autres, bien des tables relationnelles, tout en gardant votre contenu volumineux dans le blob principal (ou TEXT apt) champ.

Personnellement, je suis favorable à une représentation de texte de sorte que vous n'êtes pas lié dans une langue pour travailler avec les données, par exemple en utilisant Java sérialisé signifie que vous pouvez accéder au contenu de Perl pour les rapports, par exemple. TEXT est également plus facile à déboguer et travaillent généralement avec en tant que développeur.

un coup d'oeil à scalaris est un pas db sql avec une forte cohérence et les transactions mises en œuvre.

Voilà pourquoi je suis en train de créer une solution de stockage de documents NoSQL pour être en mesure d'utiliser des transactions « réelles » sur les applications d'entreprise avec la puissance de l'approche de données non structurées. Jetez un oeil à http://djondb.com et vous pouvez ajouter une fonctionnalité que vous jugerez utiles.

il y a sûrement d'autres

Vous pouvez mettre en œuvre les transactions optimistes sur le dessus de la solution NoSQL si elle prend en charge les comparer et-ensemble. J'ai écrit un exemple et une explication sur une page de GitHub comment le faire dans MongoDB, mais vous pouvez répéter dans une solution NoSQL appropriée.

scroll top