PostgreSQL 언어 데이터베이스로 Spanner 마이그레이션

이 페이지에서는 Spanner 또는 Google Cloud에서 애플리케이션을 이동하려는 경우 Spanner에서 다른 PostgreSQL 언어 데이터베이스로 마이그레이션할 때 따라야 하는 주요 고려사항과 단계를 설명합니다. 비상시 출구 재해 복구 계획과 같이 데이터베이스 이동 실행 가능성을 이해하거나 입증해야 하는 경우에도 이 페이지의 정보를 사용할 수 있습니다.

Spanner의 PostgreSQL 인터페이스는 Google Cloud내에서 또는 다른 곳에서 다른 PostgreSQL 호환 환경에 배포하는 옵션이 필요한 애플리케이션에 가장 적합합니다. PostgreSQL 생태계의 익숙한 문법과 표준 클라이언트를 사용하는 PostgreSQL 인터페이스를 사용하면 개발자와 운영자가 기존 PostgreSQL 지식과 기술을 사용할 수 있습니다.

GoogleSQL 언어와 동일한 쿼리 처리, 트랜잭션 조정, 분산 스토리지, 네트워크 인프라를 사용합니다. 이식성을 지원하는 데이터베이스가 필요한 경우 PostgreSQL 인터페이스를 선택해도 Spanner의 핵심 확장성, 일관성 또는 가성비 이점이 저하되지 않습니다.

Spanner의 PostgreSQL 언어와 GoogleSQL 언어의 차이점을 자세히 알아보세요.

대략적인 단계는 다음과 같습니다.

  1. 쿼리 및 DDL 문에서 Spanner 관련 확장 프로그램 삭제
  2. 스키마 마이그레이션
  3. 데이터 마이그레이션
  4. 애플리케이션 마이그레이션

Spanner 관련 고려사항

Spanner의 PostgreSQL 인터페이스는 PostgreSQL 쿼리를 즉시 지원하므로 Spanner PostgreSQL 언어 데이터베이스에서 실행되는 대부분의 SQL 쿼리는 다른 PostgreSQL 호환 데이터베이스와 동일하게 동작합니다. 이 방식을 사용하면 애플리케이션을 한 플랫폼에서 다른 플랫폼으로 이동하는 데 필요한 SQL 수가 줄어들고 데이터 액세스를 크게 변경하지 않을 수 있습니다. 따라서 유사한 GoogleSQL 언어 데이터베이스보다 포팅 프로세스가 더 빠르고 쉽고 오류가 적게 발생합니다.

PostgreSQL 인터페이스는 광범위한 PostgreSQL 호환성 외에도 다양한 Spanner 관련 확장 프로그램을 제공합니다. 애플리케이션에서 이러한 확장 프로그램을 사용하는 경우 확장 프로그램을 삭제하거나 PostgreSQL 기능에 수동으로 매핑해야 합니다. 주목할 만한 예시는 쿼리 문법 확장 프로그램스키마 관리(DDL) 확장 프로그램을 참조하세요.

쿼리 문법 확장 프로그램

Spanner의 PostgreSQL 인터페이스는 다양한 Spanner 관련 확장 프로그램을 제공합니다. 대부분은 식별하는 데 spanner. 프리픽스를 사용합니다. 다음 표에는 이러한 확장 프로그램과 같은 애플리케이션을 PostgreSQL 데이터베이스에서 실행하려면 먼저 취해야 하는 조치가 나와 있습니다.

확장 프로그램 종류 관련 확장 프로그램 마이그레이션 전에 취해야 할 조치
Spanner 관련 함수 spanner. 프리픽스가 있는 함수를 찾아 이러한 호출을 삭제합니다.
유형 확장 프로그램 VECTOR LENGTH 문법을 삭제하거나 pgvector를 사용하는 것이 좋습니다.
쿼리 구문 힌트가 주석 내에 표시되므로 필요한 조치가 없습니다.
성능 고려사항에 대한 자세한 내용은 쿼리 마이그레이션을 참조하세요.
저장된 시스템 프로시저 spanner.cancel_query() 호출을 삭제합니다.
원하는 경우 호출을 PostgreSQL 등가 항목으로 바꿀 수 있습니다.
SET/SHOW 작업 PostgreSQL에는 spanner.로 시작하는 기본 제공 파라미터가 없으므로 무시할 수 있으므로 이 프리픽스로 변수를 설정해도 예상 동작은 영향을 받지 않습니다.

스키마 관리(DDL) 확장 프로그램

Spanner는 데이터 정의 언어(DDL) 페이지의 설명처럼 데이터 관리와 관련된 다양한 확장 프로그램을 제공합니다.

확장 프로그램 마이그레이션 전에 취해야 할 조치
인터리브 처리된 테이블
물리적 스토리지에 다대일 관련 데이터를 함께 배치하여 훨씬 더 효율적으로 이러한 데이터를 조인할 수 있습니다.
INTERLEAVE IN 절을 삭제합니다.
커밋 타임스탬프
트랜잭션의 커밋 타임스탬프를 열에 원자적으로 저장할 수 있습니다.
SPANNER.COMMIT_TIMESTAMP를 PostgreSQL 타임스탬프 유형으로 바꾸고 애플리케이션에서 타임스탬프 설정을 관리하거나 해당 열을 삭제합니다.
PITR(point-in-time recovery)
우발적인 삭제나 쓰기로부터 보호합니다.
spanner.version_retention_period를 설정하는 DDL 문을 삭제합니다.
TTL(수명)
수명을 기준으로 레코드가 자동으로 삭제되도록 메시지를 표시합니다.
TTL INTERVAL 절을 삭제합니다. cron 또는 예약된 태스크를 활용하여 오래된 행을 주기적으로 삭제하는 것이 좋습니다.
옵티마이저 옵션
쿼리 옵티마이저나 통계가 변경될 때 성능 회귀 가능성이 최소화되도록 옵션을 설정합니다.
옵티마이저 옵션을 설정하는 DDL 문을 삭제합니다.
변경 내역
Spanner 데이터베이스의 데이터 변경사항(삽입, 업데이트, 삭제)을 거의 실시간으로 감시하고 스트리밍합니다.
변경 내역과 관련된 DDL 문을 삭제합니다.
기본 리더
이중 리전 구성과 멀티 리전 구성에서 데이터베이스의 리더를 지정할 수 있습니다.
spanner.default_leader를 설정하는 DDL 문을 삭제합니다.
지역 파티셔닝
추가 세분화를 통해 인스턴스 구성이 서로 다른 데이터베이스 테이블에 행을 저장할 수 있습니다.
지역 파티셔닝과 관련된 DDL 문을 삭제합니다.
시퀀스
Spanner는 bit_reversed_positive 시퀀스만 지원합니다.
bit_reversed_positive를 PostgreSQL에서 사용할 수 있는 시퀀스로 바꿉니다. spanner.default_sequence_kind를 설정하는 DDL 문을 삭제합니다.
지역 그룹
열을 별도로 저장하거나 등급형 스토리지를 사용하도록 열 그룹 전략을 정의할 수 있습니다.
지역 그룹과 관련된 DDL 문을 삭제합니다.
검색 색인
전체 텍스트 검색을 수행하도록 색인을 정의할 수 있습니다.
검색 색인과 관련된 DDL 문을 삭제합니다.

스키마 마이그레이션

PostgreSQL 언어 데이터베이스 스키마를 PostgreSQL 문법으로 내보낼 수 있습니다. PostgreSQL 인터페이스를 사용하도록 구성된 데이터베이스의 경우 표준 PostgreSQL 드라이버 또는 클라이언트 라이브러리를 사용하여 Spanner에 연결할 수 있는 사이드카 프록시인 PGAdapter를 사용하여 psql를 통해 내보내기를 수행할 수 있습니다.

psql -v ON_ERROR_STOP=1 \
  --host "$PGADAPTER_HOST" \
  --port "$PGADAPTER_PORT" \
  --dbname "$SPANNER_DATABASE" \
  -qAtX \
  -c "show database ddl"

다음 gcloud 명령어를 사용하여 스키마를 PostgreSQL 호환 SQL 스크립트로 출력할 수도 있습니다.

gcloud spanner databases ddl describe databasename

데이터베이스에서 스키마 관리 확장 프로그램에서 설명한 것과 같은 Spanner 관련 스키마 확장 프로그램을 사용하는 경우 이 명령어를 실행하면 이러한 확장 프로그램이 표시됩니다. 스키마를 PostgreSQL로 마이그레이션하기 전에 이러한 확장 프로그램을 삭제해야 합니다.

데이터 이전

Spanner의 PostgreSQL 인터페이스는 PGAdapter를 사용하여 PostgreSQL의 COPY TO STDINSTDOUT 확장 프로그램을 지원합니다. 이는 데이터를 Spanner로, Spanner에서 로드하는 한 가지 방법입니다. COPY 명령어에 대한 자세한 내용은 Spanner용 psql 명령줄 도구 문서를 참조하세요.

이 스크립트는 Spanner의 PostgreSQL 인터페이스에서 적은 양의 데이터(데이터 100GB 미만 권장)를 새 PostgreSQL 데이터베이스로 내보냅니다.

psql -h pgadapter-host -c "COPY $TABLE TO STDOUT BINARY" | \
psql -h postgresql-host -c "COPY $TABLE FROM STDIN BINARY"

데이터가 100GB보다 크거나 같은 대용량 테이블의 경우 Dataflow export to a CSV 템플릿을 실행할 수 있습니다.

Debezium Kafka 커넥터를 사용하여 라이브 데이터 마이그레이션을 수행하여 PostgreSQL로 Spanner 업데이트를 스트리밍할 수 있습니다. Spanner Change Streams API를 사용하여 변경 데이터 캡처(CDC) 스트림에 직접 액세스하면 이를 맞춤설정할 수 있습니다.

쿼리 마이그레이션

Spanner용 PostgreSQL 인터페이스는 가장 일반적인 PostgreSQL 쿼리 문법, 함수, 연산자 대부분을 구현합니다.

Spanner의 쿼리 힌트는 PostgreSQL 호환 주석에 정의되어 있으므로 쿼리에서 힌트를 사용할 때 쿼리를 다시 작성할 필요가 없습니다.

SELECT s.FirstName, s.LastName,
 s.SingerInfo, a.AlbumTitle, a.Charts
FROM Singers AS s
LEFT OUTER JOIN/*@JOIN_METHOD=APPLY_JOIN*/ Albums AS a
 ON s.SingerId = a.SingerId;

Spanner 쿼리 플래너에서 이러한 주석을 처리되지만 PostgreSQL 데이터베이스는 이를 무시하므로 포함하거나 삭제할 수 있습니다.

새 환경에서 최적의 성능을 얻으려면 쿼리와 데이터베이스 스키마(예: 색인)를 새 환경에 맞게 최적화해야 할 수 있습니다. 벤치마크 검사를 실행하여 이를 실험적으로 확인하는 것이 좋습니다.

애플리케이션 마이그레이션

애플리케이션에서의 연결과 관련하여 마이그레이션 전략은 애플리케이션에서 Spanner를 사용하도록 구성할 때 선택한 초기 옵션(예: PostgreSQL 드라이버, Spanner 드라이버 또는 Spanner 클라이언트 라이브러리 사용 여부)에 따라 다릅니다. 이 섹션에서는 각 옵션의 고려사항을 설명합니다.

PostgreSQL 드라이버

Spanner는 PostgreSQL 유선 프로토콜을 Spanner의 하위 수준 gRPC 쿼리 API로 변환하는 경량 프록시인 PGAdaper를 사용하여 일반적인 PostgreSQL 클라이언트를 지원합니다. 이 중 하나를 사용하는 경우 다른 PostgreSQL 대상으로 변경하려면 PGAdapter 프록시 대신 새 PostgreSQL 데이터베이스를 직접 가리키도록 연결 문자열을 업데이트해야 합니다. 이 방식은 우수한 성능과 강력한 호환성을 제공하므로 이식성이 가장 중요한 경우에 적합합니다. Spanner의 PostgreSQL 인터페이스에서 실행되는 대부분의 쿼리는 다른 PostgreSQL 환경에서도 동일하게 작동합니다. 그러나 반대의 경우는 반드시 그렇지 않습니다. PostgreSQL은 Spanner에서 지원하지 않는 문법과 기능을 지원합니다.

Spanner 드라이버

이러한 드라이버는 일반 언어 및 애플리케이션 프레임워크를 위한 Spanner 관련 구현입니다. 예를 들어 Spanner JDBC(Java) 드라이버는 PostgreSQL JDBC 드라이버가 구현하는 API와 동일한 API를 구현하므로 PostgreSQL으로 애플리케이션을 실행하려는 경우 Spanner JDBC 드라이버를 사용하는 애플리케이션은 빌드 프로세스를 업데이트하여 이에 상응하는 기본 제공 PostgreSQL 드라이버를 연결할 수 있습니다. 이 옵션은 이미 Spanner를 사용하고 있거나 기본 제공 PostgreSQL 드라이버를 사용하여 노출되지 않는 Mutations API와 같은 Spanner 기능을 활용하는 고성능 솔루션을 찾고 있는 경우에 적합합니다. 기본 제공 드라이버와 완전히 호환되고 값 이식성이 필요한 경우에는 대신 PGAdapter와 함께 PostgreSQL의 기본 제공 드라이버를 사용하여 어느 정도의 애플리케이션 이식성을 보장하는 것이 좋습니다.

자세한 내용은 PostgreSQL 드라이버 및 ORM을 참조하세요.

Spanner 클라이언트 라이브러리

또한 Spanner는 PostgreSQL 표준화된 인터페이스를 구현하거나 거치지 않고 Spanner에 직접 액세스할 수 있는 다양한 문법적 클라이언트 라이브러리를 제공합니다. 이러한 클라이언트는 Spanner 관련 기능에 대한 최대한의 액세스를 제공하지만 PostgreSQL 드라이버와 호환되지 않는 API입니다. 이러한 옵션은 최고 수준의 기능 성능을 제공하지만 앞서 언급한 옵션보다 이식성이 떨어집니다.

다음 단계