구글 PS2팀 백소연
1. CDC란?
CDC(Change Data Capture)는 변경된 데이터를 사용하여 동작을 위할 수 있도록 변경된 데이터를 확인하고 추적하는 데 사용되는 소프트웨어 설계 패턴 집합입니다. 또한 CDC는 기업 데이터 소스에 대한 변경사항의 식별, 캡처, 배포를 기반으로 하는 데이터 통합 접근 방식입니다.
2. Datastream 소개
Datastream은 Google Cloud Platform에서 제공하는 데이터 복제 서비스로, 관계형 데이터베이스 관리 시스템(RDBMS) 및 기타 소스의 소스 데이터를 BigQuery 및 Cloud Storage와 같은 대상으로 거의 실시간으로 가져올 수 있습니다.
Datastream의 이점은 다음과 같습니다.
- 실시간 데이터 분석: ELT 파이프라인을 설정하여 BigQuery에서 거의 실시간 통계를 얻을 수 있어, 데이터 지연 시간을 최소화하고 빠른 의사결정을 지원합니다.
- 서버리스 및 자동 확장: Datastream는 서버리스 서비스로, 리소스 프로비저닝이나 관리가 필요하지 않으며, 자동으로 확장 및 축소하여 서비스 가용성을 유지합니다.
- 간편한 설정 및 모니터링: 쉬운 설정 및 모니터링 환경을 통해 가치를 신속하게 실현할 수 있으며, 운영 및 유지 관리가 간소화됩니다.
- Google Cloud 데이터 서비스 통합: 다양한 Google Cloud 데이터 서비스와의 통합을 지원하여 데이터 이동과 변환을 용이하게합니다.
3. 소스와 대상 설정
Datastream을 이용해 AWS RDS의 MySQL 데이터를 BigQuery로 실시간 복제해 보도록 하겠습니다.

4. AWS RDS(MySQL) 셋팅
MySQL을 소스로 하여 CDC 구성을 위해서 바이너리 로깅을 활성화해야 합니다. DB 파라미터 값을 변경하고 Datastream이 접근 할 수 있는 계정을 생성합니다.
1) MySQL를 사용한 AWS RDS 인스턴스를 생성합니다. 샘플 데이터베이스 및 테이블을 생성하고 샘플 데이터를 삽입합니다.

2) 파라미터 그룹을 생성하고 해당 그룹에서 매개변수를 찾아 아래 표와 같이 수정합니다.

매개변수 | 값 |
---|---|
binlog_format | ROW |
log_bin_use_v1_row_events | TTP |
log_bin_use_v1_row_events | 1 |
read_only | 0 |
net_read_timeout | 3600 |
net_write_timeout | 3600 |
wait_timeout | 86400 |
<표. 매개변수 수정 대상>
3) RDS 인스턴스에서 수정을 선택하여 “추가구성 > DB 파라미터 그룹”에서 신규 생성 및 매개변수 변경을 해준 파라미터 그룹으로 변경 적용합니다.

4) Datastream에서 MySQL 데이터에 접근 가능하도록 계정 생성 및 권한을 부여합니다.
CREATE USER 'datastream'@'%' IDENTIFIED BY '비밀번호';
GRANT REPLICATION SLAVE, SELECT, REPLICATION CLIENT ON *.* TO 'datastream'@'%';
FLUSH PRIVILEGES;
5. 연결 프로필 생성
다음은 Google Cloud 콘솔에서 Datastream을 설정합니다. Datastream에서는 소스와 타겟에 대해서 연결 정보를 “연결 프로필” 서비스를 통해 관리합니다.
1) Datastream에서 연결 프로필 서비스를 선택하고 Create Profile에서 소스인 MySQL을 선택합니다.

2) 소스에 대한 연결 정보를 입력합니다.
- 리전 : Datastream이 작업 될 위치로 소스와 타겟 위치에 상관 없이 지정 가능
- 연결 세부 정보 : MySQL의 연결 정보로 사용자 계정은 이전 단계에서 생성한 “datastream” 계정을 입력

3) 연결 방법을 정의 합니다. Public 혹은 Private하게 설정 가능하며 이번 데모에서는 Public하게 통신하는 방법에 대해서 안내합니다. 연결 방법은 “IP 허용 목록”을 선택합니다.
- 연결 방법 : IP 허용 목록
- 나열 된 IP 목록은 상황에 따라 소스 단 네트워크에서 방화벽 오픈이 필요

4) 타겟정보를 생성합니다. 이전과 동일하게 Create Profile을 선택하고 타겟인 BigQuery를 선택하고 연결 정보를 입력합니다.
- 리전 : 소스 연결 프로필에서 선택한 리전과 동일한 리전을 선택

6. 스트림 생성
이제 CDC 작업을 수행할 스트림을 생성합니다. 사전에 생성 한 연결 프로필을 활용하고 어떻게 작업 할 것인지 구체적으로 정의 합니다.
1) 스트림의 기본 정보를 입력합니다.
- 리전 : 연결 프로필과 동일한 리전을 선택
- 소스 유형 : MySQL
- 대상 위치 유형 : BigQuery

2) 소스 연결 프로필을 선택하고 소스 데이터를 어떻게 옮기지 선택합니다.
- All tables from all schemas : 소스에서 읽어지는 모든 데이터베이스, 테이블 가져오기
- Specific schemas and tables : 데이터베이스, 테이블 사용자 선택
- Custom : 필터링 규칙 적용으로 데이터베이스, 테이블 가져오기

3) “Specific schemas and tables”을 선택하면 소스 데이터베이스 정보를 그대로 읽어오고 원하는 Table을 선택합니다.

4) 스트림 실행 시 초기 적재 데이터의 처리 방법에 대해서 선택합니다.
- Automatic : 스트림 실행 시 자동으로 초기 적재가 실행되고 그 이후 변경분 데이터 적재
- Manual : 초기 적재 필요 시 사용자가 선택적으로 실행

5) 타겟 연결에 대해서 상세 정의 합니다. 타겟 프로필을 먼저 선택합니다.

6) 타겟에 데이터를 어떻게 데이터를 적재할지 선택합니다. 소스와 타겟이 데이터베이스 및 테이블 1:1 매핑하여 적재 할 수도 있고 소스의 모든 데이터가 타겟의 하나의 데이터베이스에 일괄로 적재 할 수도 있습니다. 이번에는 “각 스키마를 위한 데이터 세트” 옵션을 선택하여 소스와 타겟이 1:1로 매핑되어 적재되도록 합니다.
- “각 스키마를 위한 데이터 세트” 선택
- 위치 유형 : 대상인 BigQuery 데이터세트가 위치할 리전 선택
- 데이터 세트 프리픽스 : 소스 데이터베이스와 동일한 형상으로 데이터세트 및 테이블이 생성 될 건데 PREFIX가 필요하다면 작성
- 예) PREFIX가 “raw”이고 소스 데이터베이스가 “demodb”이면 타겟 데이터베이스는 “raw_demodb”로 생성

7) Datastream을 통해 수집되는 변경 분 데이터를 BigQuery에 어떤 주기로 반영 할 것인지 선택합니다. 그리고 스트림 만들기를 선택하여 생성 작업을 완료합니다.
- max_staleness 지정 : BigQuery에 반영 시 upsert 작업이 수행되며 BigQuery 분석 비용이 발생. 수행 빈도가 짧을 수록 비용이 증가 될 수 있음.

7. 실행 및 데이터 확인
스트림 작업 생성이 완료 되었다면 실행하여 데이터가 정상적으로 복제 되는지 확인합니다.
1) 스트림 작업을 시작합니다.

2) 특정 테이블에 대해서 초기적재를 수행해 봅니다. 객체 탭을 선택하면 이관 대상 테이블이 보여지고 “백필 시작”을 선택하여 초기적재를 수행합니다.

3) BigQuery에 데이터가 정상적으로 적재가 되었는지 확인합니다.
- BigQuery > SQL 작업 공간 > Script 창 열기

4) 소스 데이터베이스에서 데이터를 변경하였을 때 BigQuery에 변경 내용이 반영 되는지 확인합니다.

8. 마무리
Datastream을 통해 MySQL에서 BigQuery 데이터를 실시간 복제하는 방법에 대해 알아보았습니다. Datastream을 사용하면 관계형 데이터베이스(RDBMS)에서 BigQuery로의 데이터 복제 작업을 간단하고 빠르게 수행할 수 있으며 데이터의 실시간성을 향상시켜 비즈니스에 가치를 제공할 수 있습니다.
출처
- https://cloud.google.com/datastream/docs/quickstart-replication-to-bigquery?hl=ko
- https://cloud.google.com/datastream/docs/configure-your-source-mysql-database?hl=ko#rdsformysql
- https://cloud.google.com/datastream/docs/destination-bigquery?hl=ko
- https://cloud.google.com/bigquery/docs/change-data-capture?hl=ko#required_permissions
- https://cloud.google.com/datastream/docs/behavior-overview?hl=ko
- https://cloud.google.com/datastream/docs/overview?hl=ko
- https://medium.com/google-cloud/replicate-cloudsql-mysql-data-to-bigquery-in-realtime-using-datastream-ad07b41d2bb6