Quel est le protocole de réplication CouchDB? Est-ce que c’est comme Git?

Existe-t-il une documentation technique décrivant le fonctionnement de la réplication entre deux Couches?

Quel est l’aperçu de base de la réplication CouchDB? Quelles sont les caractéristiques notables à ce sujet?

Malheureusement, il n’y a pas de documentation détaillée décrivant le protocole de réplication. Il n’y a que l’implémentation de référence intégrée à CouchDB, et la réécriture de Filipe Manana qui deviendra probablement la nouvelle implémentation dans le futur.

Cependant, c’est l’idée générale:

Points clés

Si vous connaissez Git, vous savez comment fonctionne la réplication Couch. La réplication est très similaire à la poussée ou à l’extraction avec des gestionnaires de sources dissortingbuées tels que Git.

La réplication CouchDB ne possède pas son propre protocole. Un réplicateur se connecte simplement à deux bases de données en tant que client, puis lit à partir de l’une et écrit sur l’autre. La réplication poussée lit les données locales et met à jour la firebase database distante. tirer réplication est l’inverse.

  • Fait amusant 1 : Le réplicateur est en réalité une application indépendante d’Erlang, dans son propre processus. Il se connecte aux deux canapés, lit les enregistrements de l’un et les écrit à l’autre.
  • Fait amusant 2 : CouchDB n’a aucun moyen de savoir qui est un client normal et qui est un réplicateur (et encore moins si la réplication est push ou pull). Tout ressemble à des connexions client. Certains d’entre eux lisent des disques. Certains d’entre eux écrivent des disques.

Tout découle du modèle de données

L’algorithme de réplication est sortingvial, sans intérêt. Un singe entraîné pouvait le concevoir. C’est simple parce que l’intelligence est le modèle de données, qui présente ces caractéristiques utiles:

  1. Chaque enregistrement dans CouchDB est complètement indépendant de tous les autres. Cela craint si vous voulez faire un JOIN ou une transaction, mais c’est génial si vous voulez écrire un réplicateur. Il suffit de comprendre comment répliquer un enregistrement, puis de le répéter pour chaque enregistrement.
  2. Comme Git, les enregistrements ont un historique de révision de liste liée. L’ID de révision d’un enregistrement est la sum de contrôle de ses propres données. Les ID de révision suivants sont des sums de contrôle de: les nouvelles données, plus l’ID de révision du précédent.
  3. En plus des données d’application ( {"name": "Jason", "awesome": true} ), chaque enregistrement stocke la chronologie évolutive de tous les ID de révision précédents menant à lui-même.

    • Exercice : Prenez un moment de reflection tranquille. Considérons deux enregistrements différents, A et B. Si l’ID de révision de A apparaît dans le scénario de B, alors B a définitivement évolué de A. Considérons maintenant les fusions rapides de Git. Entends-tu cela? C’est le son de votre esprit qui est soufflé.
  4. Git n’est pas vraiment une liste linéaire. Il a des fourchettes, quand un parent a plusieurs enfants. CouchDB a ça aussi.

    • Exercice : comparer deux enregistrements différents, A et B. L’ID de révision de A n’apparaît pas dans le calendrier de B; cependant, un ID de révision, C, se trouve dans le scénario de A et de B. Ainsi, A n’a pas évolué de B. B n’a pas évolué de A. Mais plutôt, A et B ont un ancêtre commun C. Dans Git, c’est un “fork”. Dans CouchDB, c’est un “conflit”.

    • Dans Git, si les deux enfants continuent à développer leur calendrier de manière indépendante, c’est cool. Forks soutient totalement cela.

    • Dans CouchDB, si les deux enfants continuent à développer leurs calendriers de manière indépendante, c’est aussi cool. Les conflits soutiennent totalement cela.
    • Fait amusant 3: Les “conflits” de CouchDB ne correspondent pas aux “conflits” de Git. Un conflit Couch est une histoire de révision divergente, ce que Git appelle un “fork”. Pour cette raison, la communauté CouchDB prononce un “conflit” avec un “silence”.
  5. Git a aussi des fusions, quand un enfant a plusieurs parents. CouchDB a en quelque sorte cela aussi.

    • Dans le modèle de données, il n’y a pas de fusion. Le client marque simplement un calendrier comme étant supprimé et continue de fonctionner avec le seul scénario existant.
    • Dans l’application, cela ressemble à une fusion. En règle générale, le client fusionne les données de chaque scénario d’une manière spécifique à l’application. Ensuite, il écrit les nouvelles données dans la chronologie. Dans Git, c’est comme copier et coller les modifications de la twig A dans la twig B, puis en s’engageant dans la twig B et en supprimant la twig A. Les données ont été fusionnées, mais il n’y a pas eu de git merge .
    • Ces comportements sont différents car, dans Git, le calendrier lui-même est important; mais dans CouchDB, les données sont importantes et la chronologie est accessoire – elle est juste là pour prendre en charge la réplication. C’est l’une des raisons pour lesquelles la révision intégrée de CouchDB est inappropriée pour stocker des données de révision comme une page wiki.

Notes finales

Au moins une phrase de cet article (peut-être celle-ci) est complète.

Merci Jason pour l’excellent aperçu! Jens Alfke, qui travaille sur TouchDB et sa réplication pour Couchbase, a (officieusement) décrit l’algorithme de réplication CouchDB lui-même si les détails techniques sur le fonctionnement d’un protocole de réplicateur CouchDB «standard» vous intéressent.

Pour résumer les étapes qu’il a décrites:

  1. Déterminez dans quelle mesure toute réplication antérieure a eu lieu
  2. Obtenir la firebase database source _changes depuis ce point
  3. Utilisez revs_diff sur un lot de modifications pour voir celles qui sont nécessaires sur la cible
  4. Copiez les métadonnées de révision et les données de document actuelles + les pièces jointes manquantes de la source vers la cible, en les bulk_docs à bulk_docs pour les optimiser et pour stocker les documents différemment de la gestion MVCC de niveau supérieur habituelle sur PUT .

J’ai passé sous silence de nombreux détails ici et je recommande également de lire l’explication originale.

La documentation de CouchDB v2.0.0 couvre l’algorithme de réplication beaucoup plus largement. Ils ont des diagrammes, des exemples de réponses intermédiaires et des exemples d’erreurs. Ils utilisent le langage “MUST”, “SHALL”, etc. des RFC IETF.

Les spécificités de 2.0.0 (toujours inédites en janvier 2016) sont un peu différentes de 1.x, mais les bases sont toujours décrites dans @natevw .

À Apache CouchDB Conf 2013 , Benjamin Young a introduit replication.io dans sa réplication, FTW! parler . Il s’agit d’un effort continu pour définir et, à terme, pour tester les spécifications de la réplication maître-maître basée sur HTTP.

il est également documenté ici: http://www.dataprotocols.org/en/latest/couchdb_replication.html , eh bien, en quelque sorte.