Bien que j'essaie de comprendre la "disponibilité" (A) et la "tolérance de partition" (P) dans CAP, j'ai eu du mal à comprendre les explications de divers articles.
J'ai le sentiment que A et P peuvent aller ensemble (je sais que ce n'est pas le cas et c'est pourquoi je ne comprends pas!).
Expliquant en termes simples, que sont A et P et la différence entre eux?
La cohérence signifie que les données sont les mêmes sur l'ensemble du cluster. Vous pouvez donc lire ou écrire de/vers n'importe quel nœud et obtenir les mêmes données.
La disponibilité signifie la possibilité d'accéder au cluster même si un nœud du cluster tombe en panne.
La tolérance de partition signifie que le cluster continue à fonctionner même s'il existe une "partition" (coupure de communication) entre deux nœuds (les deux nœuds sont actifs mais ne peuvent pas communiquer).
Pour obtenir à la fois la disponibilité et la tolérance de partition, vous devez abandonner la cohérence. Considérez si vous avez deux nœuds, X et Y, dans une configuration maître-maître. Il existe maintenant une rupture entre la communication réseau entre X et Y, de sorte qu'ils ne peuvent pas synchroniser les mises à jour. À ce stade, vous pouvez soit:
A) Laisser les nœuds se désynchroniser (en abandonnant la cohérence), ou
B) Considérez le cluster comme étant "en panne" (abandon de la disponibilité)
Toutes les combinaisons disponibles sont:
Notez que les systèmes de CA n'existent pratiquement pas (même si certains systèmes le prétendent).
Considérer P en termes égaux avec C et A est un peu une erreur, plutôt que la notion de "2 sur 3" parmi C, A, P est trompeuse. La manière la plus succincte d’expliquer le théorème CAP est la suivante: "Dans un magasin de données réparti, au moment de la partition réseau, vous devez choisir la cohérence ou la disponibilité et ne pouvez pas obtenir les deux". Les systèmes NoSQL plus récents tentent de se concentrer sur la disponibilité, alors que les bases de données ACID traditionnelles étaient davantage axées sur la cohérence.
Vous ne pouvez vraiment pas choisir CA, la partition réseau n'est pas quelque chose que quelqu'un voudrait avoir, c'est simplement la réalité indésirable d'un système distribué, les réseaux peuvent échouer. La question est quel compromis choisissez-vous pour votre application lorsque cela se produit. Cet article de l'homme qui a formulé ce terme pour la première fois semble expliquer cela très clairement.
Voici comment je parle de la PAC, en particulier de P.
L'AC n'est possible que si vous êtes d'accord avec une base de données monolithique à serveur unique (peut-être avec la réplication mais toutes les données d'un "bloc d'échec" - les serveurs ne sont pas considérés comme partiellement en panne).
Si votre problème nécessite une montée en puissance, une distribution distribuée et plusieurs serveurs, des partitions réseau peuvent se produire. Vous avez déjà besoin de P. Peu de problèmes que j'aborde sont sujets à des paradigmes à serveur unique toujours (ou, comme Stonebraker l'a dit, "distribué est un enjeu de table"). Si vous pouvez trouver un problème d'autorité de certification, des solutions comme un SGBDR classique non évolutif offrent de nombreux avantages.
Pour moi, rare: nous passons donc à la discussion AP vs CP.
Vous ne choisissez entre les opérations AP et CP que lorsque vous avez une partition. Si le réseau et le matériel fonctionnent correctement, vous obtenez votre gâteau et vous le mangez aussi.
Discutons de la distinction AP/CP.
AP - lorsqu'il existe une partition réseau, laissez les parties indépendantes fonctionner librement.
CP - lorsqu'il existe une partition réseau, arrêtez les nœuds ou interdisez les lectures et les écritures afin d'éviter les pannes déterministes.
J'aime les architectures qui peuvent faire les deux, parce que certains problèmes sont AP et d'autres sont CP - et que certaines bases de données peuvent faire les deux. Parmi les solutions CP et AP, il existe également des subtilités.
Par exemple, dans un ensemble de données AP, vous avez la possibilité à la fois de lectures incohérentes et de générer des conflits d'écriture - il s'agit de deux modes AP possibles différents. Votre système peut-il être configuré pour des points d'accès avec une disponibilité de lecture élevée, mais interdit les conflits d'écriture? Ou bien votre système AP peut-il accepter les conflits d’écriture, avec un système de résolution puissant et flexible? Aurez-vous besoin des deux à la fin, ou pouvez-vous choisir un système qui n'en a qu'un?
Dans un système CP, combien d’indisponibilité obtenez-vous avec de petites partitions (serveur unique), le cas échéant? Une réplication plus importante peut augmenter l'indisponibilité dans un système de PC, comment le système gère-t-il ces compromis?
Ce sont toutes des questions à poser avec CP vs AP.
La publication "12 ans plus tard" de Brewer est une excellente lecture dans ce domaine. Je pense que cela fait avancer le débat de la PAC avec clarté et le recommande vivement.
http://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed
Il est garanti qu'une lecture renvoie l'écriture la plus récente (comme ACID) pour un client donné. Si une requête quelconque entre ce moment-là, vous devez attendre la fin de la synchronisation des données entre les nœuds.
chaque nœud (en cas d'échec) exécute toujours des requêtes et doit toujours répondre aux requêtes. Peu importe qu’il retourne ou non la dernière copie.
Le système continuera à fonctionner en cas de création de partitions réseau.
En ce qui concerne [~ # ~] ap [~ # ~] , la disponibilité (toujours accessible) peut exister avec ( Cassendra ) ou sans ( [~ # ~] rdbms [~ # ~] ) tolérance de partition
Cohérence - Lorsque nous envoyons la demande de lecture, si elle renvoie le résultat, elle devrait renvoyer l’écriture la plus récente donnée par la demande du client. Disponibilité - Votre demande de lecture/écriture doit toujours aboutir. Tolérance de partitionnement - En cas de partition réseau (problème de communication entre certaines machines), le système doit toujours fonctionner.
Dans une distribution distribuée, il y a des chances que la partition réseau se produise et nous ne pouvons pas éviter le "P" de CAP. Nous avons donc choisi entre "cohérence" et "disponibilité".
J’ai le sentiment que la tolérance aux partitions n’est expliquée correctement dans aucune des réponses. Par conséquent, expliquer simplement les choses plus en détail
[~ # ~] c [~ # ~] : (linéarisation ou consistance forte) signifie à peu près
Si l'opération B a démarré après la fin de l'opération A, l'opération B doit afficher le système dans le même état qu'à la fin de l'opération A ou dans un état plus récent (mais jamais ancien).
[~ # ~] a [~ # ~] :
“Chaque demande reçue par un nœud [base de données] non défaillant du système doit donner lieu à une réponse [sans erreur]”. Il n’est pas suffisant pour un nœud de pouvoir traiter la requête: tout nœud non défaillant doit pouvoir le gérer. De nombreux systèmes dits "à haute disponibilité" (c'est-à-dire à faible temps d'indisponibilité) ne répondent pas à cette définition de la disponibilité.
[~ # ~] p [~ # ~] :
La tolérance de partition (terriblement mal nommée) signifie que vous communiquez via un réseau asynchrone susceptible de retarder ou de supprimer des messages. Internet et tous nos centres de données ont cette propriété, vous n’avez donc pas vraiment le choix.
Source: Génial Martin Kleppmann's travail
Juste pour prendre un exemple: Cassandra peut au maximum être un système AP. Mais si vous le configurez pour lire ou écrire en fonction de Quorum, il ne restera pas disponible pour le CAP (disponible selon la définition du Théorème de la PAC) et n’est que le système P.