이 페이지에서는 Spanner 또는 Google Cloud에서 애플리케이션을 이전하려는 경우 Spanner에서 다른 PostgreSQL 언어 데이터베이스로 마이그레이션할 때 고려해야 할 주요 사항과 따라야 할 단계를 설명합니다. 스트레스 테스트 종료 재해 복구 계획과 같이 데이터베이스 이전의 실행 가능성을 이해하거나 입증해야 하는 경우에도 이 페이지의 정보를 사용할 수 있습니다.
Spanner의 PostgreSQL 인터페이스는 Google Cloud또는 그 외의 다른 곳에서 다른 PostgreSQL 호환 환경에 배포하는 옵션이 필요한 애플리케이션에 가장 적합합니다. PostgreSQL 인터페이스를 사용하면 PostgreSQL 생태계의 익숙한 문법과 표준 클라이언트를 사용하여 개발자와 운영자가 기존 PostgreSQL 지식과 기술을 사용할 수 있습니다.
GoogleSQL 언어와 동일한 쿼리 처리, 트랜잭션 조정, 분산 스토리지, 네트워크 인프라를 사용합니다. 이식성을 지원하는 데이터베이스가 필요한 경우 PostgreSQL 인터페이스를 선택해도 Spanner의 핵심 확장성, 일관성 또는 가격 대비 성능 이점을 손상시키지 않습니다.
Spanner의 PostgreSQL과 GoogleSQL 언어의 차이에 대해 자세히 알아보세요.
대략적인 단계는 다음과 같습니다.
- 쿼리 및 DDL 문에서 Spanner 관련 확장 프로그램 삭제
- 스키마 마이그레이션
- 데이터 이전
- 애플리케이션 마이그레이션
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에서 사용할 수 있는 시퀀스로 바꿉니다. |
스키마 마이그레이션
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 STDIN
및 STDOUT
확장 프로그램을 지원합니다. 이는 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를 초과하는 대용량 테이블의 경우 CSV 템플릿으로 Dataflow 내보내기를 실행할 수 있습니다.
Debezium Kafka 커넥터를 사용하여 실시간 데이터 마이그레이션을 실행하여 Spanner 업데이트를 PostgreSQL로 스트리밍할 수 있습니다. 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를 구현하므로 Spanner JDBC 드라이버를 사용하는 애플리케이션은 PostgreSQL으로 애플리케이션을 실행하려는 경우 빌드 프로세스를 업데이트하여 이에 상응하는 내장 PostgreSQL 드라이버를 연결할 수 있습니다. 이 옵션은 이미 Spanner를 사용 중이거나 내장 PostgreSQL 드라이버를 사용하여 노출되지 않는 Mutations API와 같은 Spanner 기능을 활용하는 고성능 솔루션을 찾고 있는 경우에 가장 적합합니다. 기본 제공 드라이버와의 완전한 호환성과 값 이식성이 필요한 경우 PGAdapter와 함께 PostgreSQL의 기본 제공 드라이버를 사용하여 어느 정도의 애플리케이션 이식성을 보장하는 것이 좋습니다.
자세한 내용은 PostgreSQL 드라이버 및 ORM을 참고하세요.
Spanner 클라이언트 라이브러리
또한 Spanner는 PostgreSQL 표준화된 인터페이스를 구현하거나 거치지 않고 Spanner에 직접 액세스할 수 있는 다양한 문법적 클라이언트 라이브러리를 제공합니다. 이러한 클라이언트는 Spanner 관련 기능에 최대한 액세스할 수 있도록 하지만 PostgreSQL 드라이버와 API 호환되지는 않습니다. 이러한 옵션은 가장 높은 수준의 기능 성능을 제공하지만 앞서 언급한 옵션보다 이식성이 떨어집니다.
다음 단계
- PostgreSQL과 GoogleSQL 중에서 선택하는 방법 알아보기
- 빠른 시작을 따라 PostgreSQL 데이터베이스 만들기 및 상호작용하기
- Spanner의 PostgreSQL 언어 지원 자세히 알아보기
- PGAdapter 알아보기
- PGAdapter GitHub 저장소 알아보기
- PostgreSQL 인터페이스에서 알려진 문제 검토하기