Réplication XDCR

XDCR (Cross Data Center Replication) est un mécanisme qui permet de répliquer les données entre des clusters de data centers distants.

Contrairement à la réplication intra-cluster qui protège les vBuckets actifs en cas de défaillance d'un nœud, XDCR offre une protection en cas de défaillance d'un data centre, ainsi qu'une haute disponibilité et des performances élevées pour les applications critiques.

XDCR copie les données d'un bucket spécifique d'un cluster source vers un bucket d'un cluster cible, mais on peut également spécifier un scope ou une collection comme source de réplication. Les données sont poussées depuis la source par un agent XDCR qui utilise le protocole DCP (Database Change Protocol) sur le cluster source.

Dans la suite de ce document, nous allons configurer la réplication XDCR entre deux clusters.

Préparation de la réplication

Nous allons maintenant créer un deuxième cluster destiné à la réplication. Nous allons suivre les mêmes étapes que dans le chapitre "Installation" pour créer ce cluster cible en utilisant docker-compose comme indiqué ci-dessous.

version: '3.5'
services:
  dbServer1-rep:
    container_name: dbServer1-rep
    image: couchbase/server:enterprise-7.0.5
    volumes:
    - type: volume
      source: data1-rep
      target: /opt/couchbase/var
    networks:
      dbNetwork:
        ipv4_address: 172.18.56.21
    ports:
      - 48091-48096:8091-8096
      - 41210-41211:11210-11211
    ulimits:
      nproc: 65535
      core:
        soft: 100000000
        hard: 100000000
      memlock:
        soft: 100000000
        hard: 100000000
      nofile:
        soft: 40960
        hard: 40960
  dbServer2-rep:
    container_name: dbServer2-rep
    image: couchbase/server:enterprise-7.0.5
    volumes:
    - type: volume
      source: data2-rep
      target: /opt/couchbase/var
    networks:
      dbNetwork:
        ipv4_address: 172.18.56.22
    ports:
      - 58091-58096:8091-8096
      - 51210-51211:11210-11211
    ulimits:
      nproc: 65535
      core:
        soft: 100000000
        hard: 100000000
      memlock:
        soft: 100000000
        hard: 100000000
      nofile:
        soft: 40960
        hard: 40960
networks:
  dbNetwork:
    name: dbNetwork
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.56.0/24
volumes:
  data1-rep:
  data2-rep:

On construit les deux conteneurs.

root@data-resilience:/app/couchbase# docker-compose -f rep/docker-compose-rep.yml up -d
Creating dbServer1-rep ... done
Creating dbServer2-rep ... done

Les commandes suivantes nous permettront d'initialiser et configurer le cluster de réplication sans trop d'explications, car cela a déjà été vu dans les chapitres précédents.

root@data-resilience:/app/couchbase# docker exec -ti dbServer1-rep sh
# couchbase-cli cluster-init -c 172.18.56.21 \
--cluster-username admin \
--cluster-password admin123 \
--cluster-name db-cluster-rep \
--services data,index,query \
--cluster-ramsize 256 \
--cluster-index-ramsize 256> > > > > > 
SUCCESS: Cluster initialized
# couchbase-cli server-add -c 172.18.56.21:8091 \
--username admin \
--password admin123 \
--server-add http://172.18.56.22:8091 \
--server-add-username admin \
--server-add-password admin123 \
--services data,index,query> > > > > > 
SUCCESS: Server added
# couchbase-cli rebalance -c 172.18.56.21:8091 \
--username admin \
--password admin123> > 
Rebalancing                                                                                                                                                                                                
Bucket: 00/00 ()                                                                                                      0 docs remaining
[============================================================================================================================] 100.00%
SUCCESS: Rebalance complete
# couchbase-cli server-list -c 172.18.56.21:8091 \
--username admin \
--password admin123> > 
ns_1@172.18.56.21 172.18.56.21:8091 healthy active
ns_1@172.18.56.22 172.18.56.22:8091 healthy active

Création d'une référence de réplication

Pour mettre en place une réplication, il est nécessaire de déclarer une référence de réplication sur le cluster local, comprenant les informations permettant d'identifier le cluster cible pour la réplication XDCR.

La commande suivante permet de créer une référence de réplication.

root@data-resilience:/app/couchbase# docker exec -ti dbServer1 sh
# couchbase-cli xdcr-setup -c 172.18.56.11 -u admin -p admin123 \
--create \
--xdcr-cluster-name db-cluster-rep \
--xdcr-hostname 172.18.56.21 \
--xdcr-username admin \
--xdcr-password admin123> > > > > 
SUCCESS: Cluster reference created

On peut obtenir la liste de toutes les références en utilisant la commande xdcr-setup avec l'option list.

# couchbase-cli xdcr-setup -c 172.18.56.11 \
-u admin -p admin123 --list> 
cluster name: db-cluster-rep
        uuid: e561e2278273c53e0187302ac76d971c
   host name: 172.18.56.21:8091
   user name: admin
         uri: /pools/default/remoteClusters/db-cluster-rep

Créer une réplication

Avant de démarrer la réplication, il est nécessaire de créer le bucket, le scope et la collection que l'on souhaite répliquer sur le cluster cible.

Dans cet exemple, nous commençons par créer le bucket 'étudiant-bucket'. Le scope 'étudiant-scope' et la collection 'étudiant' cibles seront créés ultérieurement.

root@data-resilience:/app/couchbase# docker exec -ti dbServer1-rep sh
# couchbase-cli bucket-create \
--cluster 172.18.56.21:8091 \
--username admin \
--password admin123 \
--bucket ecole-bucket \
--bucket-type couchbase \
--bucket-ramsize 256 \
--max-ttl 500000000 \
--durability-min-level persistToMajority \
--enable-flush 0> > > > > > > > > 
SUCCESS: Bucket created

En utilisant la commande xdcr-replicate avec l'option create, nous pouvons créer la réplication comme illustré dans l'exemple ci-dessous.

root@data-resilience:/app/couchbase# docker exec -ti dbServer1 sh
# couchbase-cli xdcr-replicate -c 172.18.56.11 -u admin -p admin123 \
--create \
--xdcr-cluster-name db-cluster-rep \
--xdcr-from-bucket ecole-bucket \
--xdcr-to-bucket ecole-bucket \
--xdcr-replication-mode xmem> > > > > 
DEPRECATED: Specifying --xdcr-replication-mode is deprecated
SUCCESS: XDCR replication created

Il est possible de vérifier l'état de la réplication en accédant à la console web puis en naviguant dans la section XDCR.

Il convient de noter que, dans cet exemple, la réplication comporte deux erreurs liées au mapping du scope et de la collection, car le scope 'étudiant-scope' et la collection 'étudiant' n'ont pas été créés préalablement.

Les commandes suivantes permettent de créer la scope 'étudiant-scope' et la collection 'étudiant' pour corriger le problème précédent.

root@data-resilience:/app/couchbase# docker exec -ti dbServer1-rep sh
# couchbase-cli collection-manage \
--cluster 172.18.56.21:8091 \
--username admin \
--password admin123 \
--bucket ecole-bucket \
--create-scope ecole-scope> > > > > 
SUCCESS: Scope created
# couchbase-cli collection-manage \
--cluster 172.18.56.21:8091 \
--username admin \
--password admin123 \
--bucket ecole-bucket \
--create-collection ecole-scope.etudiant \
--max-ttl 0> > > > > > 
SUCCESS: Collection created

Lister les réplications

La commande xdcr-replicate avec l'option 'list' permet de lister toutes les réplications existantes. L'identifiant unique 'stream id' sert à gérer la réplication.

root@data-resilience:/app/couchbase# docker exec -ti dbServer1 sh
# couchbase-cli xdcr-replicate -c 172.18.56.11 -u admin -p admin123 \
--list>
stream id: e561e2278273c53e0187302ac76d971c/ecole-bucket/ecole-bucket
   status: running
   source: ecole-bucket
   target: /remoteClusters/e561e2278273c53e0187302ac76d971c/buckets/ecole-bucket

Suspendre la réplication

On peut suspendre la réplication en utilisant la commande xdcr-replicate avec l'option 'pause'.

# couchbase-cli xdcr-replicate -c 172.18.56.11 -u admin -p admin123 \
--pause \
--xdcr-replicator=e561e2278273c53e0187302ac76d971c/ecole-bucket/ecole-bucket> > 
SUCCESS: XDCR replication paused

Reprendre la réplication

La commande xdcr-replicate avec l'option 'resume' permet de reprendre la réplication.

# couchbase-cli xdcr-replicate -c 172.18.56.11 -u admin -p admin123 \
--resume \
--xdcr-replicator=e561e2278273c53e0187302ac76d971c/ecole-bucket/ecole-bucket> > 
SUCCESS: XDCR replication resume

Supprimer la réplication

La commande xdcr-replicate avec l'option 'delete' permet de supprimer la réplication.

couchbase-cli xdcr-replicate -c 172.18.56.11 -u admin -p admin123 \
--delete \
--xdcr-replicator=e561e2278273c53e0187302ac76d971c/ecole-bucket/ecole-bucket

Supprimer la référence

La commande xdcr-setup avec l'option 'delete' permet de supprimer la référence de la réplication.

couchbase-cli xdcr-setup -c 172.18.56.11 -u admin -p admin123 \
--delete \
--xdcr-cluster-name db-cluster-rep