Firestore로 자동 업그레이드

이 페이지에서는 기존 Cloud Datastore에서 Datastore 모드의 Firestore로의 업그레이드 경로를 설명합니다.

Firestore는 Datastore 모드로 작동할 수 있으며, 기존 Cloud Datastore와 하위 호환됩니다. Datastore 모드의 Firestore에서는 Datastore 시스템 동작을 유지하면서 Firestore의 향상된 스토리지 레이어에 액세스할 수 있습니다. Datastore 모드의 Firestore는 다음 기존 Cloud Datastore 제한사항을 제거합니다.

  • 쿼리가 더 이상 eventual consistency를 갖지 않습니다. 대신 eventual consistency를 명시적으로 요청하지 않는 한 strong consistency를 가집니다.
  • 트랜잭션의 쿼리는 더 이상 상위 쿼리일 필요가 없습니다1.
  • 트랜잭션이 더 이상 25개의 항목 그룹으로 제한되지 않습니다1.
  • 항목 그룹에 대한 쓰기가 더 이상 초당 1회로 제한되지 않습니다1.

Datastore 모드에 대한 자세한 내용은 Datastore 모드의 Firestore를 참조하세요.

2021년 6월부터 기존 Cloud Datastore에서 Datastore 모드의 Firestore로 마이그레이션이 시작되었습니다. 마이그레이션은 트래픽이 매우 낮은 데이터베이스에서 시작되며 앞으로 몇 개월에 걸쳐 트래픽이 더 높은 데이터베이스로 확장합니다.

1 항목 그룹을 사용한 낙관적 동시 실행 모드로 마이그레이션되는 데이터베이스에는 Datastore 모드의 Firestore에서 여전히 25개의 항목 그룹 트랜잭션 한도와 초당 1회의 쓰기 한도가 적용됩니다. 트랜잭션의 쿼리가 상위 쿼리여야 합니다. 자세한 내용은 항목 그룹을 사용한 낙관적 동시 실행 모드 섹션을 참조하세요.

Datastore 모드의 Firestore로 자동 업그레이드

기존 Cloud Datastore를 사용하는 애플리케이션을 관리하는 경우 애플리케이션 코드를 업데이트할 필요가 없습니다. 애플리케이션이 Datastore 모드의 Firestore로 업그레이드되는 일정에 대해 알림이 제공됩니다. 업그레이드에는 다운타임이 필요하지 않습니다.

자동 업그레이드 프로세스에 대한 추가 질문이 있으면 지원 채널 중 하나에 문의하세요.

데이터베이스 유형 보기

gcloud alpha firestore databases describe 명령어를 사용하여 데이터베이스 유형을 볼 수 있습니다. 출력에서 type 필드를 찾습니다.

  • type: DATASTORE_MODE

    데이터베이스 유형은 Datastore 모드의 Firestore입니다. 업그레이드가 필요 없거나 이미 업그레이드가 완료된 상태입니다.

  • type이 출력에 없음

    데이터베이스 유형은 기존 Cloud Datastore입니다. 데이터베이스가 Datastore 모드의 Firestore로 업그레이드됩니다.

  • type: FIRESTORE_NATIVE

    데이터베이스 유형은 Native 모드의 Firestore입니다.

업그레이드 단계

대략적으로 다음 절차에 따라 기존 Cloud Datastore 데이터베이스를 Datastore 모드의 Firestore로 업그레이드합니다. 이 프로세스에는 애플리케이션 다운타임이 필요하지 않습니다.

  1. Datastore 모드의 새로운 Firestore 데이터 복제본을 기존 Cloud Datastore 데이터베이스에 추가합니다. Datastore 모드의 Firestore에 비동기식으로 항목 쓰기 작업을 복제합니다.

  2. 기존 데이터 및 색인 항목을 기존 Cloud Datastore에서 Datastore 모드의 Firestore로 복사합니다. 복사 후 데이터를 확인합니다.

  3. 항목 읽기를 Datastore 모드의 Firestore로 직접 리디렉션합니다. 먼저 eventual consistency를 가진 읽기를 리디렉션한 후 strong consistency를 가지는 읽기를 리디렉션합니다.

  4. 항목 쓰기 및 트랜잭션 읽기를 Datastore 모드의 Firestore로 직접 리디렉션합니다.

이 프로세스는 다음 단계를 사용합니다.

1. 동기식으로 쓰기 적용

이 단계에서는 쓰기를 기존 Cloud Datastore에 동기식으로 적용합니다. 항목 및 색인에 대한 모든 변경사항이 하나 이상의 복제본에 적용될 때까지 쓰기는 성공을 보고하지 않습니다. 이렇게 하면 쓰기를 동기식으로 적용하는 Datastore 모드의 Firestore 동작이 시뮬레이션됩니다. 또한 커밋한 후 쓰기를 비동기식으로 적용하는 기존 Cloud Datastore의 기본 동작과는 다릅니다.

이 단계는 업그레이드 전에 Datastore 모드의 Firestore에서 동기식 적용의 지연 영향을 표시하기 위한 것입니다. 동기식 쓰기는 마이그레이션 도중 및 마이그레이션 후에 계속 적용됩니다.

활동이 거의 없는 데이터베이스는 이 단계를 건너뜁니다. 이 단계가 데이터베이스 업그레이드에 포함되어 있는지 확인하려면 APPLY_WRITES_SYNCHRONOUSLY 단계의 [로그]를 검사합니다.

2. 복사 및 확인

이 단계는 마이그레이션 시작을 나타냅니다. Datastore 모드의 Firestore 복제본을 도입하고 다음 단계를 수행합니다.

  1. 저널

    또한 기존 Cloud Datastore에 대한 항목 쓰기 작업은 사이드 채널을 통해 Datastore 모드의 Firestore 복제본으로 이동하기 시작합니다. 이 작업은 기존 Cloud Datastore 기존 복제 시스템의 일부로 수행됩니다. 이러한 쓰기 작업은 쓰기 지연 시간에 영향을 미치지 않습니다. Datastore 모드의 Firestore 복제본은 이러한 쓰기 작업을 버퍼링하여 복사 단계 후에 적용합니다.

  2. 복사

    Datastore 모드의 Firestore 복제본에서 기존 데이터 및 색인 항목의 오프라인 사본을 만듭니다. 복사 단계는 기존 Cloud Datastore 작업에 영향을 주지 않습니다. 이 단계는 며칠 정도 걸릴 수 있습니다.

  3. 드레이닝 업무 일지

    업무 일지 단계의 읽기를 오프라인 사본의 데이터에 적용합니다.

  4. 데이터 확인

    기존 Cloud Datastore의 데이터와 비교하여 Datastore 모드의 Firestore 데이터를 다시 확인합니다.

3. eventual consistency를 가진 읽기 리디렉션

Datastore 모드의 Firestore에서 eventual consistency를 가진 읽기(상위 필터가 없는 쿼리)를 제공합니다. 이 시점에도 읽기에 대한 기존 Cloud Datastore 시맨틱스가 계속 적용됩니다.

  • 상위 쿼리는 strong consistency를 가집니다.
  • 상위 쿼리가 아닌 쿼리는 eventual consistency를 가집니다.
  • Lookup은 strong consistency를 가집니다. 단, eventual consistency를 위해 명시적으로 구성된 경우는 예외입니다.

Datastore 모드의 Firestore는 계속해서 기존 Cloud Datastore 데이터의 복제본으로 작동합니다.

4. strong consistency를 가진 읽기 리디렉션

Datastore 모드의 Firestore에서 strong consistency를 가진 읽기(비트랜잭션)를 제공합니다. 읽기에 대한 기존 Cloud Datastore 시맨틱스는 계속 적용됩니다. 이제 Firestore에서 직접 읽기가 시작되더라도 Firestore는 기존 Cloud Datastore를 사용하여 strong consistency를 가진 읽기에 대해 최신 상태를 유지합니다.

5. 쓰기 리디렉션

항목 쓰기 및 트랜잭션 읽기를 Datastore 모드의 Firestore로 리디렉션합니다. 동일한 항목을 동시에 수정하면 트랜잭션이 계속 중단됩니다. 동일한 항목 그룹 내의 여러 항목을 동시에 수정해도 트랜잭션이 중단되지 않습니다.

이 단계가 시작될 때 Datastore 모드의 Firestore는 여전히 기존 Cloud Datastore를 사용하여 쓰기가 수행되기 전에 최신 상태를 유지합니다. 모든 이전 쓰기가 적용되도록 하는 최종 패스 이후, Datastore 모드의 Firestore가 기존 Cloud Datastore 컨설팅을 중지합니다.

6. 마이그레이션 완료

읽기에 대한 Datastore 모드의 Firestore 시맨틱스가 적용됩니다. 모든 쿼리는 strong consistency를 가집니다.

가격은 그대로 유지되지만 결제에 Firestore SKU가 포함됩니다. App Engine 할당량 페이지에 기존 Cloud Datastore 사용량 대신 Firestore 사용량이 표시됩니다.

트랜잭션

Datastore 모드의 Firestore에서는 세 가지 동시 실행 모드를 지원합니다.

  • 낙관적

    대부분의 기존 Cloud Datastore 데이터베이스는 Datastore 모드의 Firestore에서 트랜잭션에 낙관적 동시 실행을 사용합니다. 낙관적 동시 실행은 기존 Cloud Datastore의 기존 트랜잭션 동작을 보존합니다.

  • 항목 그룹을 사용한 낙관적

    항목 그룹 트랜잭션 시맨틱스를 사용하는 데이터베이스는 이 동시 실행 모드로 마이그레이션됩니다. 자세한 내용은 항목 그룹을 사용한 낙관적 동시 실행 모드 섹션을 참조하세요.

  • 비관적

    이전에 마이그레이션된 활동이 거의 없는 데이터베이스는 Datastore 모드의 Firestore 트랜잭션에 대해 비관적 잠금을 사용하여 마이그레이션되었습니다.

동시 실행 모드는 Firestore projects.databases REST 리소스를 통해 액세스할 수 있습니다.

curl -X GET -H "Authorization: Bearer "$(gcloud auth print-access-token) \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases"

PREPARE 단계의 로그를 검사하여 동시 실행 모드를 찾을 수도 있습니다.

항목 그룹을 사용한 낙관적 동시 실행 모드

항목 그룹의 쿼리, 트랜잭션, 쓰기 처리량 제한을 사용하여 낙관적을 삭제하려면 프로젝트의 동시 실행 모드를 낙관적으로 변경합니다. 이 변경사항이 프로젝트와 호환되는지 확인하려면 다음 안내를 따르세요.

  1. Datastore 모드의 Firestore에서 테스트 프로젝트를 만듭니다.

  2. 테스트 프로젝트의 동시 실행 모드를 OPTIMISTIC으로 변경합니다. 다음과 같이 HTTP PATCH 요청을 실행합니다.

  3. 테스트 프로젝트에서 테스트를 실행하여 워크로드가 항목 그룹 없이 예상대로 작동하는지 확인합니다.

  4. 기본 프로젝트의 동시 실행 모드를 OPTIMISTIC_WITH_ENTITY_GROUPS에서 OPTIMISTIC으로 변경합니다.

데이터베이스 동시 실행 모드를 변경하는 HTTP PATCH 요청:

curl --request PATCH \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"concurrencyMode":"OPTIMISTIC"}' \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/(default)?updateMask=concurrencyMode"

로깅 및 진행률 알림

업그레이드 프로세스는 Cloud Logging을 사용하여 진행 상황 업데이트를 게시합니다. 로그를 보려면 로그 탐색기, Cloud Logging API 또는 Google Cloud CLI를 사용합니다.

업데이트는 datastore.googleapis.com 로깅 서비스 이름의 두 로그에 게시됩니다.

로그 이름 모니터링 리소스 페이로드
migration_state datastore_database type.googleapis.com/google.datastore.admin.v1.MigrationStateEvent
migration_progress datastore_database type.googleapis.com/google.datastore.admin.v1.MigrationProgressEvent

migration_state 로그는 업그레이드의 전체 상태가 변경되면 업데이트됩니다(RUNNINGCOMPLETE).

migration_progress 로그는 업그레이드가 새 단계(PREPARE, START, APPLY_WRITES_SYNCHRONOUSLY, COPY_AND_VERIFY, REDIRECT_EVENTUALLY_CONSISTENT_READS, REDIRECT_STRONGLY_CONSISTENT_READS, REDIRECT_WRITES)로 이동할 때마다 업데이트됩니다.

업그레이드가 진행되는 동안 알림을 받으려면 두 로그를 기반으로 로그 기반 측정항목을 만들고 해당 측정항목을 기반으로 알림을 만들면 됩니다.

Google Cloud 콘솔의 마이그레이션 배너

기존 Cloud Datastore 데이터베이스가 마이그레이션 프로세스를 진행하는 동안 Google Cloud 콘솔의 Datastore Studio 페이지에 정보 배너가 표시됩니다. 이 배너에는 Cloud Logging을 열고 마이그레이션 업데이트를 필터링할 수 있는 링크가 포함되어 있습니다.

  1. Google Cloud 콘솔에서 데이터베이스 페이지로 이동합니다.

    데이터베이스로 이동

  2. 데이터베이스 목록에서 필요한 데이터베이스를 선택합니다.

  3. 탐색 메뉴에서 Datastore 스튜디오를 클릭합니다.

CLI에서 현재 상태 보기

마이그레이션의 현재 상태를 빠르게 보려면 다음 gcloud 명령어를 사용하세요.

gcloud datastore operations describe datastore-firestore-migration

마이그레이션 일시중지

대규모 데이터베이스 마이그레이션을 일시중지했다가 다시 시작할 수 있습니다. 마이그레이션을 일시중지하면 다시 시작할 때까지 다음 단계로 진행할 수 없습니다. 마이그레이션을 일시중지하면 동작이나 성능에서 관찰된 변경사항이 마이그레이션 프로세스의 결과인지 또는 관련 없는 요인으로 인한 것인지 확인하는 데 도움이 될 수 있습니다.

데이터베이스 마이그레이션에 대한 이메일 알림을 받으면 다음 일시중지 명령어를 실행하여 일시중지 및 다시 시작 가능 여부를 확인할 수 있습니다. 마이그레이션을 할 수 없으면 기능을 사용할 수 없다는 오류가 반환됩니다.

데이터베이스 마이그레이션을 일시중지하고 다시 시작할 수 있는 경우 마이그레이션이 START 단계에 도달하면 다음 명령어가 작동하기 시작합니다.

마이그레이션을 일시중지하려면 다음을 실행합니다.

curl --request POST \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{}' \
"https://datastore.googleapis.com/v1/projects/PROJECT_ID:pauseMigration"

마이그레이션을 다시 시작하려면 다음을 실행합니다.

curl --request POST \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{}' \
"https://datastore.googleapis.com/v1/projects/PROJECT_ID:resumeMigration"

마이그레이션이 완료되면 이러한 명령어가 작동하지 않습니다.

마이그레이션을 1주일 넘게 일시중지해야 하는 경우 지원 채널을 통해 문의하세요. 2주 후에 마이그레이션이 자동으로 다시 시작될 수 있습니다.

Cloud Monitoring 측정항목

Datastore 데이터베이스에 사용할 수 있는 Cloud Monitoring 측정항목은 업그레이드 프로세스 내내 동일합니다. 사용 가능한 Datastore 측정항목을 참조하세요.