Beaucoup de truc pour c'est de trouver vos besoins exacts et à vous le son reste assez vague. Avez-vous juste besoin de soutenir des opérations comme celle-ci?
- Mise à jour clé K à la valeur V.
- rechercher une valeur quelque peu récente de la clé K.
Vous avez mentionné que vous avez besoin de cohérence éventuelle. Donc, si vous faites une seule mise à jour, elle finira par se répliquer partout. Si vous faites deux mises à jour presque simultanées, vous souciez-vous du gagnant? Si une réplique signale qu'une mise à jour a été effectuée avec succès, est-ce que cela vous dérange si la valeur risque d'être perdue si cette réplique venait à se bloquer temporairement peu de temps après? Ou si cette réplique a été définitivement détruite?
Quelle précision devrait être un peu récent? S'il y a un netsplit ou quelque chose, une recherche peut renvoyer un résultat très périmé ou simplement échouer. Est-ce que tu t'en soucies?
Avez-vous besoin de plus pour soutenir les opérations colombophile comme ...
- Obtenez la dernière valeur absolue de la clé K?
- Mettre à jour la valeur de la clé K à la valeur V 'à condition que la dernière valeur soit actuellement V?
Avez-vous des exigences de fiabilité, de latence et/ou de bande passante rigides? À quelle distance sont vos répliques/comment le réseau est-il bon? Cela a un impact si vous pouvez avoir une communication inter-réplique à chaque mise à jour et même à chaque recherche; ou même si vous pouvez/devez basculer les opérations vers une réplique distante si la réplique locale semble être en panne. Selon vos réponses ici, j'ai travaillé avec un couple de régimes différents qui pourraient répondre à vos besoins. Il y a plusieurs variations possibles sur eux.
- La chose la plus simple est de faire en sorte que l'application communique toujours avec la réplique locale. Réplique les valeurs d'horodatage (en utilisant des horloges synchronisées NTP) et ne se parle que pour la réplication asynchrone. Le plus haut horodatage gagne en réplication. Bien sûr, si des applications sur deux répliques différentes font chacune une lecture/modification/écriture près simultanément, l'une des modifications peut facilement être perdue. (En fait, sans schéma de mise à jour conditionnelle, la même chose est vraie pour les modifications quasi simultanées sur la même réplique.) Si une réplique échoue de façon permanente, les mises à jour récentes peuvent être perdues. C'est plus ou moins ce que fait la réplication intégrée de Bigtable. Dans le document que vous avez lié, il s'agirait de la branche «Optimistic - Multimaster», mais ne pas trop se soucier de perdre certaines mises à jour le rend plus simple que ce qu'elles suggèrent.
- Certaines bases de données utilisent l'algorithme Paxos (voir par exemple «Gestion des données pour Internet Single-Sign-On here») pour rendre les choses plus simples possible. Une valeur qui ne dépasse pas 1 minute »ou« donnez-moi la dernière valeur absolue ». Une mise à jour n'est considérée comme terminée que si un quorum de réplicas l'a acceptée, donc« donnez-moi la dernière valeur absolue » Vous pouvez effectuer l'opération de mise à jour conditionnelle que j'ai mentionnée pour empêcher les écrivains simultanés de se piétiner mutuellement, ce qui ne semble pas correspondre parfaitement à la catégorie optimiste ou pessimiste définie par cet auteur, car les mises à jour sont répliquées de manière synchrone. un quorum, mais les répliques qui n'ont pas voté lors de la dernière ronde Paxos peuvent toujours être en mesure de répondre à certaines questions. compliqué, cependant ...