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.
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 valorio.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