Aerospike에서 Bigtable로 마이그레이션


이 튜토리얼에서는 Aerospike에서 Bigtable로 데이터를 마이그레이션하는 방법을 설명합니다. 이 튜토리얼에서는 Aerospike와 Bigtable의 차이점과 Bigtable에서 실행되도록 워크로드를 변환하는 방법을 설명합니다. Google Cloud에서 Aerospike와 비슷한 데이터베이스 서비스를 찾고 있는 데이터베이스 실무자를 위한 것입니다. 이 튜토리얼은 사용자가 데이터베이스 스키마, 데이터 유형, NoSQL의 기본 정보, 관계형 데이터베이스 시스템에 익숙하다고 가정합니다. 이 튜토리얼은 사전 정의된 작업을 실행하여 마이그레이션 작업 예시를 수행합니다. 이 튜토리얼을 완료한 후에는 제공된 코드 및 단계를 환경에 맞게 수정할 수 있습니다.

Bigtable은 대규모 분석 및 운영 워크로드를 위한 페타바이트 규모의 완전 관리형 NoSQL 데이터베이스 서비스입니다. 이 서비스는 우수한 가용성과 내구성을 갖춘 짧은 지연 시간 및 페타바이트 규모 서비스의 스토리지 엔진으로 사용할 수 있습니다. DataprocBigQuery와 같은 Google Cloud 데이터 분석 서비스를 사용하여 Bigtable의 데이터를 분석할 수 있습니다.

Bigtable은 AeroSpike 또는 Cassandra와 같은 NoSQL 데이터베이스로 구현된 광고 기술(ad tech), 금융 기술(fintech), 사물 인터넷(IoT) 서비스에 이상적입니다. NoSQL 관리 서비스가 필요한 경우 Bigtable을 사용하세요.

아키텍처

다음 참조 아키텍처 다이어그램은 Aerospike의 데이터를 Bigtable로 마이그레이션하는 데 사용할 수 있는 일반적인 구성요소를 보여줍니다.

Aerospike에서 Bigtable로의 데이터 전송 프로세스의 구성요소입니다.

앞의 다이어그램에서 Aerospike를 사용하는 온프레미스 환경에서 Google Cloud의 Bigtable로 데이터를 마이그레이션하는 방법은 두 가지입니다. 첫 번째 메서드는 일괄 처리를 사용하여 데이터를 마이그레이션합니다. 먼저 Aerospike 백업 데이터를 Cloud Storage 버킷으로 이동합니다. 백업 데이터가 Cloud Storage에 도착하면 Cloud Functions를 트리거하여 Dataflow를 사용해 일괄 추출, 변환, 로드(ETL) 프로세스를 시작합니다. Dataflow 작업은 백업 데이터를 Bigtable 호환 형식으로 변환하고 데이터를 Bigtable 인스턴스로 가져옵니다.

두 번째 메서드는 스트리밍 처리를 사용하여 데이터를 마이그레이션합니다. 이 메서드에서는 Aerospike 커넥트를 사용하는 Kafaka와 같은 메시지 큐를 사용하여 Aerospike에 연결할 수 있고, 메시지를 실시간으로 Google Cloud의 Pub/Sub에 전송할 수 있습니다. 메시지가 Pub/Sub 주제로 도착하면 Dataflow 스트리밍 작업에서 실시간으로 처리되어 데이터를 Bigtable 인스턴스로 변환하여 가져옵니다.

일괄 처리를 통해 대량의 데이터를 효율적으로 마이그레이션할 수 있습니다. 그러나 새 데이터베이스에 대한 서비스를 마이그레이션하고 업데이트하는 동안 상당한 컷오버 다운타임이 필요한 경우가 많습니다. 컷오버 다운타임을 최소화하려면 정상적인 컷오버가 완료될 때까지 백업 데이터와의 일관성을 유지하기 위해 첫 번째 일괄 처리 후 데이터를 점진적으로 마이그레이션 하기 위해 스트리밍 처리를 사용하는 것이 좋습니다. 이 문서에서는 컷오버 프로세스를 포함한 애플리케이션 예시를 포함하는 일괄 처리를 사용하여 Aerospike에서 마이그레이션할 수 있습니다.

Aerospike와 Bigtable 비교

데이터 마이그레이션을 시작하기 전에 Aerospike와 Bigtable 간의 데이터 모델 차이점을 이해하는 것이 중요합니다.

Bigtable 데이터 모델은 행 및 column family가 있는 분산형 다차원의 정렬된 키-값 맵입니다. 반대로, Aerospike 데이터 모델은 모든 레코드가 키로 고유하게 식별되는 행 기반 데이터베이스입니다. 모델 간의 차이점은 항목 속성을 그룹화하는 방법입니다. Bigtable은 관련 속성을 column family로 그룹화하고 Aerospike는 집합의 속성을 그룹화합니다. Aerospike는 Bigtable에 비해 더 많은 데이터 유형을 지원합니다. 예를 들어 Aerospike는 정수, 문자열, 목록, 맵을 지원합니다. Bigtable은 대부분의 경우 모든 데이터를 원시 바이트 문자열로 취급합니다.

Aerospike의 스키마는 유연하며 동일한 구간의 동적 값은 다른 유형을 가질 수 있습니다. Aerospike 또는 Bigtable을 사용하는 앱은 데이터베이스 엔진에 의존하지 않고 데이터 유형과 무결성 제약조건을 처리하는 등 유연성과 데이터 관리 책임이 비슷합니다.

Bookshelf 마이그레이션

Bookshelf 앱은 사용자가 도서 관련 정보를 저장하고 현재 데이터베이스에 저장된 모든 도서 목록을 볼 수 있는 웹 앱입니다. 앱에서는 도서 식별자(ID)를 사용하여 도서 정보를 검색합니다. 앱 또는 데이터베이스는 자동으로 이러한 ID를 생성합니다. 사용자가 도서의 이미지를 선택하면 앱의 백엔드가 데이터베이스에서 해당 도서의 세부정보를 로드합니다.

이 튜토리얼에서는 Aerospike를 사용하여 Bookshelf 앱의 데이터를 Bigtable로 마이그레이션합니다. 마이그레이션이 끝나면 Bigtable에서 도서에 액세스할 수 있습니다.

다음 다이어그램은 데이터가 Aerospike에서 Bigtable로 마이그레이션되는 방법을 보여줍니다.

데이터 마이그레이션 단계

앞의 다이어그램에서 데이터는 다음과 같은 방식으로 마이그레이션됩니다.

  1. 현재 Aerospike 데이터베이스의 도서 데이터를 백업하고 Cloud Storage 버킷으로 데이터를 전송합니다.
  2. 버킷에 백업 데이터를 업로드하면 Cloud 함수를 사용하여 Cloud Storage 업데이트 알림을 통해 as2bt Dataflow 작업이 자동으로 트리거됩니다.
  3. as2bt Dataflow 작업으로 데이터 마이그레이션이 완료되면 데이터베이스 백엔드를 Aerospike에서 Bigtable로 변경하여 Bookshelf 앱이 Bigtable 클러스터에서 도서 데이터를 로드합니다.

목표

  • Aerospike에서 Bigtable로 마이그레이션하기 위한 튜토리얼 환경을 배포합니다.
  • Cloud Storage의 Aerospike에서 앱 백업 데이터 세트 예시를 만듭니다.
  • Dataflow를 사용하여 데이터 스키마를 전송하고 Bigtable로 마이그레이션합니다.
  • Bigtable을 백엔드로 사용하도록 앱 구성 예시를 변경합니다.
  • Bigtable에서 Bookshelf 앱이 올바르게 실행되는지 확인합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

Bigtable 요금은 노드 시간, 저장되는 데이터 양, 사용하는 네트워크 대역폭의 양에 따라 결정됩니다. Bigtable 클러스터 및 기타 리소스의 비용을 추정하기 위해 가격 계산기를 사용할 수 있습니다. 가격 계산기의 예시 설정에서는 단일 노드 대신 3개의 Bigtable 노드를 사용합니다. 앞의 예시의 총 예상 비용은 이 튜토리얼의 실제 총 비용보다 큽니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  3. Cloud Resource Manager API 사용 설정

    API 사용 설정

    Terraform은 Cloud Resource Manager API를 사용하여 이 튜토리얼에 필요한 API를 사용 설정합니다.

  4. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

환경 준비

Aerospike를 Bigtable로 마이그레이션하기 위한 환경을 준비하려면 Cloud Shell에서 직접 다음 도구를 실행하세요.

  • Google Cloud CLI
  • gsutil 명령줄 도구
  • Bigtable 명령줄 도구, cbt
  • Terraform
  • Apache Maven

이러한 도구는 Cloud Shell에서 이미 사용할 수 있으므로 이러한 도구를 다시 설치할 필요가 없습니다.

프로젝트 구성

  1. Cloud Shell에서 Cloud Shell이 자동으로 구성하는 프로젝트 ID를 검사합니다. 명령 프롬프트가 현재 활성 프로젝트를 반영하도록 업데이트되어 USERNAME@cloudshell:~ (PROJECT_ID)$ 형식으로 표시됩니다.

    프로젝트 ID가 올바르게 구성되지 않은 경우 수동으로 구성할 수 있습니다.

    gcloud config set project <var>PROJECT_ID</var>
    

    PROJECT_ID를 Google Cloud 프로젝트 ID로 바꿉니다.

  2. us-east1을 리전으로 구성하고 us-east1-b를 영역으로 구성합니다.

    gcloud config set compute/region us-east1
    gcloud config set compute/zone us-east1-b
    

    리전과 영역에 대한 상세 설명은 위치 및 리전을 참조하세요.

튜토리얼 환경 배포

  1. Cloud Shell에서 코드 저장소를 클론합니다.

     git clone https://github.com/fakeskimo/as2bt.git/
    
  2. Cloud Shell에서 Terraform 작업 디렉터리를 초기화합니다.

    cd "$HOME"/as2bt/bookshelf/terraform
    terraform init
    
  3. 배포용 Terraform 환경 변수를 구성합니다.

    export TF_VAR_gce_vm_zone="$(gcloud config get-value compute/zone)"
    export TF_VAR_gcs_bucket_location="$(gcloud config get-value compute/region)"
    
  4. Terraform 실행 계획을 검토합니다.

    terraform plan
    

    출력은 다음과 비슷합니다.

    Terraform will perform the following actions:
    # google_bigtable_instance.bookshelf_bigtable will be created
    + resource "google_bigtable_instance" "bookshelf_bigtable" {
      + display_name  = (known after apply)
      + id            = (known after apply)
      + instance_type = "DEVELOPMENT"
      + name          = "bookshelf-bigtable"
      + project       = (known after apply)
      + cluster {
          + cluster_id   = "bookshelf-bigtable-cluster"
          + storage_type = "SSD"
          + zone         = "us-east1-b"
        }
    }
    
  5. (선택사항) Terraform이 배포하는 종속 항목을 포함하는 리소스를 시각화하려면 다음 그래프를 그립니다.

    terraform graph | dot -Tsvg > graph.svg
    
  6. 튜토리얼 환경 프로비저닝:

    terraform apply
    

튜토리얼 환경 및 Bookshelf 앱 확인

환경을 프로비저닝하고 데이터 마이그레이션 작업을 시작하기 전에 모든 리소스가 배포 및 구성되었는지 확인해야 합니다. 이 섹션에서는 프로비저닝 프로세스를 확인하는 방법을 설명하고 해당 환경에서 어떤 구성요소가 구성되는지를 이해하는 데 도움을 줍니다.

튜토리얼 환경 확인

  1. Cloud Shell에서 bookshelf-aerospike Compute Engine 인스턴스를 확인합니다.

    gcloud compute instances list
    

    출력은 인스턴스가 us-east1-b 영역에 배포되었음을 보여줍니다.

    NAME                 ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
    bookshelf-aerospike  us-east1-b  n1-standard-2               10.142.0.4   34.74.72.3   RUNNING
    
  2. bookshelf-bigtable Bigtable 인스턴스를 확인합니다.

    gcloud bigtable instances list
    

    출력은 다음과 비슷합니다.

    NAME                DISPLAY_NAME        STATE
    bookshelf-bigtable  bookshelf-bigtable  READY
    

    이 Bigtable 인스턴스는 이후 단계의 마이그레이션 대상으로 사용됩니다.

  3. bookshelf Cloud Storage 버킷이 Dataflow 파이프라인 작업에 있는지 확인합니다.

    gsutil ls -b gs://bookshelf-*
    

    Cloud Storage 버킷 이름은 전역에서 고유해야 하므로 버킷 이름은 무작위 서픽스로 생성됩니다. 출력은 다음과 비슷합니다.

    gs://bookshelf-616f60d65a3abe62/
    

Bookshelf 앱에 도서 추가

  1. Cloud Shell에서 bookshelf-aerospike 인스턴스의 외부 IP 주소를 가져옵니다.

    gcloud compute instances list --filter="name:bookshelf-aerospike" \
        --format="value(networkInterfaces[0].accessConfigs.natIP)"
    

    IP 주소는 다음 단계에서 필요하므로 기록해 둡니다.

  2. Bookshelf 앱을 열려면 웹브라우저에서 http://IP_ADDRESS:8080으로 이동합니다.

    IP_ADDRESS를 이전 단계에서 복사한 외부 IP 주소로 바꿉니다.

  3. 새 도서를 만들려면 도서 추가를 클릭합니다.

  4. 도서 추가 창에서 다음 입력란을 작성하고 저장을 클릭합니다.

    • 제목 필드에 Aerospike-example을 입력합니다.
    • 저자 필드에 Aerospike-example을 입력합니다.
    • 게시일 필드에 오늘 날짜를 입력합니다.
    • 설명 필드에 Aerospike-example을 입력합니다.

    이 도서는 Bookshelf 앱이 Aerospike를 도서 스토리지로 사용하고 있는지 확인하는 데 사용됩니다.

  5. Bookshelf 앱 URL에서 도서 ID를 기록해 둡니다. 예를 들어 URL이 34.74.80.160:8080/books/10000이면 도서 ID는 10000입니다.

    URL의 책 ID

  6. Cloud Shell에서 SSH를 사용하여 bookshelf-aerospike 인스턴스에 연결합니다.

    gcloud compute ssh bookshelf-aerospike
    
  7. bookshelf-aerospike 인스턴스 세션에서 이전에 기록한 도서 ID로 새 책이 생성되었는지 확인합니다.

    aql -c 'select * from bookshelf.books where id = "BOOK_ID"'
    

    출력은 다음과 비슷합니다.

    +----------------------+----------------------+---------------+----------------------+----------+---------+
    | title                | author               | publishedDate | description          | imageUrl | id      |
    +----------------------+----------------------+---------------+----------------------+----------+---------+
    | " Aerospike-example" | " Aerospike-example" | "2000-01-01"  | " Aerospike-example" | ""       | "10000" |
    +----------------------+----------------------+---------------+----------------------+----------+---------+
    1 row in set (0.001 secs)
    

    도서 ID가 목록에 없는 경우 새 도서 추가에 단계를 반복합니다.

Aerospike에서 Cloud Storage로 백업 데이터 전송

  1. Cloud Shell의 bookshelf-aerospike 인스턴스 세션에서 Aerospike 백업 파일을 만듭니다.

    aql -c "select * from bookshelf.books" --timeout=-1 --outputmode=json \`
        | tail -n +2 | jq -c '.[0] | .[]' \
        | gsutil cp - $(gsutil ls -b gs://bookshelf-*)bookshelf-backup.json
    

    이 명령어는 데이터를 처리하고 다음 프로세스를 통해 백업 파일을 만듭니다.

    • Aerospike에서 도서 정보를 선택하고 JSON prettyprint 형식으로 출력합니다.
    • 출력에서 처음 두 제목을 삭제하고 명령줄 JSON 프로세서인 jq를 사용하여 데이터를 줄바꿈으로 구분된 JSON(ndjson ) 형식으로 변환합니다.
    • gsutil 명령줄 도구를 사용하여 데이터를 Cloud Storage 버킷에 업로드합니다.
  2. Aerospike 백업 파일이 업로드되고 Cloud Storage 버킷에 있는지 확인합니다.

    gsutil ls gs://bookshelf-*/bookshelf-*\
        gs://bookshelf-616f60d65a3abe62/bookshelf-backup.json
    
  3. (선택사항) Cloud Storage 버킷에서 백업 파일 콘텐츠를 검토합니다.

    gsutil cat -r 0-1024 gs://bookshelf-*/bookshelf-backup.json | head -n 2
    

    출력은 다음과 비슷합니다.

    {"title":"book_2507","author":"write_2507","publishedDate":"1970-01-01","imageUrl":"https://storage.googleapis.com/aerospike2bt-bookshelf/The_Home_Edit-2019-06-24-044906.jpg","description":"test_2507","createdBy":"write_2507","createdById":"2507_anonymous","id":"2507"}
    {"title":"book_3867","author":"write_3867","publishedDate":"1970-01-01","imageUrl":"https://storage.googleapis.com/aerospike2bt-bookshelf/The_Home_Edit-2019-06-24-044906.jpg","description":"test_3867","createdBy":"write_3867","createdById":"3867_anonymous","id":"3867"}
    
  4. SSH 세션을 종료하고 Cloud Shell로 돌아갑니다.

    exit
    

Dataflow를 사용하여 Bigtable로 백업 데이터 마이그레이션

이제 Cloud Storage에서 Bigtable 인스턴스로 백업 데이터를 마이그레이션할 수 있습니다. 이 섹션에서는 Dataflow 파이프라인을 사용하여 Bigtable 스키마와 호환되는 데이터를 마이그레이션하는 방법을 설명합니다.

Dataflow 마이그레이션 작업 구성

  1. Cloud Shell에서 예시 코드 저장소의 dataflow 디렉터리로 이동합니다.

    cd "$HOME"/as2bt/dataflow/
    
  2. Dataflow 작업의 환경 변수를 구성합니다.

    export BOOKSHELF_BACKUP_FILE="$(gsutil ls
    gs://bookshelf*/bookshelf-backup.json)"
    export BOOKSHELF_DATAFLOW_ZONE="$(gcloud config get-value compute/zone)"
    
  3. 환경 변수가 올바르게 구성되었는지 확인합니다.

    env | grep BOOKSHELF
    

    환경 변수가 올바르게 구성되면 출력은 다음과 비슷합니다.

    BOOKSHELF_BACKUP_FILE=gs://bookshelf-616f60d65a3abe62/bookshelf-backup.json
    BOOKSHELF_DATAFLOW_ZONE=us-east1-b
    

Dataflow 작업 실행

  1. Cloud Shell에서 Cloud Storage에서 Bigtable 인스턴스로 데이터를 마이그레이션합니다.

    ./run_oncloud_json.sh
    
  2. 백업 데이터 마이그레이션 작업을 모니터링하려면 Google Cloud Console에서 작업 페이지로 이동합니다.

    작업으로 이동

    작업이 성공적으로 완료될 때까지 기다립니다. 작업이 성공적으로 완료되면 Cloud Shell의 출력은 다음과 비슷합니다.

    Dataflow SDK version: 2.13.0
    Submitted job: 2019-12-16_23_24_06-2124083021829446026
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  08:20 min
    [INFO] Finished at: 2019-12-17T16:28:08+09:00
    [INFO] ------------------------------------------------------------------------
    

마이그레이션 작업 결과 확인

  • Cloud Shell에서 백업 데이터가 Bigtable로 올바르게 전송되었는지 확인합니다.

    cbt -instance bookshelf-bigtable lookup books 00001
    

    출력은 다음과 비슷합니다.

      ----------------------------------------
    00001
      info:author                              @ 2019/12/17-16:26:04.434000
        "Aerospike-example"
      info:description                         @ 2019/12/17-16:26:04.434000
        "Aerospike-example"
      info:id                                  @ 2019/12/17-16:26:04.434000
        "00001"
      info:imageUrl                            @ 2019/12/17-16:26:04.434000
        ""
      info:publishedDate                       @ 2019/12/17-16:26:04.434000
        "2019-10-01"
      info:title                               @ 2019/12/17-16:26:04.434000
        "Aerospike-example"
    

Bookshelf 데이터베이스를 Aerospike에서 Bigtable로 변경

Aerospike의 데이터를 Bigtable로 마이그레이션한 후 Bookshelf 앱 구성을 변경하여 Bigtable을 스토리지로 사용할 수 있습니다. 이 구성을 설정하면 새 책이 Bigtable 인스턴스에 저장됩니다.

Bookshelf 앱 구성 변경

  1. Cloud Shell에서 SSH를 사용하여 bookshelf-aerospike 앱에 연결합니다.

    gcloud compute ssh bookshelf-aerospike
    
  2. 현재 DATA_BACKEND 구성이 aerospike인지 확인합니다.

    grep DATA_BACKEND /opt/app/bookshelf/config.py
    

    출력은 다음과 같습니다.

    DATA_BACKEND = 'aerospike'
    
  3. DATA_BACKEND 구성을 aerospike에서 bigtable로 변경합니다.

    sudo sed -i "s/DATA_BACKEND =.*/DATA_BACKEND = 'bigtable'/g" /opt/app/bookshelf/config.py
    
  4. DATA_BACKEND 구성이 bigtable으로 변경되었는지 확인합니다.

    grep DATA_BACKEND /opt/app/bookshelf/config.py
    

    출력은 다음과 같습니다.

    DATA_BACKEND = 'bigtable'
    
  5. 새로운 bigtable 백엔드 구성을 사용하는 Bookshelf 앱을 다시 시작합니다.

    sudo supervisorctl restart bookshelf
    
  6. Bookshelf 앱이 다시 시작되었고 올바르게 실행 중인지 확인합니다.

    sudo supervisorctl status bookshelf
    

    출력은 다음과 비슷합니다.

    bookshelf  RUNNING   pid 18318, uptime 0:01:00
    

Bookshelf 앱이 Bigtable 백엔드를 사용하는지 확인

  1. 브라우저에서 http://IP_ADDRESS:8080로 이동합니다.
  2. Bigtable-example라는 새 도서를 추가합니다.

  3. Bigtable-example 도서가 Bookshelf 앱의 Bigtable 인스턴스에서 생성되었는지 확인하려면 브라우저의 주소 표시줄에서 도서 ID를 복사합니다.

  4. Cloud Shell에서 Bigtable 인스턴스의 Bigtable-example 도서 데이터를 조회합니다.

    cbt -instance bookshelf-bigtable lookup books 7406950188
    

    출력은 다음과 비슷합니다.

    ----------------------------------------
    7406950188
      info:author                              @ 2019/12/17-17:28:25.592000
        "Bigtable-example"
      info:description                         @ 2019/12/17-17:28:25.592000
        "Bigtable-example"
      info:id                                  @ 2019/12/17-17:28:25.592000
        "7406950188"
      info:image_url                           @ 2019/12/17-17:28:25.592000
        ""
      info:published_date                      @ 2019/12/17-17:28:25.592000
        "2019-10-01"
      info:title                               @ 2019/12/17-17:28:25.592000
        "Bigtable-example"
    

Aerospike에서 Bigtable로의 데이터 마이그레이션을 성공적으로 수행하고 Bookshelf 구성을 Bigtable 백엔드에 연결하도록 변경했습니다.

삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 Google Cloud 프로젝트를 삭제하는 것입니다. 또는 개별 리소스를 삭제할 수 있습니다.

프로젝트 삭제

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계