2013-06-15 5 views
3

Je travaille sur une application qui a besoin essentiellement pour stocker un Map<String,Set<String>> (bien, il est beaucoup plus compliqué que cela, mais qui est l'idée de base) et je prévois de faire beaucoup deQuand le projet InconsistencyResolver de Project Voldemort est-il lancé?

Set<String> strings = storeClient.get("some key"); 
strings.add("some string"); 
storeClient.put("some key", strings); 

Alors ce que je J'essaie de comprendre est quand StoreClient#put créerait une incohérence qui serait résolue par InconsistencyResolver et quand StoreClient#put juste clobber la valeur?

Répondre

2

Clause de non-responsabilité: Je n'ai pas utilisé Voldemort depuis longtemps et je travaille maintenant chez Basho sur Riak. Cela dit, je pense que ce serait une question facile à répondre avec des citations, mais le manque de documentation réelle (et la difficulté d'encadrer les recherches google de rendre des choses sur Harry Potter) présente en fait un véritable défi - vous posez une très bonne question. Je crois que le ci-dessous est correct. Puisque vous parlez de la version de put() où vous n'envoyez pas de version (horloge vectorielle) et que vous ne vous souciez pas de ce qui se trouve actuellement dans la base de données ... elle va simplement écraser quoi que ce soit (si quelque chose) est là. Avec leur architecture, ils ont le concept d'un nœud maître (coordinating) pour une clé donnée (hashed) où ils écrivent toujours en premier avant de se répliquer aux autres nœuds de l'anneau, ce qui leur permet d'écraser/purger toute version précédente d'un valeur. Je suppose qu'ils font cette comparaison en tant que CAS ou autrement protégé (via des verrous) pour éviter tout problème de concurrence. Lorsque vous utilisez un backend BerkeleyDB, il est très probable qu'ils utilisent simplement ses mécanismes intégrés de transaction/verrouillage. Étant donné cela, vous devriez rarement rencontrer des valeurs/versions conflictuelles où le client a besoin de les résoudre.

Cependant, selon this post from Jay Kreps il déclare:

... simultanées versions se produisent lorsque différents clients (ou routeurs) sont en désaccord sur demande si oui ou non un serveur particulier est disponible. Dans le cas commun cela ne se produira pas - chaque clé a un serveur maître et nous écrivons toujours à ce serveur en premier, ce qui nous permet de recueillir immédiatement toutes les anciennes versions. Cependant dans le cas où un auteur croit que le maître est en panne et qu'un autre croit qu'il est en place, il est possible que ces deux serveurs acceptent les écritures en conflit. Il est nécessaire que le moteur de stockage ait la capacité de conserver ces deux versions jusqu'à ce qu'un client puisse les résoudre.

C'est là que InconsistencyResolver entre en jeu.

Lorsque vous utilisez la version de put() où vous envoyez également la version d'un get précédent, le serveur (maître) retourne un indicateur que la version est obsolète et le client va lancer un ObsoleteVersionException. Encore une fois cependant, dans le cas de nœuds échoués/récupérés ... il est possibles que les versions concurrentes pourraient être dans le cluster et seul le client peut les résoudre via le InconsistencyResolver.

+0

Merci! Très bonne réponse! Donc, il semble que la façon de faire ce que je veux faire est d'utiliser http://www.project-voldemort.com/voldemort/javadoc/all/voldemort/client/StoreClient.html#applyUpdate%28voldemort.client.UpdateAction% 29 qui continuera à essayer d'appliquer la mise à jour jusqu'à ce qu'il n'échoue pas. –

Questions connexes