Migración de Apache Kafka a Pub/Sub

Migración de Apache Kafka a Pub/Sub

Acerca de este codelab

subjectÚltima actualización: oct 4, 2023
account_circleEscrito por Timothy Itodo & Sri Harshini Donthineni

1. Introducción

Este codelab es una guía paso a paso para demostrar la migración de aplicaciones de Apache Kafka a Google Cloud Pub/Sub con el enfoque de migración por fases.

Puede obtener más información sobre las diferencias entre Kafka y Pub/Sub y el enfoque de migración en etapas aquí.

Qué compilarás

En esta demostración, harás lo siguiente:

  • Configura un clúster de Kafka autoadministrado en GCE
  • Implementa una aplicación de Kafka simple que transmita cadenas aleatorias
  • Configura Pub/Sub
  • Migra de Kafka a Pub/Sub con el conector de Kafka de Pub/Sub

Qué aprenderás

  • Cómo configurar un clúster de Kafka autoadministrado en GCE
  • Cómo migrar una aplicación de Kafka a una aplicación de Pub/Sub

Requisitos

  • Acceder a Google Cloud Platform (con permisos de escritura para BigQuery y Pub/Sub)
  • CLI de gcloud instalada
  • Java 8 o superior instalado.

Costo

En este documento, utilizarás los siguientes productos o servicios facturables:

Para generar una estimación de costos en función del uso proyectado, usa la calculadora de precios.

2. Configura Kafka

En este codelab, iniciaremos Kafka con ZooKeeper. Tu entorno local debe tener instalado Java 8 o superior.

1. Instala Kafka

Descarga Kafka y extráelo. Recomienda la descarga binaria para continuar:

curl -O https://downloads.apache.org/kafka/3.5.1/kafka_2.13-3.5.1.tgz
tar -xzf kafka_2.13-3.5.1.tgz
cd kafka_2.13-3.5.1

2. Iniciar zoológico

bin/zookeeper-server-start.sh config/zookeeper.properties

3. Iniciar agente

Para iniciar el servicio del agente de Kafka, abre otra sesión de la terminal y ejecuta lo siguiente:

bin/kafka-server-start.sh config/server.properties

4. Crear tema kafka

Crea un tema de Kafka para la aplicación de Kafka, abre una nueva sesión de la terminal y ejecuta lo siguiente:

export TOPIC= "my-topic"
bin/kafka-topics.sh --create --topic $TOPIC --bootstrap-server localhost:9092

5. Confirma la creación de un tema

bin/kafka-topics.sh --describe --topic $TOPIC --bootstrap-server localhost:9092

El resultado del cmd anterior debería ser similar al siguiente:

Topic: my-topic   TopicId: gf4ena9rSmyQXMTDj1bBmQ PartitionCount: 1   ReplicationFactor: 1    Configs:
  Topic: my-topic Partition: 0    Leader: 0   Replicas: 0 Isr: 0

3. Crea una aplicación de Kafka

En este codelab, crearemos una aplicación Java kafka que tiene 1 productor y 2 consumidores. El productor envía periódicamente cadenas aleatorias y una marca de tiempo a un tema kafka.

Para demostrar la migración por fases, crearemos 2 consumidores para esta aplicación.

  • Consumidor 1: imprime los mensajes leídos
  • Consumidor 2: escribe los mensajes en BigQuery

Abre una terminal nueva y ejecuta los siguientes comandos. No ejecute estos comandos en el directorio de descarga de Kafka

1. Cómo configurar variables constantes

export PROJECT_ID="<your project id>"
export DATASET_ID="<dataset name>"
export TABLE_ID="<table name>"
export TOPIC="my-topic"

2. Descarga la aplicación de Kafka src

git clone https://github.com/itodotimothy6/kafka-to-pubsub-demo.git
cd kafka
-to-pubsub-demo

3. Configura y autentica gcloud

gcloud config set project $PROJECT_ID
gcloud auth application
-default login
gcloud services enable bigquery
.googleapis.com

4. Crea una tabla de BigQuery

El segundo consumidor usa esta tabla para escribir el resultado. La definición del esquema de la tabla es “message:STRING, timestamp:STRING”.

bq mk --dataset --data_location US $PROJECT_ID:$DATASET_ID 
bq mk
--table $PROJECT_ID:$DATASET_ID.$TABLE_ID message:STRING,timestamp:STRING

5. Ejecuta el productor para comenzar a enviar mensajes al tema

mvn clean install
mvn exec:java \
  -Dexec.mainClass="org.kafka.SimpleKafkaProducer" \
  -Dexec.args="$TOPIC"

Los registros de resultado deberían ser similares a los siguientes:

...
Message sent: {"message":"283b7961-44cd-46d4-9061-5a22b8a1bdd7","timestamp":"2023-09-15 12:17:09"}
Message sent: {"message":"e4c2110a-ebbe-4c96-88d1-56ffdc2a3e9a","timestamp":"2023-09-15 12:17:14"}
...

6. Ejecuta el primer consumidor que cierra la sesión de los mensajes del tema en la consola.

mvn clean install
mvn exec:java \
  -Dexec.mainClass="org.kafka.SimpleKafkaConsumer1" \
  -Dexec.args="$TOPIC"

Los registros de resultado deberían ser similares a los siguientes:

...
Received message: {"message":"72d46b42-5014-4d28-a6e3-04b65de63826","timestamp":"2023-09-15 12:32:47"}
Received message: {"message":"631464dc-2651-4cce-826f-c9442beb3e98","timestamp":"2023-09-15 12:32:52"}
...

7. Ejecuta el segundo consumidor que escribe mensajes del tema kafka en una tabla de BigQuery

mvn clean install
mvn exec:java \
  -Dexec.mainClass="org.kafka.SimpleKafkaConsumer2" \
  -Dexec.args="$TOPIC $PROJECT_ID $DATASET_ID $TABLE_ID"

Los registros de resultado deberían ser similares a los siguientes:

...
Message inserted to BigQuery successfully.
Message inserted to BigQuery successfully.
...

8. Confirmar que los mensajes se escriben correctamente en BigQuery desde la consola de GCP

8734b356c59543af.png

4. Configura Pub/Sub

1. Habilita Pub/Sub

gcloud services enable pubsub.googleapis.com

2. Crear tema de Pub/Sub

Con el tiempo, este tema reemplazará al tema kafka. Para simplificar, podemos usar el mismo nombre que el tema kafka.

export TOPIC = "my-topic"
gcloud pubsub topics create $TOPIC

5. Migración por fases

Ahora que configuramos nuestra aplicación de Kafka y tenemos un tema de Pub/Sub para la migración, procederemos con la migración de Kafka a Pub/Sub.

En esta demostración de migración, usaremos el conector de Kafka de Pub/Sub del grupo de Google Cloud Pub/Sub, que te permite migrar tu infraestructura de Kafka en etapas.

Fase 1

Configurar el conector de Pub/Sub para reenviar todos los mensajes del tema de Kafka al tema de Pub/Sub

1. Compila el repositorio del conector para adquirir el jar del conector kafka-to-pubsub.

git clone https://github.com/googleapis/java-pubsub-group-kafka-connector
cd java-pubsub-group-kafka-connector/
mvn clean package -DskipTests=True

Deberías ver el jar resultante en target/pubsub-group-kafka-connector-${VERSION}.jar si la operación es exitosa.

Crea una variable con la ruta de acceso completa al jar.

export KAFKA_CONNECT_JAR="path/to/target/pubsub-group-kafka-connector-${VERSION}.jar"

2. Actualice los parámetros de configuración de Kafka que tiene instaladas con los parámetros de configuración de Kafka Connect

Cambia el directorio a tu carpeta de descarga de Kafka que usaste anteriormente.

cd kafka_2.13-3.5.1

Abre /config/connect-standalone.properties en la carpeta de descarga de Kafka, agrega la ruta de acceso al archivo del jar del conector descargado a plugin.path y quita el comentario de la línea si es necesario. Como alternativa, puedes ejecutar el siguiente comando

echo "plugin.path=$KAFKA_CONNECT_JAR" >> config/connect-standalone.properties

3. Crea un archivo de configuración CloudPubSubSinkConnector con el tema kafka, el proyecto y el tema de Pub/Sub necesarios para la migración. Consulta el archivo de configuración aquí de ejemplo.CloudPubSubSinkConnector

cat <<EOF > config/cps-sink-connector.properties
name
=CPSSinkConnector
connector
.class=com.google.pubsub.kafka.sink.CloudPubSubSinkConnector
tasks
.max=10
key
.converter=org.apache.kafka.connect.storage.StringConverter
value
.converter=org.apache.kafka.connect.converters.ByteArrayConverter
topics
=$TOPIC
cps
.project=$PROJECT_ID
cps
.topic=$TOPIC
EOF

4. Inicia el conector para comenzar a reenviar mensajes del tema de Kafka a Pub/Sub.

bin/connect-standalone.sh \
config
/connect-standalone.properties \
config
/cps-sink-connector.properties

Confirma en GCP Console que los mensajes se estén reenviando a tu tema de Pub/Sub

Fase 2

Actualizar las aplicaciones de consumidor para recibir mensajes del tema de Pub/Sub mientras el productor sigue publicando mensajes en Kafka

1. Actualiza el consumidor que imprime mensajes en la consola para suscribirse a Pub/Sub. En la muestra kafka-to-pubsub-demo src, SimplePubsubscriber1 se actualiza para leer desde el tema de Pub/Sub.

Cómo crear una suscripción de Pub/Sub

export SUBSCRIPTION_ID="sub1"
gcloud pubsub subscriptions create $SUBSCRIPTION_ID --topic=$TOPIC

Ejecuta una aplicación suscriptora actualizada

cd kafka-to-pubsub-demo
mvn exec:java \
  -Dexec.mainClass="org.pubsub.SimplePubsubSubscriber1" \
  -Dexec.args="$PROJECT_ID $SUBSCRIPTION_ID"

Los registros de salida deberían ser similares a

...
Id: 8827699929893588
Data: {"message":"08afe1db-2ace-466d-bcf9-77ffc80a7f58","timestamp":"2023-09-15 15:57:34"}
Id: 8827853608001203
Data: {"message":"557960f7-5f2e-4156-84de-e270127c99de","timestamp":"2023-09-15 15:57:39"}
...

2. Actualizar el consumidor que escribe en BigQuery para suscribirse a Pub/Sub En la muestra kafka-to-pubsub-demo src, SimplePubsubscriber1 se actualiza para leer desde el tema de Pub/Sub.

Cómo crear una suscripción de Pub/Sub

export SUBSCRIPTION_ID="sub2"
gcloud pubsub subscriptions create $SUBSCRIPTION_ID --topic=$TOPIC

Ejecuta una aplicación suscriptora actualizada

cd kafka-to-pubsub-demo
mvn exec:java \
  -Dexec.mainClass="org.pubsub.SimplePubsubSubscriber2" \
  -Dexec.args="$PROJECT_ID $SUBSCRIPTION_ID $DATASET_ID $TABLE_ID"

Los registros de salida deberían ser similares a

...
Message inserted to BigQuery successfully.
Message inserted to BigQuery successfully.
...

Fase 3

Actualiza tus productores para publicar directamente en Pub/Sub

  1. Actualiza el src del productor de Kafka para que escriba en Pub/Sub en lugar de Kafka. En el src de kafka-to-pubsub-demo de muestra, se actualiza SimplePubsubPublisher para enviar mensajes al tema de Pub/Sub.
  2. Detén el conector. Para detener el conector, cierra el conector en ejecución en la sesión de la terminal de kafka-connect
  3. Ejecuta la aplicación del publicador actualizada
cd kafka-to-pubsub-demo
mvn exec:java \
  -Dexec.mainClass="org.pubsub.SimplePubsubPublisher" \
  -Dexec.args="$PROJECT_ID $TOPIC"

6. Felicitaciones

Felicitaciones, completaste correctamente el codelab para migrar aplicaciones autoadministradas de Kafka a Pub/Sub.

Aquí tienes algunos vínculos para obtener más información