Mirroring Two Local Clusters
This tutorial is a demonstration of mirroring between two clusters running on Docker.
Home and Remote
To understand mirroring, we need to understand what is a Home and a Remote cluster:
- Home cluster is the target cluster that will receive and consume data.
 - Remote cluster is the source cluster that will send data.
 
Dockerfile and Docker-compose
Copy the docker-compose.yaml and Dockerfile to a directory.
docker-compose.yaml:
version: "3"
services:
  ## Home Cluster
  sc-home:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: sc-home
    environment:
      - RUST_LOG=info
    entrypoint: >
      /bin/sh -c "
      fluvio profile add docker 0.0.0.0:9003 docker;
      bash -c 'sleep 5 ; fluvio cluster spu register --id 5001 -p spu-home:9010 --private-server spu-home:9011' &
      ./fluvio-run sc --local /fluvio/metadata
      "
    volumes:
      - ./home/fluvio-metadata:/fluvio/metadata
      - ./shared:/shared
  spu-home:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: spu-home
    hostname: spu-home
    volumes:
      - ./home/fluvio-data:/fluvio/data
    environment:
      - RUST_LOG=info
    command: "./fluvio-run spu -i 5001 -p spu-home:9010 -v spu-home:9011 --sc-addr sc-home:9004 --log-base-dir /fluvio/data"
    depends_on:
      - sc-home
  ## Remote Cluster        
  sc-remote:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: sc-remote
    hostname: sc-remote
    environment:
      - RUST_LOG=info
    entrypoint: >
      /bin/sh -c "
      fluvio profile add docker 0.0.0.0:9003 docker;
      bash -c 'sleep 5 ; fluvio cluster spu register --id 5001 -p spu-remote:9010 --private-server spu-remote:9011' &
      ./fluvio-run sc --local /fluvio/metadata
      "
    volumes:
      - ./remote/fluvio-metadata:/fluvio/metadata
      - ./shared:/shared
  spu-remote:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: spu-remote
    hostname: spu-remote
    volumes:
      - ./remote/fluvio-data:/fluvio/data
    environment:
      - RUST_LOG=info
    command: "./fluvio-run spu -i 5001 -p spu-remote:9010 -v spu-remote:9011 --sc-addr sc-remote:9004 --log-base-dir /fluvio/data"
    depends_on:
      - sc-remote
Dockerfile:
FROM infinyon/fluvio:latest
RUN apk update
RUN apk add curl unzip bash
RUN curl -fsS https://hub.infinyon.cloud/install/install.sh?ctx=dc | VERSION='latest' bash
RUN mv /root/.fluvio/bin/fluvio /usr/local/bin/fluvio
Start Docker Containers with:
docker-compose up -d
Register Remote clusters on the Home
First, enter into the home cluster shell:
docker exec -it sc-home /bin/sh
Use the remote CLI to register the remote clusters with the home cluster:
fluvio remote register docker-remote
List remote clusters to check their status:
fluvio remote list
It should show the following:
  REMOTE           SC STATUS  SPU STATUS  LAST SEEN  ERRORS
  docker-remote    Waiting    Waiting     -          -
Create the mirror topic
Mirror topics on the home clusters has multiple partitions, where each partition has a 1-to-1 relationship with the remote cluster.
Create the mirror topic, then add the remote to it:
fluvio topic create mirror-topic  --mirror
fluvio topic add-mirror mirror-topic docker-remote
or apply a json file with an array of remotes that you want to assign when creating a topic:
echo '["docker-remote"]' > assignment_file.json
fluvio topic create mirror-topic --mirror-apply assignment_file.json
List partitions to check the assignment:
fluvio partition list
It should display the partition that we created:
  TOPIC         PARTITION  LEADER  MIRROR        REPLICAS  RESOLUTION  SIZE  HW  LEO  LRS  FOLLOWER OFFSETS
  mirror-topic  0          5001    docker-remote []        Online      0 B   0   0    0    0                 []
Generate Metadata for Remote Clusters
Each remote cluster requires a unique metadata file that gives the remote cluster the information to connect to the home cluster and the topic/mirror where the data is synchronized.
Generate a metadata file for the remote:
fluvio remote export docker-remote --file /shared/docker-remote.json --public-endpoint sc-home:9003
Connect to the Home Cluster from the Remote
Now, connect to the remote shell in another terminal:
docker exec -it sc-remote /bin/sh
Then, we'll use the metadata file to connect to home:
fluvio home connect --file /shared/docker-remote.json
Let's check the partitions:
fluvio partition list
The remote device should show the following partition::
  TOPIC       PARTITION  LEADER  MIRROR                     REPLICAS  RESOLUTION  SIZE  HW  LEO  LRS  FOLLOWER OFFSETS
  mirror-topic  0          5001  home:5001:spu-home:9010    []        Online      0 B   0   0    0    0                 []
Also, check the home status with:
fluvio home status
It should show the following:
  REMOTE  SC STATUS  SPU STATUS  LAST SEEN  ERRORS
  home    Connected  Connected   1s         -
Producing and Consuming on Mirroring
Let's produce on the remote and consume from the home cluster.
Produce to remote cluster
On remote shell, produce with:
fluvio produce mirror-topic
> A
Ok!
> B
Ok!
Consume from Home cluster
On home shell, consume with:
fluvio consume mirror-topic --mirror docker-remote -B
A
B
🎉 Congratulations! You have successfully tested mirroring.