Migrasi dari Apache Kafka ke Pubsub

1. Pengantar

Codelab ini adalah panduan langkah demi langkah untuk menunjukkan migrasi aplikasi dari Apache Kafka ke Google Cloud Pubsub menggunakan pendekatan Migrasi Bertahap.

Anda dapat mempelajari lebih lanjut perbedaan antara Kafka dan Pubsub serta pendekatan Migrasi Bertahap di sini.

Yang akan Anda build

Dalam demo ini, Anda akan:

  • Menyiapkan cluster Kafka yang dikelola sendiri di GCE
  • Men-deploy aplikasi Kafka sederhana yang melakukan streaming string acak
  • Menyiapkan Pub/Sub
  • Bermigrasi dari Kafka ke Pubsub menggunakan Pub/Sub Kafka Connector

Yang akan Anda pelajari

  • Cara menyiapkan cluster kafka yang dikelola sendiri di GCE
  • Cara memigrasikan aplikasi Kafka ke aplikasi Pub/Sub

Yang Anda butuhkan

  • Mengakses Google Cloud Platform (dengan izin tulis untuk BigQuery &Pub/Sub).
  • gcloud CLI sudah diinstal.
  • Java 8+ terinstal.

Biaya

Dalam dokumen ini, Anda akan menggunakan produk/layanan yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan, gunakan kalkulator harga.

2. Menyiapkan Kafka

Dalam codelab ini, kita akan memulai Kafka menggunakan ZooKeeper. Lingkungan lokal Anda harus telah menginstal Java 8+.

1. Menginstal Kafka

Download Kafka dan ekstrak. Rekomendasikan download biner untuk mengikuti:

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. Mulai penjaga kebun binatang

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

3. Mulai perantara

Untuk memulai layanan broker Kafka, buka sesi terminal lainnya dan jalankan:

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

4. Membuat topik kafka

Buat topik Kafka untuk aplikasi Kafka, buka sesi terminal baru, lalu jalankan:

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

5. Konfirmasi pembuatan topik

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

Output dari cmd di atas akan terlihat seperti di bawah ini:

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

3. Membuat Aplikasi Kafka

Dalam codelab ini, kita akan membuat aplikasi java kafka yang memiliki 1 produsen dan 2 konsumen. Produser secara berkala mengirimkan string acak dan stempel waktu ke topik kafka.

Untuk menunjukkan Migrasi bertahap, kita akan membuat 2 konsumen untuk aplikasi ini.

  • Konsumen 1 - Mencetak pesan yang sudah dibaca
  • Konsumen 2 - Menulis pesan ke BigQuery

Buka terminal baru dan jalankan perintah berikut. Jangan jalankan perintah ini di direktori download Kafka

1. Menetapkan Variabel Konstan

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

2. Mendownload src aplikasi Kafka

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

3. Mengonfigurasi dan mengautentikasi gcloud

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

4. Membuat tabel BigQuery

Tabel ini digunakan oleh konsumen kedua untuk menulis {i>output<i}. Definisi skema tabel adalah "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. Jalankan produser untuk mulai mengirim pesan ke topik

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

Log output akan terlihat seperti ini:

...
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. Menjalankan konsumen pertama yang logout dari pesan dalam topik ke konsol

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

Log output akan terlihat seperti ini:

...
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. Menjalankan konsumen kedua yang menulis pesan dari topik kafka ke tabel BigQuery

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

Log output akan terlihat seperti ini:

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

8. Mengonfirmasi bahwa pesan berhasil ditulis ke BigQuery di konsol GCP

8734b356c59543af.pngS

4. Menyiapkan Pub/Sub

1. Aktifkan Pub/Sub

gcloud services enable pubsub.googleapis.com

2. Membuat Topik Pub/Sub

Topik ini pada akhirnya akan menggantikan topik kafka. Untuk mempermudah, kita dapat menggunakan nama yang sama dengan topik kafka

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

5. Migrasi Bertahap

Setelah menyiapkan aplikasi Kafka dan memiliki topik Pub/Sub untuk migrasi, kami akan melanjutkan proses migrasi dari Kafka ke Pub/Sub.

Dalam demo migrasi ini, kami akan menggunakan Pub/Sub Kafka Connector milik Google Cloud Pub/Sub Group, yang memungkinkan Anda memigrasikan infrastruktur kafka secara bertahap.

Fase 1

Konfigurasikan konektor Pub/Sub untuk meneruskan semua pesan dari topik Kafka ke topik Pub/Sub

1. Dapatkan jar konektor kafka-to-pubsub dengan membuat repositori konektor

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

Anda akan melihat stoples yang dihasilkan di target/pubsub-group-kafka-connector-${VERSION}.jar jika berhasil.

Buat variabel dengan jalur lengkap ke jar.

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

2. Mengupdate konfigurasi Kafka yang terinstal dengan konfigurasi Kafka Connect

Mengubah direktori ke folder download kafka Anda dari file sebelumnya

cd kafka_2.13-3.5.1

Buka /config/connect-standalone.properties di folder download Kafka dan tambahkan jalur file dari jar konektor yang didownload ke plugin.path dan hapus tanda komentar pada baris jika diperlukan. Atau, Anda dapat menjalankan cmd di bawah

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

3. Buat CloudPubSubSinkConnector file konfigurasi dengan topik kafka, project pubsub, dan topik pubsub yang diperlukan untuk migrasi. Lihat contoh CloudPubSubSinkConnector file konfigurasi di sini.

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. Mulai konektor untuk mulai meneruskan pesan dari topik Kafka ke Pub/Sub

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

Pastikan di konsol GCP bahwa pesan diteruskan ke topik Pub/Sub Anda

Fase 2

Update aplikasi konsumen untuk menerima pesan dari topik Pub/Sub, sementara produser Anda terus memublikasikan pesan ke Kafka

1. Mengupdate konsumen yang mencetak pesan ke konsol untuk berlangganan Pub/Sub. Dalam contoh kafka-to-pubsub-demo src, SimplePubsubscriber1 diperbarui untuk membaca dari topik Pubsub.

Membuat langganan Pub/Sub

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

Menjalankan aplikasi pelanggan yang diupdate

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

Log output akan terlihat mirip dengan

...
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. Mengupdate konsumen yang melakukan operasi tulis ke BigQuery untuk berlangganan Pub/Sub. Dalam contoh kafka-to-pubsub-demo src, SimplePubsubscriber1 diperbarui untuk membaca dari topik Pubsub.

Membuat langganan Pub/Sub

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

Menjalankan aplikasi pelanggan yang diupdate

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

Log output akan terlihat mirip dengan

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

Fase 3

Mengupdate produser untuk langsung memublikasikan ke Pub/Sub

  1. Memperbarui produser Kafka src untuk menulis ke Pub/Sub, bukan ke Kafka. Pada contoh kafka-to-pubsub-demo src, SimplePubsubPublisher diupdate untuk mengirim pesan ke topik Pubsub.
  2. Hentikan konektor. Anda dapat menghentikan konektor dengan menghentikan konektor yang berjalan dalam sesi terminal kafka-connect
  3. Menjalankan aplikasi penayang yang diupdate
cd kafka-to-pubsub-demo
mvn exec:java \
  -Dexec.mainClass="org.pubsub.SimplePubsubPublisher" \
  -Dexec.args="$PROJECT_ID $TOPIC"

6. Selamat

Selamat, Anda berhasil menyelesaikan codelab tentang memigrasikan aplikasi Kafka yang dikelola sendiri ke Pub/Sub.

Berikut beberapa link untuk informasi lebih lanjut