새소식

AWS

AWS MSK를 활용한 AWS RDS PostgreSQL CDC

  • -

H 사의 리테일 플랫폼을 구축하며 적용된 사례입니다.

MSA 환경에서 서비스간 DB 동기화가 필요한 요건을 해결하기 위해 AWS MSK 서비스를 도입하게 되었습니다.

CDC 에 대한 간략적인 개념설명과 AWS MSK 를 사용한 RDS PostgreSQL DB 간의 CDC 구축에 대해 알아보고 구축 후 발생한 RDS 의 DiskFull 현상에 대한 Truble Shooting 도 다뤄보겠습니다.

CDC

Change Data Capture의 약자로 데이터베이스의 데이터가 변경될 때, 변경 정보를 캡처하여 외부 시스템으로 전송하는 기술입니다.
CDC 는 시스템 간에 데이터를 동기화하거나 분석 및 보고에 사용되는 실시간 데이터 파이프라인을 구축하는 데 사용됩니다.

이 글에서는 AWS RDS PostgreSQL 간 데이터 동기화에 대해 알아봅니다.

CDC의 구현 방법

  • Log-based CDC
    데이터베이스에서 생성한 로그 파일을 읽어 데이터의 변경 내용을 캡처.
  • Trigger-based CDC
    데이터 삽입, 업데이트 또는 삭제와 같은 특정 이벤트에 대해 데이터베이스가 자동으로 실행하는 특수 코드인 트리거를 사용하여 데이터의 변경 사항을 캡처.
  • Polling-based CDC
    소스 데이터베이스를 주기적으로(polling interval) 폴링하고 현재 데이터를 이전 상태와 비교하여 데이터의 변경 사항을 캡처.

PostgreSQL 논리적 복제

논리 복제란 한 데이터베이스에서 변경된 내용을 스트림으로 다른 서버로 보내는 것을 말합니다.
PostgreSQL 논리 복제는 WAL(Write-ahead logging) 변경 레코드를 사용하여 논리적 변경 내용을 Stream 합니다.
논리 복제는 개별 테이블 단위로 복제할 수 있습니다.

CDC의 구현 방법 중 Log-based CDC에 해당한다고 볼 수 있습니다.

WAL(로그 선행 기입)

WAL(Write-ahead logging) 은 트랜잭션이 일어나기 전에 로그를 미리 기록하여 트랜잭션 undo, redo 를 할 수 있도록 합니다.

※ DB는 트랜잭션 변경 사항을 로그 파일로 남기는데 종류에 따라서 Oracle은 Redolog, MySQL·MariaDB는 Binlog, PostgreSQL은 WAL로 불립니다.

WAL : https://www.postgresql.org/docs/current/wal-internals.html

 

30.6. WAL Internals

30.6. WAL Internals WAL is automatically enabled; no action is required from the administrator except ensuring that the disk-space requirements for …

www.postgresql.org

PostgreSQL 논리적 본제 과정

1. 초기 데이터 복사 및 동기화를 위한 데이터 흐름

  1. Publisher 인스턴스는 CREATE PUBLICATION 명령을 사용하여 데이터 변경 내용을 복제할 테이블 그룹을 지정합니다.
  2. Subscriber 인스턴스는 CREATE Subscription 명령을 사용하여 게시의 이름과 연결 세부 정보를 지정합니다.
  3. CREATE Subscription이 성공적으로 실행되면 Publisher 인스턴스에 대한 TCP 연결이 트리거 됩니다.
  4. Subscriber로부터 들어오는 연결은 Publisher에서 임시 논리적 복제 슬롯 생성을 트리거합니다.
  5. 기존 구독 테이블의 초기 데이터는 스냅샷을 생성하는 데 사용되며 COPY 명령을 통해 Subscriber에게 전송됩니다.
  6. Subscriber의 초기 동기화 작업자(Initial sync worker)는 스냅샷을 수신하고 스냅샷 내의 페이로드를 로컬 테이블에 매핑하고 필요한 작업을 적용합니다.

 

2. 초기화 스냅샷이 복사된 후 트랜잭션 데이터의 흐름

  1. 초기 동기화가 완료되면 pgoutput이라는 논리적 디코딩 플러그인을 통해 영구 슬롯(기본적으로 구독과 동일한 이름으로)이 생성됩니다. 이 슬롯은 관련 구독의 수명과 함께 계속 존재합니다.
  2. walsender 프로세스는 수신된 WAL(논리적 디코딩이라고 함)에서 모든 영구 변경 사항 추출을 시작합니다.
  3. 플러그인은 WAL에서 검색된 변경 사항을 논리적 복제 프로토콜로 변환하고 게시 사양에 따라 데이터를 필터링 합니다.
  4. 적용 작업자(Apply worker)는 전송된 데이터를 로컬 테이블에 적용합니다.

https://aws.amazon.com/ko/blogs/database/using-logical-replication-to-replicate-managed-amazon-rds-for-postgresql-and-amazon-aurora-to-self-managed-postgresql/

 

Using logical replication to replicate managed Amazon RDS for PostgreSQL and Amazon Aurora to self-managed PostgreSQL | Amazon W

  PostgreSQL version 10 introduced several exciting features and improvements to the existing landscape of PostgreSQL. One such feature is logical replication using a publish and subscribe framework. AWS provides two managed PostgreSQL options: Amazon RDS

aws.amazon.com

MSK

Amazon Managed Streaming for Apache Kafka(Amazon MSK)는 Apache Kafka를 사용하여 스트리밍 데이터를 처리하는 애플리케이션의 구축 및 실행을 위해 사용할 수 있는 완전관리형 서비스입니다.

 

AWS에서Kafka 환경을 관리해야 하는 운영상의 부담 없이 기능 구현에만 집중하면 됩니다. Apache Kafka는 데이터를 스트리밍 하는 방식입니다. MSK 클러스터는 여러 브로커로 구성어 있고 Source Connector를 사용하여 RDS, Kinesis, IoT 등의 데이터를 클러스터에 전송합니다.

Topic 은 실시간으로 데이터를 스트리밍 하고Sink Connector는 Topic을RDS, Kinesis, S3, OpenSearch 등으로 데이터를 전송합니다.

https://aws.amazon.com/ko/msk/

 

완전관리형 Apache Kafka – Amazon MSK – Amazon Web Services

고가용성 Apache Kafka 및 Kafka Connect 클러스터의 프로비저닝, 구성 및 유지 관리 등의 운영 오버헤드를 제거합니다.

aws.amazon.com

 

 

 

MSK CDC Architecture

아래는 Source DB의 변경사항을 Target DB로 적용하기 위한 MSK 솔루션 아키텍처입니다..

이 아키텍처에서 DB는RDS PostgreSQL입니다.

CDC 구성을 위해 Source Connect는 Debezium Connector Plugin 를 사용하였고,Sink Connect는 Plugin으로 Confluent JDBC Connector를 사용합니다.

  1. Source DB의 변경 이벤트를 WAL에 기록합니다.
  2. 실시간 CDC 이벤트 처리를 위해 Source Connect와 Sink Connect를 Amazon MSK Connect에 설정합니다.
  3. Source Connect는 WAL에서 변경 기록을 읽어 Topic에 Message로 발행을 합니다.
  4. Sink Connect는 Topic을 polling 하여 Message 를 읽어 Target DB에 변경사항을 적용합니다.

 

 

SMT(Single Message Transformation)

SMT(Single Message Transform)는 Apache Kafka에서 메시지를 변환하는 데 사용되는 도구입니다. SMT는 Connect의 일부로 제공되며, Connect는 MSK(Apache Kafka)와 다른 데이터 소스를 연결하는 데 사용되는 도구입니다.

SMT 사용하면 Connect에서 데이터를 추출하거나 적재할 때 데이터를 변환할 수 있습니다.

예를 들어, 메시지의 형식을 변환하거나 메시지의 일부를 제거하거나 메시지에 새로운 데이터를 추가할 수 있습니다.

 

 

https://docs.confluent.io/platform/current/connect/transforms/overview.html

 

Get started with Single Message Transforms for self-managed connectors | Confluent Documentation

Single Message Transformations (SMTs) are applied to messages as they flow through Connect. SMTs transform inbound messages after a source connector has produced them, but before they are written to Kafka. SMTs transform outbound messages before they are s

docs.confluent.io

https://debezium.io/documentation/reference/stable/transformations/index.html

 

Transformations :: Debezium Documentation

Extracts the flat structure of field names and values from Debezium change events, facilitating sink connectors which cannot process Debezium’s complex event structure.

debezium.io

 

 

 

논리적 복제를 사용하기 위한 RDS PostgreSQL  파라메터 설정 정보

Parameter Default 변경값 비고
rds.logical_replication 0 1 0 : 논리적 복제 사용안함.
1 : 논리적 복제 사용함.
※ 수정된 값을 적용하기 위해서는 RDS 재기동 필요
max_replication_slots 20 - 최대 replication slot 개수
 - 만약 소스 커넥터가 20개 이상이면 slots 의 개수를 늘려야 함
 - 구성 완료 후 아래 쿼리로 복제 슬롯 목록을 확인 후 사용하지 않는 슬롯이
   존재하면 반드시 삭제 필요(성능 이슈 발생)

슬롯 목록 조회
 - SELECT * FROM pg_replication_slots;

슬롯 삭제
 - SELECT pg_drop_replication_slot('<슬롯 이름>');

PostgreSQL 논리적 복제 vs MSK CDC

  Item RDS PostgreSQL Logical Replication MSK
  작동방식 WAL 에서 DB 의 변경내용 캡쳐
(논리적 복제를 사용하기 위해서는 RDS 파라미터 그룹의 rds.logical_replication 값을 1로 변경해야함)
WAL 에서 DB 의 변경내용 캡쳐
(논리적 복제를 사용하기 위해서는 RDS 파라미터 그룹의 rds.logical_replication 값을 1로 변경해야함)
  구성 편의성 CREATE PUBLICATION
CREATE SUBSCRIPTION
명령으로 간단하게 구성 가능
MSK 클러스터
Source Connect
Sink Connect
구성 필요
  복제 단위 개별 테이블 단위로 복제 가능 개별 테이블 단위로 복제 가능
  제약 사항 Source 와 Target 테이블의 Schema 가 동일해야 함 Foreign Key 에 대한 처리가 어려움
  모니터링 스크립트 기반의 모니터링 - CloudWatch

- 다양한 카프카 모니터링 UI 툴
  ex)UI for Apache Kafka
  (MSK Cluster에 접근 가능한 Instance 에 설치 필요)
  데이터변경 N/A SMT(Simple Message Transform)
  비용 N/A
(스토리지, 네트워크 비용 제외)
MSK 클러스터 비용 및 Connect 비용 발생
(스토리지, 네트워크 비용 제외)

 

 

Trouble Shooting - RDS 의 DiskFull 현상

MSK 로 CDC 시작 후 RDS DiskFull 현상이 발생할 수 있습니다.

  • CDC 시작 후 일 평균 20GiB 의 FreeStroageSpace 감소
  • 감소한 용량만큼 DB 에 데이터가 적재된 것은 아님

 

FreeStroageSpace 감소 원인

  • WAL 파일의 용량이 기하급수적 증가
  • AWS RDS 일 경우 DB 가 유휴 상태일 때 WAL 파일의 크기가 무한히 늘어나는 현상이 발생

 

 

문제해결

  • Source Connector에서 정기적으로 DB에 이벤트를 보내 WAL 파일이 무한히 커지는 것 을 방지
  • Source Connector에 heartbeat 설정 후 WAL 파일 용량 감소 및 FreeStorageSpace 증가

 

 

Source Connector 에 Heartbeat 설정 예시

heartbeat.interval.ms=6000
heartbeat.action.query=INSERT INTO public.kafka_heart_beat (heart_beat_id) VALUES(to_char(now(),'YYYYMMDDHH24MISSMS'))

 

 

Heartbeat 설정 후 WAL 파일 사이즈 아래 SQL 로 WAL 파일 사이즈를 확인해봅니다.

SELECT slot_name
     , pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) AS replicationSlotLag
     , active 
  FROM pg_replication_slots;

 

heartbeat 설정 전 (slog 별 100GB 초과)

 

heartbeat 설정 후 (slot 별 600kB 미만)

Hearbeat 설정 후 WAL 파일 증가에 따른 RDS DiskFull 현상은 발생하지 않습니다.

 

참고 : https://debezium.io/documentation/reference/stable/connectors/postgresql.html#postgresql-wal-disk-space

 

Debezium connector for PostgreSQL :: Debezium Documentation

Tombstone events When a row is deleted, the delete event value still works with log compaction, because Kafka can remove all earlier messages that have that same key. However, for Kafka to remove all messages that have that same key, the message value must

debezium.io

 

 

Amazon Managed Streaming for Apache Kafka 인 MSK를 활용한 AWS RDS PostgreSQL 의 CDC 에 대해 알아보았습니다.

MSA(Microservices Architecture) 구조에서 DB간 공유되어야 할 데이터들의 동기화에 대해 MSK 를 적용할 수 있습니다.

 

The ENd...

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.