Amazon Redshift-Snowflake 마이그레이션 가이드

Snowflake 마이그레이션 프레임워크

일반적인 Amazon Redshift-Snowflake 마이그레이션은 9가지 주요 단계로 구성됩니다. 이 가이드는 관련된 기술적 과제 및 전략적 과제 탐색을 통해 Snowflake의 클라우드 데이터 플랫폼으로 원활하게 전환할 수 있도록 포괄적인 프레임워크를 제공합니다.

마이그레이션 단계

1단계: 계획 및 설계

이 초기 단계는 성공적인 마이그레이션의 기반을 마련하는 데 매우 중요합니다. 이 단계를 서두르면 크리프와 예산 초과가 발생하며 마감 날짜를 놓치게 됩니다. 철저한 계획을 수립하면 모든 이해관계자가 정렬되고 프로젝트 목표가 명확하게 정의됩니다.

실행 가능한 단계:

  • Redshift 환경에 대한 철저한 평가 수행:

    • 인벤토리 및 분석: Redshift 클러스터의 모든 데이터베이스, 스키마, 테이블, 뷰, 저장 프로시저, 사용자 정의 함수(UDFs)를 카탈로그화합니다. Redshift 시스템 테이블(SVV_TABLE_INFO, PG_PROC 등)을 사용하여 메타데이터를 수집합니다.

    • 워크로드 분석: Redshift의 STL_QUERY 및 SVL_QUERY_SUMMARY 뷰를 사용하여 쿼리 패턴, 사용자 동시성, 성능 병목 상태를 식별합니다. 이 데이터는 Snowflake 가상 웨어하우스 전략을 설계하는 데 매우 중요합니다.

    • 종속성 식별: 모든 업스트림 데이터 소스(ETL/ELT 작업) 및 다운스트림 컨슈머(BI 도구, 애플리케이션, 데이터 과학 노트북)를 매핑합니다.

  • 마이그레이션 범위 및 전략 정의:

    • 워크로드 우선 순위 지정: 비즈니스 영향과 기술적 복잡성을 기준으로 워크로드를 분류합니다. 빠른 성공과 추진력을 확보하기 위해 영향력은 높고 복잡성은 낮은 워크로드부터 시작합니다.

    • 마이그레이션 접근 방식 선택: 더 빠른 마이그레이션을 위한 “리프트 앤 시프트” 접근 방식이나 데이터 모델과 파이프라인을 현대화 및 최적화하기 위한 아키텍처 재구성 접근 방식 중에서 결정합니다.

  • 프로젝트 계획 개발:

    • 팀 구성: 명확한 역할과 책임(예: 프로젝트 관리자, 데이터 엔지니어, DBA, 보안 관리자, 비즈니스 분석가)을 갖춘 마이그레이션 팀을 구성합니다.

    • 타임라인 만들기: 9단계 각각에 대해 현실적인 타임라인과 마일스톤을 정의합니다.

    • 성공 메트릭 정의: 명확한 KPIs를 설정하여 비용 절감, 쿼리 성능 개선, 사용자 만족도와 같은 마이그레이션의 성공을 측정합니다.

2단계: 환경 및 보안

탄탄한 계획이 수립했다면, 다음 단계는 Snowflake 환경을 준비하고 보안 태세를 복제하는 것입니다. Redshift에서 마이그레이션할 때의 주요 이점은 두 플랫폼이 일반적으로 동일한 클라우드 공급자(AWS)에서 실행되어 데이터 전송을 간소화된다는 점입니다.

실행 가능한 단계:

  • Snowflake 계정 설정:

    • 에디션 및 클라우드 공급자 선택: 요구 사항을 충족하는 Snowflake 에디션(예: Standard, Enterprise, Business Critical)을 선택합니다. AWS를 클라우드 공급자로 선택하고 현재 S3 버킷과 동일한 리전을 선택하여 데이터 전송 비용과 대기 시간을 최소화합니다.

    • 웨어하우스 전략 설계: 1단계의 워크로드 분석을 기반으로 초기 가상 웨어하우스를 만듭니다. 다양한 워크로드(예: WH_LOADING, WH_TRANSFORM, WH_BI_ANALYTICS)를 분리하여 리소스 경합을 방지합니다. 티셔츠 사이즈(예: X-Small, Small)로 시작하여 성능 테스트를 기반으로 크기를 조정합니다.

  • 보안 모델 구현:

    • Redshift 사용자 및 그룹을 Snowflake 역할로 매핑: Redshift의 사용자 및 그룹 권한을 Snowflake의 역할 기반 액세스 제어(RBAC) 모델로 변환합니다. 기능 역할(예: SYSADMIN ,SECURITYADMIN) 및 액세스 역할(예: BI_READ_ONLY, ETL_READ_WRITE)의 계층 구조를 생성합니다.

    • 네트워크 정책 및 인증 구성: 신뢰할 수 있는 IP주소로 액세스를 제한하는 네트워크 정책을 설정합니다. Okta 또는 Azure AD와 같은 ID 공급자를 통한 페더레이션 인증(SSO) 등의 인증 방법을 구성합니다.

3단계: 데이터베이스 코드 변환

이 단계에는 Redshift의 DDL, DML 및 프로시저 코드를 Snowflake와 호환되도록 변환합니다. 자동화 도구를 사용하면 이 프로세스를 가속화할 수 있지만, SQL 언어 및 플랫폼 아키텍처의 차이로 인해 수동 검토 및 조정이 필수적입니다.

실행 가능한 단계:

  • DDL(데이터 정의 언어) 변환:

    • 테이블 및 뷰: Redshift에서 CREATE TABLE 및 CREATE VIEW 문을 추출합니다. Redshift 관련 데이터 타입을 상응하는 Snowflake 데이터 타입으로 변환합니다(부록 2 참조).

    • Redshift 관련 절 제거: DISTSTYLE, DISTKEY 및 SORTKEY와 같은 Redshift 관련 물리적 설계 절을 제거합니다. Snowflake의 아키텍처는 자동으로, 또는 매우 큰 테이블의 논리적 클러스터링 키를 통해 데이터 배포 및 클러스터링을 처리합니다.

  • DML(데이터 조작 언어) 및 프로시저 코드 변환:

    • 저장 프로시저 재작성: Redshift는 저장 프로시저에 PL/pgSQL을 사용합니다. 이는 Snowflake Scripting(SQL), JavaScript, Python 또는 Java와 같이 Snowflake에서 지원하는 언어로 수동으로 다시 작성해야 합니다. 대개 코드 변환 프로세스에서 가장 시간이 많이 소요되는 부분입니다.

    • SQL 함수 변환: Redshift 관련 함수를 Snowflake 함수로 매핑합니다. 예를 들어, Redshift의 GETDATE()는 Snowflake의 CURRENT_TIMESTAMP()가 됩니다. 일반적인 함수 매핑은 부록 3을 참조하세요.

    • 유지 관리 명령 바꾸기: VACUUM, ANALYZE 및 REINDEX와 같은 Redshift 관련 명령이 포함된 스크립트는 Snowflake가 이러한 유지 관리 작업을 자동으로 처리하므로 제거해야 합니다.

4단계: 데이터 마이그레이션

이 단계에서는 Redshift 클러스터에서 Snowflake 테이블로 과거 데이터를 물리적으로 이동하는 데 중점을 둡니다. 가장 효율적인 방법은 Amazon S3를 중간 스테이징 영역으로 활용하는 것입니다.

실행 가능한 단계:

  • Redshift에서 S3로 데이터 언로드:

    • Redshift UNLOAD 명령을 사용하여 테이블에서 지정된 S3 버킷으로 데이터를 내보냅니다. 이는 고도로 병렬화된 작업으로, 클라이언트 도구를 통한 SELECT 쿼리보다 훨씬 빠릅니다.

    • Snowflake에 최적의 로딩 성능을 제공하기 위해 데이터를 Parquet 또는 압축 CSV 형식으로 저장합니다. PARALLEL ON 옵션을 사용하여 여러 파일을 작성합니다.

  • S3에서 Snowflake로 데이터 로드:

    • 외부 스테이지 만들기: Snowflake에서 언로드한 데이터가 포함된 S3 버킷을 지정하는 외부 스테이지 오브젝트를 만듭니다.

    • COPY INTO 명령 사용: Snowflake의 COPY INTO<table> 명령을 사용하여 S3 스테이지의 데이터를 대상 Snowflake 테이블로 로드합니다. 이 명령은 성능과 확장성이 뛰어납니다.

    • 확장된 웨어하우스 활용: 초기 데이터 로드 시 더 큰 전용 가상 웨어하우스를 사용하여 프로세스 속도를 높인 후, 비용을 관리하기 위해 이후에 규모를 축소하거나 일시 중단합니다.

**5단계: 데이터 수집

과거 데이터가 마이그레이션되었으면, 진행 중인 데이터 수집 파이프라인을 재설계하여 Redshift 대신 데이터를 Snowflake에 직접 공급해야 합니다.

실행 가능한 단계:

  • 일괄 ETL 및 ELT 작업 마이그레이션:

    • (AWS Glue, Talend와, Informatica와 같은 도구에서) 기존 ETL 작업을 업데이트하여 Snowflake를 대상으로 지정합니다. 여기에는 연결 세부 정보를 변경하고 Snowflake의 언어를 사용하도록 SQL 재정의를 업데이트하는 작업이 포함됩니다.

  • Snowpipe로 지속적인 수집 구현:

    • 연속 데이터 스트림(예: Kinesis 또는 S3에 도달하는 애플리케이션 로그에서)의 경우 Snowpipe를 구성합니다. Snowpipe는 S3에서 Snowflake 테이블로 새 데이터 파일이 도착하는 즉시 효율적으로 자동 로드하여 거의 실시간 수집 솔루션을 제공합니다.

  • Snowflake 에코시스템 활용:

    • Kafka 및 Spark와 같은 플랫폼용 Snowflake 네이티브 커넥터를 탐색하여 직접 데이터 스트리밍을 간소화합니다.

6단계: 보고 및 분석

이 단계에서는 Snowflake에서 데이터를 쿼리하도록 모든 다운스트림 애플리케이션, 특히 BI 및 보고 도구를 리디렉션합니다.

실행 가능한 단계:

  • 연결 드라이버 업데이트: BI 도구(예: Tableau Server, Power BI Gateway)를 호스팅하는 서버에 Snowflake의 ODBC/JDBC 드라이버를 설치하고 구성합니다.

  • 보고서 및 대시보드 리디렉션:

    • BI 도구에서 데이터 소스 연결을 Redshift에서 Snowflake로 변경합니다.

    • 모든 중요한 보고서와 대시보드를 테스트하여 올바르게 작동하는지 확인합니다.

  • 쿼리 검토 및 최적화:

    • 일부 대시보드에는 사용자 지정 SQL 또는 데이터베이스별 함수가 포함될 수 있습니다. 이러한 쿼리를 검토하고 리팩터링하여 Snowflake의 SQL 언어 및 해당 성능 기능을 활용합니다. Snowflake의 쿼리 프로필 도구를 사용하여 느리게 실행되는 보고서를 분석하고 최적화합니다.

7단계: 데이터 유효성 검사 및 테스트

새 플랫폼에 대한 비즈니스 신뢰를 구축하고 데이터 무결성과 성능이 기대치를 충족하는지 확인하기 위해서는 엄격한 테스트가 필수입니다.

실행 가능한 단계:

  • 데이터 유효성 검사 수행:

    • 행 수: Redshift의 소스 테이블과 Snowflake의 대상 테이블 간의 행 수를 비교합니다.

    • 셀 수준 유효성 검사: 중요한 테이블의 경우 집계된 값(SUM(), AVG(), MIN(), MAX())을 비교하거나 주요 열에 체크섬을 사용하여 심층적인 유효성 검사를 수행합니다.

  • 쿼리 및 성능 테스트 수행:

    • 벤치마크 쿼리: Redshift와 Snowflake 모두에 대해 대표적인 쿼리 세트를 실행하고 결과와 성능을 비교합니다.

    • BI 도구 성능: Snowflake에 연결된 주요 대시보드의 로딩 시간과 상호 작용을 테스트합니다.

  • 사용자 수용 테스트(UAT):

    • 새로운 Snowflake 환경에서 비즈니스 사용자를 참여시켜 보고서의 유효성을 검사하고 일상적인 작업을 수행합니다. 피드백을 수집하고 문제를 해결합니다.

8단계: 배포

배포는 Redshift에서 Snowflake로 전환하는 최종 단계입니다. 이 프로세스는 비즈니스 운영 중단을 최소화하기 위해 신중하게 관리해야 합니다.

실행 가능한 단계:

  • 전환 계획 개발:

    • 주말 또는 저녁 전환에 대한 이벤트 시퀀스를 정의합니다. 여기에는 Redshift를 가리키는 ETL 작업 중지, 최종 데이터 동기화 수행, 모든 연결 리디렉션, 시스템 상태 유효성 검사 작업이 포함됩니다.

  • 최종 데이터 동기화 실행:

    • 마지막 증분 데이터 로드를 한 번 수행하여 테스트 단계 중에 발생한 모든 데이터 변경 사항을 캡처합니다.

  • 시작:

    • 모든 프로덕션 데이터 파이프라인과 사용자 연결을 Redshift에서 Snowflake로 전환합니다.

    • Redshift 환경을 해제하기 전에 대체 수단으로 짧은 기간 동안 읽기 전용 상태로 유지합니다.

  • Redshift 해제:

    • Snowflake 환경이 프로덕션에서 안정화되고 검증되면 비용이 발생하지 않도록 Redshift 클러스터를 해제할 수 있습니다.

9단계: 최적화 및 실행

이 마지막 단계는 새로운 Snowflake 환경에서 성능, 비용 및 거버넌스를 관리하는 지속적인 프로세스입니다. 설정을 지속적으로 개선하여 가치를 극대화하는 것이 목표입니다.

실행 가능한 단계:

  • 성능 및 비용 최적화 구현:

    • 웨어하우스를 적절한 크기로 조정: 워크로드 성능을 지속적으로 모니터링하고 가상 웨어하우스 크기를 늘리거나 줄여 최대한 낮은 비용으로 SLAs를 충족합니다.

    • 적극적인 자동 일시 중단 정책 설정: 유휴 컴퓨팅 시간에 대한 비용이 발생하지 않도록 모든 웨어하우스의 자동 일시 중단 시간 제한을 60초로 설정합니다.

    • 클러스터링 키 사용: 매우 큰 테이블(멀티 테라바이트)의 경우 쿼리 패턴을 분석하고 클러스터링 키를 정의하여 고도로 필터링된 쿼리의 성능을 개선합니다.

  • 장기적인 FinOps 및 거버넌스 구축:

    • 비용 모니터링: Snowflake의 ACCOUNT_USAGE 스키마 및 리소스 모니터를 통해 크레딧 사용량을 추적하고 예산 초과를 방지합니다.

    • 보안 세분화: 최소 권한의 원칙이 유지되도록 역할과 권한을 정기적으로 감사합니다. 민감한 데이터에 대한 동적 데이터 마스킹 및 행 액세스 정책과 같은 고급 보안 기능을 구현합니다.

부록

부록 1: Snowflake 및 Redshift 아키텍처

특징

Amazon Redshift

Snowflake

아키텍처

긴밀하게 연결된 컴퓨팅 및 저장소(MPP)

분리된 컴퓨팅, 저장소 및 클라우드 서비스(멀티 클러스터, 공유 데이터)

저장소

노드에 연결된 로컬 SSDs의 관리형 열 형식 저장소

자동 마이크로 파티셔닝을 사용하는 중앙 집중식 오브젝트 저장소(S3)

컴퓨팅

노드의 고정 크기 클러스터(리더 + 컴퓨팅 노드)

탄력적인 온디맨드 가상 웨어하우스(컴퓨팅 클러스터)

동시성

클러스터 크기로 제한됨. 쿼리가 큐에 추가할 수 있음

자동으로 가동되는 멀티 클러스터 웨어하우스를 통한 높은 동시성

확장성

노드를 추가하여 확장(데이터 재분배 포함, 몇 분에서 몇 시간 소요)

컴퓨팅을 즉시 확장, 축소 및 수평 확장하며 저장소는 자동으로 확장됨

유지 관리

수동 VACUUM 및 ANALYZE 명령 필요

완전 관리되며, 유지 관리 작업은 자동화되어 백그라운드에서 실행됨

부록 2: 데이터 타입 매핑

Amazon Redshift

Snowflake

참고

SMALLINT

SMALLINT 및 NUMBER(5,0)

INTEGER

INTEGER 및 NUMBER(10,0)

BIGINT

BIGINT 및 NUMBER(19,0)

DECIMAL(p,s) 및 NUMERIC(p,s)

NUMBER(p,s)

REAL 및 FLOAT4

FLOAT

DOUBLE PRECISION / FLOAT8

FLOAT

BOOLEAN

BOOLEAN

CHAR(n)

CHAR(n) 및 VARCHAR(n)

공백이 있는 Snowflake 패드 CHAR, VARCHAR가 선호되는 경우가 많습니다.

VARCHAR(n)

VARCHAR(n)

Snowflake의 최대 길이는 16MB입니다.

DATE

DATE

TIMESTAMP

TIMESTAMP_NTZ

Snowflake는 타임존이 있는 타임스탬프와 타임존이 없는 타임스탬프를 구분합니다.

TIMESTAMPTZ

TIMESTAMP_TZ

GEOMETRY

GEOGRAPHY 및 GEOMETRY

Snowflake는 지리 공간 데이터를 기본적으로 지원합니다.

SUPER

VARIANT

반정형 데이터(JSON)의 경우입니다.

부록 3: SQL 및 함수의 차이점

Amazon Redshift

Snowflake

참고

GETDATE()

CURRENT_TIMESTAMP()

Snowflake에는 현재 날짜 및 시간에 대한 여러 함수가 있습니다.

SYSDATE

CURRENT_TIMESTAMP()

SYSDATE는 Redshift의 GETDATE에 대한 별칭입니다.

LISTAGG(expr, delim)

LISTAGG(expr, delim)

구문은 유사하지만 순서 지정 동작은 다를 수 있습니다.

NVL(expr1, expr2)

NVL(expr1, expr2) 및 IFNULL(expr1, expr2)

기능은 동일합니다.

DECODE(expr, search, result…)

DECODE(expr, search, result…)

둘 다에서 지원됩니다. CASE 문이 더 표준입니다.

DATEDIFF(part, start, end)

DATEDIFF(part, start, end)

지원되지만, 날짜 및 시간 부분의 이름이 다를 수 있습니다(예: yr 및 year 비교).

DATEADD(part, num, date)

DATEADD(part, num, date)

지원되지만, 날짜 및 시간 부분의 이름이 다를 수 있습니다.

저장 프로시저

PL/pgSQL

Snowflake Scripting (SQL), JavaScript, Python, Java

DDL 절

DISTKEY, SORTKEY, ENCODE

없습니다. 자동 마이크로 파티셔닝 및 선택적 클러스터링 키로 대체되었습니다.

유지 관리

VACUUM, ANALYZE

없습니다. 자동화된 백그라운드 서비스가 유지 관리를 처리합니다.

데이터 로딩

UNLOAD, COPY

COPY INTO, Snowpipe