Pub/Sub 라이트에서 BigQuery용 Apache Kafka로 마이그레이션

이 문서에서는 Pub/Sub Lite 주제에서 BigQuery용 Apache Kafka 주제로 데이터를 마이그레이션하는 방법을 자세히 설명합니다.

시작하기 전에

  1. Google Kubernetes Engine API를 사용 설정합니다.
  2. 마이그레이션할 Pub/Sub 라이트 주제를 식별합니다. BigQuery용 Apache Kafka에서 대상 주제의 이름을 선택합니다. 또한 마이그레이션할 BigQuery용 Apache Kafka 클러스터도 결정합니다.

마이그레이션 워크플로

데이터를 마이그레이션하려면 다음 태스크를 수행합니다. 이러한 태스크에 대한 자세한 세부정보는 이 페이지의 뒷부분에 나와 있습니다.

  1. Google Kubernetes Engine 서비스 계정 만들기
  2. Google Kubernetes Engine 클러스터 만들기
  3. 주제의 구성 세부정보로 Docker 이미지 맞춤설정
  4. Google Kubernetes Engine 클러스터에 Docker 이미지를 배포합니다.

    이미지 내에서 Kafka Connect 및 Kafka Connect용 Pub/Sub 라이트 플러그인을 사용하여 새 Pub/Sub 라이트를 구독하고 BigQuery용 Apache Kafka에 게시합니다.

Google Kubernetes Engine 서비스 계정 만들기

이 섹션에서는 Google Kubernetes Engine 클러스터를 실행하는 데 필요한 권한이 있는 IAM 서비스 계정을 만드는 방법을 설명합니다.

  1. Google Cloud 콘솔에서 Google Kubernetes Engine을 작동하는 데 필요한 최소 권한으로 새 IAM 서비스 계정 만들기를 수행합니다.

  2. 서비스 계정에 다음 추가 IAM 역할을 부여합니다. 이러한 역할은 원활한 마이그레이션 프로세스를 위해 필요합니다.

    • 관리형 Kafka 클라이언트 역할(roles/managedkafka.client)
    • Pub/Sub 라이트 구독자 역할(roles/pubsublite.subscriber)
    • Pub/Sub 라이트 뷰어 역할(roles/pubsublite.Viewer)
    • Artifact Registry 리더 역할(roles/artifactregistry.reader)

GKE 클러스터 만들기

이 섹션에서는 이전 단계에서 만든 서비스 계정을 사용하는 GKE 클러스터를 만드는 방법을 설명합니다.

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 만들기를 클릭합니다.

    Autopilot 클러스터 만들기 페이지가 나타납니다.

  3. 고급 설정 탭에서 해당 서비스 계정을 이전 단계에서 만든 IAM 서비스 계정으로 변경합니다.

  4. 선택적으로 필요에 따라 다른 설정을 구성합니다.

  5. 만들기를 클릭하여 클러스터를 만듭니다.

Kafka Connect Docker 이미지 만들기

이 섹션에서는 주제에 대한 Kafka Connect Docker 이미지를 만들고 맞춤설정하는 방법을 설명합니다.

  1. Pub/Sub 라이트 마이그레이션 GitHub 저장소를 클론합니다.
  2. 앞에서 만든 IAM 서비스 계정의 경우 json 계정 키를 생성합니다.

    base64 도구를 사용하여 json 키를 인코딩합니다. 예를 들면 다음과 같습니다.

    Linux

    base64 -w 0 < my_service_account.json > password.txt
    

    Mac

    base64 < account_key_json > password.txt
    
  3. GitHub 저장소의 보안 비밀 파일에서 다음 파일을 적절한 정보로 업데이트하여 저장소를 Google Cloud 프로젝트, Pub/Sub 라이트, Kafka에 연결합니다.

    .gcp/gmk_sasl_service_account → sensitive
    <service-account-name>@<gcp-project>.iam.gserviceaccount.com
    
    .gcp/gmk_sasl_service_account_key → sensitive
    <base64 encoded sasl service account key>
    
    .gcp/kafka_ssl_truststore_location → sensitive
    <full path of the ssl truststore jks file location>
    
    .gcp/kafka_ssl_truststore_password → sensitive
    <password for the ssl truststore jks>
    
    .gcp/gmk_bootstrap_servers → environment specific
    bootstrap.<google-managed-kafka-cluster-name>.<google-managed-kafka-cluster-region name>.managedkafka.<google-managed-cluster-host-project-name>.cloud.goog:9092
    
    .gcp/kafka_connect_group_id → environment specific
    <Kafka Connect group id (unique per worker group) for the Kafka connect workers in distributed mode>
    
    .gcp/kafka_config_storage_topic → environment specific
    <Kafka topic name used by Kafka Connect for tracking the config>
    
    .gcp/kafka_offset_storage_topic → environment specific
    <Kafka topic name used by Kafka Connect for tracking the offsets>
    
    .gcp/kafka_status_storage_topic → environment specific
    <Kafka topic name used by Kafka Connect for tracking the status>
    
    .gcp/kafka_sink_topic → environment specific
    <target sink Kafka topic name used by Kafka Connect for migrating the data from the Pub/Sub Lite topic>
    
    .gcp/pubsub_lite_gcp_project → environment specific
    <Google Cloud project that hosts the Pub/Sub Lite source subscription to be used for migrating the Pub/Sub Lite topic to sink the Kafka topic>
    
    .gcp/pubsub_lite_gcp_location → environment specific
    <Google Cloud location for the Pub/Sub Lite source subscription tor migrate the Pub/Sub Lite topic to sink Kafka topic>
    
    .gcp/pubsub_lite_subscription → environment specific
    <Pub/Sub Lite source subscription name to be used for migrating the pubsub lite topic to Kafka topic>
    
  4. docker/build-image.sh 파일을 실행하여 Docker 이미지를 빌드합니다.

    ./push-image.sh
    
  5. docker/push-image.sh 이미지를 Google Cloud 프로젝트 이름으로 업데이트합니다.

  6. docker/push-image.sh 파일을 실행하여 이미지를 Artifact Registry로 푸시합니다.

    ./push-image.sh
    

Kafka Connect 워크로드 배포

이 섹션에서는 Kafka Connect Docker 이미지를 Google Kubernetes Engine 클러스터에 배포하는 방법을 설명합니다.

  1. 인증 플러그인으로 kubectl을 설치하고 구성합니다.
  2. Google Kubernetes Engine 클러스터에 대해 kubeconfig를 생성합니다.
  3. Google Kubernetes Engine 서비스 계정을 만들고 IAM 계정을 가장할 수 있는 올바른 권한을 부여합니다.

    $KSA_NAME = KUBERNETES_SERVICE_ACCOUNT_NAME
    $PROJECT_ID = GOOGLE_CLOUD_PROJECT_ID
    $IAM_SA_NAME = IAM_SERVICE_ACCOUNT_NAME
    
    kubectl create serviceaccount $KSA_NAME \
        --namespace=default
    
    gcloud iam service-accounts add-iam-policy-binding \
    $IAM_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:$PROJECT_ID.svc.id.goog[default/$KSA_NAME]"
    
    kubectl annotate serviceaccount $KSA_NAME \
        --namespace default \
    iam.gke.io/gcp-service-account=$IAM_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    
  4. 텍스트 편집기에서 K8s.yaml 파일을 열고 다음 값을 업데이트합니다.

    1. <workflow_name>을 Kafka Connect 워크플로의 이름으로 바꿉니다.
    2. <gke_service_account>를 Google Kubernetes Engine 서비스 계정 이름으로 바꿉니다.
  5. K8s.yaml 파일을 실행합니다.

    kubectl create -f k8s.yaml
    

    그러면 Google Kubernetes Engine 클러스터에서 실행되는 Kafka Connect 워크로드가 생성되고 Pub/Sub 라이트 주제에서 BigQuery용 Apache Kafka로 데이터를 이동하기 위해 Pub/Sub 라이트 커넥터가 실행됩니다.

작업 모니터링

작업이 실행되면 Kafka Connect REST 엔드포인트에 연결하여 작업을 검사할 수 있습니다.

  1. Google Cloud 콘솔에서 배포 세부정보 > 워크로드 페이지로 이동합니다.
  2. Kubernetes 배포를 클릭합니다.

    배포 세부정보 페이지가 열립니다.

  3. 서비스 노출에서 노출을 클릭한 후 포트 8083을 추가합니다.

  4. 포트 전달을 사용 설정합니다.

    포트 전달을 설정할 때 가져오는 기본 링크는 다음과 비슷한 출력을 반환합니다.

    {"version":"3.4.0","commit":"2e1947d240607d53","kafka_cluster_id":"6H6qWA0dQnuK31hBPqYUDg"}
    

    링크에 /connectors를 추가하면 실행 중인 커넥터가 나열됩니다. 예를 들면 다음과 같습니다.

    ["PubSubLiteSourceConnector"]
    

    예를 들어 이 링크 url:8083/connectors/PubSubLiteSourceConnector/status를 선택하면 태스크 목록과 그 상태가 표시됩니다.

    {"name":"PubSubLiteSourceConnector","connector":{"state":"RUNNING","worker_id":"10.53.0.157:8083"},"tasks":[{"id":0,"state":"RUNNING","worker_id":"10.53.0.139:8083"},{"id":1,"state":"RUNNING","worker_id":"10.53.0.157:8083"},{"id":2,"state":"RUNNING","worker_id":"10.53.0.139:8083"},{"id":3,"state":"RUNNING","worker_id":"10.53.0.157:8083"},{"id":4,"state":"RUNNING","worker_id":"10.53.0.157:8083"},{"id":5,"state":"RUNNING","worker_id":"10.53.0.139:8083"},{"id":6,"state":"RUNNING","worker_id":"10.53.0.139:8083"},{"id":7,"state":"RUNNING","worker_id":"10.53.0.157:8083"},{"id":8,"state":"RUNNING","worker_id":"10.53.0.139:8083"},{"id":9,"state":"RUNNING","worker_id":"10.53.0.157:8083"}],"type":"source"}
    

단계별 마이그레이션

Pub/Sub 라이트 주제가 Kafka로 마이그레이션된 후 구독자와 게시자를 마이그레이션할 수 있습니다. 이렇게 하려면 다음 단계를 수행합니다.

  1. 구독자 마이그레이션. Pub/Sub 라이트 주제 대신 Kafka 주제를 사용하도록 구독자를 업데이트합니다.

    이 작업은 통제된 개발 환경에서 점진적으로 수행해야 합니다.

    이상적으로는 두 개의 구독자 집합을 유지하여 Kafka 및 Pub/Sub 라이트 모두에서 동일한 메시지가 수신되는지 확인해야 합니다. 올바른 동작이 확인되었으면 Pub/Sub 라이트 구독자를 사용 중단할 수 있습니다.

  2. 게시자 마이그레이션. Pub/Sub 라이트 주제 대신 Kafka 주제에 직접 게시하도록 게시자를 업데이트합니다.

    구독자 마이그레이션과 비슷하게, 통제된 개발 환경에서 점진적으로 이 작업을 수행해야 합니다. 중복 데이터가 문제가 되지 않으면 두 게시자 집합을 유지하여 동작을 확인할 수 있습니다. 동작을 확인한 후 Pub/Sub 라이트 게시자를 사용 중단합니다.

  3. 모든 구독자와 게시자가 마이그레이션된 후 워크로드와 클러스터를 삭제하여 마이그레이션 도구를 사용 중단합니다.

  4. 원본 Pub/Sub 라이트 주제를 삭제합니다.

다음 단계