2017-10-06 3 views
1

Dans l'article wikipedia sur le théorème CAP (https://en.wikipedia.org/wiki/CAP_theorem), il est dit (Souligné par l'auteur gras) « Lors du choix d'une cohérence sur la disponibilité, le système renvoie une erreur ou une temporisation si certaines informations ne peut pas être garanti d'être à jour en raison du partitionnement du réseau. "cohérence sur la disponibilité dans CAP théorème

Si tel n'est pas le cas, ne pas choisir la cohérence par rapport à la disponibilité signifie-t-il également une perte de tolérance de partition? Le système est peut-être en hausse, mais s'il renvoie des erreurs pour tous mes accès aux données, à quoi bon? Ou, est-ce que le "partitionnement de réseau" implique également le partitionnement de données? En d'autres termes, si le partitionnement de données est également impliqué, au moins certaines parties des données sont connues pour être à jour et peuvent être retournées tout en satisfaisant à l'exigence de cohérence.

+0

"si le partitionnement de données est également implicite, au moins certaines parties des données sont connues pour être à jour et peuvent être retournées tout en satisfaisant à l'exigence de cohérence. " Je pense que la confusion fondamentale est ici. Vous dites que certaines données sont connues pour être à jour et peuvent donc être retournées .... mais au cours d'une partition réseau arbitraire, comment cela peut-il être connu? Vous pouvez le savoir à partir d'une vue de dieu, mais les machines distribuées réelles ne peuvent pas. – GManNickG

Répondre

0

Supposons que vous avez 2 centres de données, chacun ayant une base de données distincte et que votre système permet aux clients de se connecter au premier ou au deuxième centre de données. Les deux datacenters doivent être synchronisés, il existe donc un lien réseau entre eux. Maintenant, imaginez que le lien réseau tombe en panne et que les bases de données ne puissent plus communiquer entre elles (c'est ce que signifie une partition réseau). Que faites-vous maintenant en tant que développeur d'applications?

Vous avez essentiellement 2 options:

1) Rendre le système disponible, qui par définition de la PAC signifie:

Chaque demande reçue par un non-défaut noeud [base de données] dans le système doit résulter en une réponse [sans erreur]

Notez que dans notre exemple, les deux nœuds sont non défaillants (ils sont opérationnels). En d'autres termes, vous pouvez autoriser tous les clients des deux datacenters à écrire et lire des données mais vous perdez la cohérence (voir ci-dessous pour la définition), car les écritures dans une base de données ne seront pas visibles dans une autre base de données. 2) Rendre le système cohérent (notez qu'il n'a rien à voir avec la cohérence ACID), ce qui, par définition de CAP, signifie linéarisabilité, ce qui signifie que si une écriture se produit, elle doit être vue par tout le système (aucun noeud ne doit voir l'état précédent).

Dans notre cas, il vous faut rejeter les lectures et les écritures d'un des centres de données, de sorte qu'un seul centre de données devient opérationnel. Un tel système n'est pas inutile du tout et vous ne perdez pas la tolérance de partition, puisque vous pouvez rediriger tous vos clients vers la base de données opérationnelle.

Il y a beaucoup de confusion autour du théorème de la PAC et je vous recommande de lire un excellent billet de blog par Martin Kleppmann qui m'a aidé à comprendre beaucoup de choses sur le sujet: https://martin.kleppmann.com/2015/05/11/please-stop-calling-databases-cp-or-ap.html

+0

Si le lien est en panne, comment acheminez-vous les clients de dc1 (disons DC échoué) à dc2? – user8729669

+0

Vous pouvez le faire au niveau du pilote (responsable de la communication client -> db) par exemple, je pense que le pilote MongoDB fait cela. – matino

+0

Désolé, ce que je voulais dire, si le lien est en panne, comment allez-vous atteindre la base de données dans DC2 pour les clients dans DC1? – user8729669