다른 Region간 데이터 Replication 하기

Youngtae Kim
Snowflake Korea
Published in
16 min readApr 26, 2023

안녕하세요!
오늘은 Snowflake의 기능 중 하나인 데이터 복제(Data Replication)에 대해 이야기해 볼까요?
데이터 복제는 Snowflake에서 제공하는 중요한 기능 중 하나로, 여러 클라우드 플랫폼이나 리전간에 데이터를 복사하거나 이동할 수 있도록 도와줍니다.
이를 통해 데이터의 안전성을 높이고, 글로벌한 서비스를 제공하는 기업들이 데이터에 접근하는 속도를 개선할 수 있습니다.

시나리오

서울 Region에서 Snowflake를 통해 데이터를 관리하고 있다고 가정합니다.
여러 가지 이유로 인해 사업이 확장되어 다른 Region(예: 싱가포르)에 데이터를 전달해야 하는 상황이 발생했습니다.

이런 경우, Snowflake의 Data Replication 기능을 사용하면 원활하게 데이터를 전달할 수 있습니다.
본 예시에서는 Citibike 데이터를 기반으로 데이터 복제를 진행해 보겠습니다.

시나리오를 요약하면 다음과 같습니다:

  1. 서울 Region 계정에서 데이터를 생성합니다.
  2. 싱가포르 Region으로 데이터를 복제합니다.

이 과정을 그림으로 나타내면 아래와 같습니다.

사전작업

2개의 계정(서울, 싱가포르 Region)을 생성합니다

https://www.snowflake.com/ko/ 여기에서 Trial 계정을 발급 받을 수 있습니다.

무료로 시작하기 버튼을 클릭합니다.
First Name, E-mail 등 필요한 정보를 기입합니다.
Edition은 Enterprise, Provider는 aws, Region은 Singapore를 선택 합니다.
몇 분 후에 E-Mail로 계정 활성화 관련 메일을 받을 수 있습니다.
Username과 Password를 설정해주세요.
설정을 완료하면 아래와 같은 화면을 만날 수 있습니다.

위와 동일한 방법으로 서울(Seoul)Region도 생성하시면 됩니다.

이전에 Citibike 데모를 수행한 적이 없다면 사전작업 스크립트를 실행해야 합니다.

https://quickstarts.snowflake.com/guide/getting_started_with_snowflake/index.html#0 를 수행해 보았다면 이미 관련 데이터가 설정되어 있으므로 이 단계를 건너뛸 수 있습니다.

데모 계정에 로그인합니다.

아래의 스크립트는 서울 Region 워크시트에 복사하고 수행을 합니다 .

/*
샘플 트랜잭션 데이터를 Snowflake 에 로드할 준비부터 시작하겠습니다.

이 섹션은 다음과 같은 단계로 진행됩니다.
• 데이터베이스 및 테이블 생성
• 외부 스테이지(External Stage) 생성
• 데이터에 대한 파일 형식(File Format) 생성
Snowflake 데이터 로딩하는 방법은 아래 매뉴얼에서 확인할 수 있습니다.
Snowflake 에 데이터 로딩하기: https://docs.snowflake.com/ko/user-guide-dataload.html
*/


/*
Snowflake 로 데이터 가져오기

사용할 데이터는 자전거 공유 서비스의 트랜잭션 데이터입니다. 특정 정거장에서
자전거를 빌려서 특정 장소에 반납하면 하나의 트랜잭션(한 번의 Trip)이
완결되고 하나의 레코드로 저장됩니다. 이 데이터는 미국 동부 지역의 Amazon
AWS S3 버킷에 미리 저장되어 있으며, 이동 시간, 위치, 사용자 유형, 성별, 나이
등에 관한 관련 정보로 구성됩니다. AWS S3 에서 이 데이터는 6,150 만 행,
377 개의 객체로 표현되고 1.9GB 로 압축되어 있습니다.
*/


/*
데이터베이스 및 테이블 생성

먼저 어떤 Role 과 Warehouse 를 사용할 지 컨텍스트를 지정합니다.
*/
use warehouse compute_wh;
/*
명령어를 통해서 직접 가상 웨어하우스의 크기를 x2large 로 변경합니다.
*/
alter warehouse compute_wh set warehouse_size='x2large';
/*
웨어하우스의 변경 사항을 확인
*/
show warehouses;
/*
citibike 데이터베이스를 생성합니다.
*/
create or replace database citibike;
/*
테이블을 생성할 데이터베이스와 스키마를 컨텍스트로 지정합니다.
*/
use database citibike;
use schema public;

/*
다음으로 샘플 트랜잭션 정형 데이터를 로드하는 데 사용할 TRIPS 라는 테이블을
만듭니다. UI 를 사용하는 대신 워크시트를 사용하여 테이블을 생성하는 DDL 을
실행합니다. 다음 SQL 텍스트를 워크시트에 복사합니다.

데이터를 로딩할 테이블을 해당 칼럼으로 생성합니다. */
create or replace table trips
(
tripduration integer
, starttime timestamp
, stoptime timestamp
, start_station_id integer
, start_station_name string
, start_station_latitude float
, start_station_longitude float
, end_station_id integer
, end_station_name string
, end_station_latitude float
, end_station_longitude float
, bikeid integer
, membership_type string
, usertype string
, birth_year integer
, gender integer
);
/* 생성된 테이블과 설정된 parameter 를 확인합니다. */
show tables like 'tri%' in citibike.public;
/* 테이블의 각 컬럼 정보를 확인합니다. */
desc table trips;


-- 명령을 실행하는 다양한 옵션.
/*
워크시트의 왼쪽 상단에 있는 HOME 아이콘을 클릭하여 Databases 탭으로
이동합니다. 그런 다음 Data > Databases 를 클릭합니다. 데이터베이스
목록에서 CITIBIKE > PUBLIC > TABLES 를 클릭하여 새로 생성된 TRIPS 테이블을
확인합니다.

방금 생성한 TRIPS 테이블 구조를 보려면 Columns 탭을 클릭합니다.
*/

/*
Create an External Stage

데이터베이스 테이블로 읽을 데이터는 외부 S3 버킷에 준비되어 있으므로, 이
데이터를 사용하기 전에 먼저 외부 버킷의 위치를 지정하는 단계를 생성해야
합니다.
- 아마존 S3 에서 대량 로드: https://docs.snowflake.com/ko/user-guide/data-loads3.html

Databases 탭에서 CITIBIKE 데이터베이스와 PUBLIC 스키마를
클릭합니다. Stage 탭에서 Create 버튼을 클릭한 다음 Stages > Amazon S3 를
클릭합니다.

열리는 "Create Securable Object" 대화 상자에서 SQL 문에서 다음 값을
바꿉니다.
stage_name: citibike_trips
url: s3://snowflake-workshop-lab/citibike-trips-csv/
참고: URL 끝에 마지막 슬래시(/)를 포함해야 합니다.
*/


/*
SQL 로 External Stage 생성하기

외부 스테이지를 생성합니다.
AWS S3 의 버킷을 그대로 데이터 파일을 저장하는 외부 스테이지로 활용할 수
있습니다.
*/
create or replace stage citibike_trips
url='s3://snowflake-workshop-lab/citibike-trips-csv/';

list @citibike_trips;


/*
Create File Format

데이터 파일에 저장한 데이터의 구조를 반영하는 File Format 을 생성합니다.
Snowflake File Format 을 생성하는 방법은 아래 매뉴얼에서 확인할 수 있습니다.
Snowflake 에 File Format 을 생성하기: https://docs.snowflake.com/ko/sql-reference/sql/create-file-format
*/
create or replace file format csv
type='csv'
compression = 'auto'
field_delimiter = ','
record_delimiter = '\n'
skip_header = 0
field_optionally_enclosed_by = '\042'
trim_space = false
error_on_column_count_mismatch = false
escape = 'none'
escape_unenclosed_field = '\134'
date_format = 'auto'
timestamp_format = 'auto'
null_if = ('')
comment = 'file format for ingesting data to snowflake';


/*
파일 포맷이 생성되었는 지 확인합니다.
*/
show file formats in database citibike;


/*
데이터 로드

이제 COPY 명령을 실행하여 데이터를 앞서 생성한 TRIPS 테이블로 로드할 수
있습니다.

워크시트에서 다음의 문을 실행하여 구성한 데이터를 테이블로 로드하고 실행
시간을 체크합니다.
citibike_trips 외부 스테이지에 있는 데이터 파일을 csv 파일 포맷에 맞춰서
trips 테이블에 로딩합니다.
*/
copy into trips from @citibike_trips file_format=csv pattern= '.*csv.*' ;

/*
테이블에 로딩된 데이터를 확인합니다.
*/
select * from trips limit 20;
/*
사전준비는 끝났습니다.
*/

싱가포르 Region에서 작업

Replication Target 정보를 확인합니다.

Home 페이지에서 왼쪽 하단에 Combo Box를 클릭하면 확인할 수 있습니다.

서울 Region에서 작업

region간 replication을 하기 위해서는 orgadmin 권한이 필요합니다.
replication을 수행 할 유저에게 권한을 부여 합니다.

-- grant role orgadmin to user <username>;
grant role orgadmin to user snowflake_user;

orgadmin로 Role을 변경하고 아래의 SQL을 수행하여 account_name을 확인 합니다.

use role orgadmin;
SHOW ORGANIZATION ACCOUNTS;

Replication 활성화를 위해 account_name 컬럼 값을 참조하여 아래와 같은 SQL을 수행합니다.

SELECT SYSTEM$IS_GLOBAL_DATA_SHARING_ENABLED_FOR_ACCOUNT('VS11923');
/*
위 결과 값이 FALSE라면 Region간 Sharing(Replication)이 불가능하므로
아래와 같이 ENABLE_GLOBAL_DATA_SHARING_FOR_ACCOUNT 함수를 수행 해야 합니다.
*/
SELECT SYSTEM$ENABLE_GLOBAL_DATA_SHARING_FOR_ACCOUNT('VS11923');

Home → Data → Provider Studio → [+ Listing] 버튼을 클릭 합니다.

Home → Data → Provider Studio → [+ Listing] 버튼을 클릭 합니다.

[+ Listing] 버튼이 비 활성화 되어 있다면 orgadmin role 에 create data exchange listing 권한을 부여 해 줍니다.

grant create data exchange listing on account to role orgadmin;

Home → Data → Provider Studio 페이지에서 Review Provider Terms of Service를 활성화 합니다.

Home → Data → Provider Studio 페이지에서 Review Provider Terms of Service를 활성화 합니다.

Title을 기술하고, Only Specified Consumers를 선택한 후 [Next] 버튼을 클릭 합니다.

Title을 기술하고, Only Specified Consumers를 선택한 후 [Next] 버튼을 클릭 합니다.

필요한 테이블(여기서는 trips)을 선택하기 위해 [+ Select] 버튼을 클릭 합니다.

필요한 테이블(여기서는 trips)을 선택하기 위해 [+ Select] 버튼을 클릭 합니다.

CITIBIKE → PUBLIC → TRIPS 를 선택 하고 [Done] 버튼을 클릭 합니다.

CITIBIKE → PUBLIC → TRIPS 를 선택 하고 [Done] 버튼을 클릭 합니다.

Add consumer accounts에 싱가포르 Region 정보를 기입(organization_name, account_name)합니다.

Briefly describe your listing을 적절히 기술 합니다.

Add consumer accounts에 싱가포르 Region 정보를 기입(organization_name, account_name)합니다.

마지막으로 Auto-fulfillment 항목에 Replication 해야할 주기를 적절히 설정하고 [Publish] 버튼을 클릭합니다.

마지막으로 Auto-fulfillment 항목에 Replication 해야할 주기를 적절히 설정하고 [Publish] 버튼을 클릭합니다.

Replication 준비가 완료 되었습니다.

싱가포르 Region에서 작업

Home → Data → Private Sharing 페이지에서 Privately Shared Listings 항목에 서울Region에서 Replication한 항목을 확인할 수 있습니다.

[Get] 버튼을 클릭 합니다.

Home → Data → Private Sharing 페이지에서 Privately Shared Listings 항목에 서울Region에서 Replication한 항목을 확인할 수 있습니다.

팝업 페이지에서 데이터가 준비가 되면 설정한 메일주소로 알려준다는 메시지가 보입니다.

[OK] 버튼을 클릭 합니다.

팝업 페이지에서 데이터가 준비가 되면 설정한 메일주소로 알려준다는 메시지가 보입니다.

완료가 될 때 까지 기다립니다.

완료가 될 때 까지 기다립니다.

동기화가 완료되면 아래와 같이 메일이 발송됩니다.

동기화가 완료되면 아래와 같이 메일이 발송됩니다.

다시 Home → Data → Private Sharing 페이지로 이동합니다.

[Get] 버튼을 클릭 합니다.

Home → Data → Private Sharing 페이지로 이동합니다

Database name을 지정하고 [Get] 버튼을 클릭 합니다.

Database name을 지정하고 [Get] 버튼을 클릭 합니다.

[Query Data] 버튼을 클릭합니다.

[Query Data] 버튼을 클릭합니다.

TRIPS 테이블이 보이는지 확인 합니다.

TRIPS 테이블이 보이는지 확인 합니다.

데이터가 잘 보이는지 Query를 해봅니다.

데이터가 잘 보이는지 Query를 해봅니다.

서울Region에서 Replication 정보를 확인할 수 있습니다.

정리하며

  • Snowflake 는 E-mail 만 있으면 손쉽게 계정을 만들 수 있었습니다.
  • 사전작업에서는 손쉽게 S3에서 데이터를 적재하는 방법도 알 수 있었습니다.
  • Snowflake는 다른 Region간에도 손쉽게 데이터를 Replication 할 수 있습니다.

Snowflake의 Data Replication 기능을 이용하면 이처럼 간편하게 데이터를 전달할 수 있어, 사업 확장 및 데이터 관리에 큰 도움이 됩니다.

--

--