Replicación de mensajes en múltiples clústeres de Kafka utilizando Mirror Maker 2

Image by Gerd Altmann from Pixabay

Apache Kafka se ha posicionado como la plataforma de streaming de datos favorita para resolver casos de uso como "data pipelines" de alto rendimiento, "streaming analysis" y aplicaciones de misión crítica.

Existen diferentes escenarios que requerirán evolucionar de una instancia de Kafka a múltiples instancias. Por ejemplo, los servicios críticos pueden migrar y ejecutarse en instancias dedicadas para lograr un mejor rendimiento y aislamiento para satisfacer el nivel de servicio.

Otro caso (que es el más usual) es para la recuperación de desastres: donde una instancia en un centro de datos primario se replica continuamente en el centro de datos de respaldo y en caso de un fallo los servicios pueden continuar su ejecución en el respaldo.

En otro ejemplo de estrategias de múltiples centros de datos, se utiliza como solución que los datos se dirigen primero a un centro de datos geográficamente más cercano, y luego estos se transfieren a un clúster central en un centro de datos remoto, llamado "clúster agregado", para obtener una visión holística y completa de los datos.

Kafka, nos provee de una herramienta bastante útil para hacer replicado de datos sin que esto suponga un gran esfuerzo salvo el de la configuración inicial. Esta herramienta es Kafka Mirror Maker 2.

¿Qué es Mirror Maker?

Es una herramienta diseñada para transferir datos de uno o más tópicos entre un clúster origen y otro destino. Esta herramienta esta a cargo de ejecutar un proceso que tiene el rol de consumidor y productor a la vez (recolectando los mensajes de los tópicos indicados en el clúster origen y llevándolos al clúster destino).

Mirror Maker 2 tiene la ventaja de ser una herramienta que permite no solo replicar en un sola dirección en esta nueva versión es posible de hacer replicación bidireccional permitiendo las arquitecturas activo/activo distinguiendo los tópicos por el renombramiento automático que antepone el nombre del clúster al nombre del tópico en los diferentes clústeres.

2020-03-30-mirrormaker-renaming
Image by strimzi.io

Ahora Probemos

En este artículo, haremos un despliegue paso a paso usando Kubernetes (k3d) y Strimzi

Paso 1: Iniciar Kubernetes local

k3d cluster create mycluster

Paso 2: Clonar el repositorio con los archivos de configuración

git clone https://github.com/mikeintoch/strimzi-mirror-maker-2.git

Paso 3: Crear namespace llamado "kafka".

kubectl create ns kafka

Paso 4: Desplegar Strimzi en el namespace kafka

kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka

Paso 5: Crear dos clústeres de kafka usando strimzi.

kubectl create -f kafka-clusters-ephemeral.yaml -n kafka

A continuación, verificar que se ejecutan 2 clústeres de kafka.

kubectl get kafkas -n kafka
NAME      DESIRED KAFKA REPLICAS   DESIRED ZK REPLICAS   READY   WARNINGS
broker1   3                        3                     True
broker2   3                        3                     True
kubectl get pods -n kafka
NAME                     READY   STATUS              RESTARTS   AGE
strimzi-cluster-...      1/1     Running             0          2m39s
broker2-zookeeper-0      1/1     Running             0          84s
broker1-zookeeper-0      1/1     Running             0          84s
broker2-zookeeper-1      1/1     Running             0          84s
broker1-zookeeper-1      1/1     Running             0          84s
broker2-zookeeper-2      1/1     Running             0          84s
broker1-zookeeper-2      1/1     Running             0          84s
broker2-kafka-0          1/1     Running             0          40s
broker1-kafka-0          1/1     Running             0          40s
broker1-kafka-2          1/1     Running             0          40s
broker1-kafka-1          1/1     Running             0          40s
broker2-kafka-1          1/1     Running             0          40s
broker2-kafka-2          1/1     Running             0          40s
broker1-entity-...       3/3     Running             0          40s
broker2-entity-...       3/3     Running             0          2s

Paso 6: Desplegar Mirror Maker 2

Revisar la configuración de archivo kafka-mirror-maker-2.yaml

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
  name: my-mirror-maker-2
spec:
  version: 2.8.0
  replicas: 1
  connectCluster: "my-target-cluster"
  clusters:
  - alias: "my-source-cluster"
    bootstrapServers: broker1-kafka-bootstrap:9092
  - alias: "my-target-cluster"
    bootstrapServers: broker2-kafka-bootstrap:9092
    config:
      # -1 means it will use the default replication factor configured in the broker
      config.storage.replication.factor: -1
      offset.storage.replication.factor: -1
      status.storage.replication.factor: -1
  mirrors:
  - sourceCluster: "my-source-cluster"
    targetCluster: "my-target-cluster"
    sourceConnector:
      config:
        replication.factor: 1
        offset-syncs.topic.replication.factor: 1
        sync.topic.acls.enabled: "false"
        replication.policy.separator: "."
    heartbeatConnector:
      config:
        heartbeats.topic.replication.factor: 1
    checkpointConnector:
      config:
        checkpoints.topic.replication.factor: 1
        replication.policy.separator: ""
        replication.policy.class: "io.strimzi.kafka.connect.mirror.IdentityReplicationPolicy"
    topicsPattern: ".*"
    groupsPattern: ".*"

Se puede utilizar MirrorMaker 2.0 en configuraciones de clúster activo/pasivo o activo/activo.

  • En este articulo usaremos la configuración activa/activa (replicación bidireccional), Cada clúster replica los datos del otro clúster utilizando el concepto de tópicos de origen y remotos. Como los mismos tópicos se almacenan en cada clúster, los tópicos remotos son renombrados automáticamente por MirrorMaker 2.0 para representar el clúster de origen. El nombre del clúster de origen se antepone al nombre del tópico, también puede añadir un separador usando la configuración replication.policy.separator.
  • En una configuración activa/pasiva (replicación unidereccional), los datos de un clúster activo se replican en un clúster pasivo, que permanece en espera, por ejemplo, para la recuperación de datos en caso de fallo del sistema para ejecutar esta configuración puede configurar la propiedad replication.policy.class con el valor io.strimzi.kafka.connect.mirror.IdentityReplicationPolicy porque queremos que el clúster kafka de destino tenga el mismo tópico que el clúster kafka de origen.

A continuación, aplicar la configuración de Mirror Maker 2

kubectl create -f kafka-mirror-maker-2.yaml -n kafka

Paso 6: Verificar el servicio Mirror Maker ya que se despliega como un servicio y pod independientes.

kubectl get pods -n kafka
NAME                          READY   STATUS    RESTARTS   AGE
...
my-mirror-maker-2...          1/1     Running   0          7m29s
...

Paso 7: Probar Mirror Maker

Abrir una nueva terminal e iniciemos el productor de mensajes en el clúster 1.

kubectl exec -n kafka broker1-kafka-0 -it -- /opt/kafka/bin/kafka-console-producer.sh --bootstrap-server 0.0.0.0:9092 --topic myTestTopic

Abrir otra terminal y ejecutar el consumidor en el clúster 2, recordemos que por la configuración activa/activa el tópico sera renombrado usando el nombre del clúster origen.

kubectl exec -n kafka broker2-kafka-0 -it -- /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server 0.0.0.0:9092 --topic my-source-cluster.myTestTopic --group Group1 --from-beginning

Ahora escriba algunos mensajes al azar en la consola del productor. Se espera ver los mismos mensajes en la consola del consumidor simultáneamente.

Conclusión

Con Mirror Maker la replicación de información con Apache Kafka se hace bastante sencilla de ejecutar y de usar solo tenemos que encontrar la mejor configuración dependiendo de las necesidades de negocio y de las aplicaciones.

Referencias

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *