본 아키텍처는 PostgreSQL의 대용량 JSON 데이터 처리 시 발생하는 TOAST 메커니즘 및 autovacuum 문제를 해결합니다. 8KB 초과 JSON 값의 잦은 업데이트/삭제는 데드 튜플 생성 및 과도한 I/O를 유발하여 성능 저하를 초래합니다.
이를 극복하기 위해 이중 계층 스토리지 접근 방식을 제안합니다.
핫/콜드 데이터 분리 및 관리
-
핫 데이터: 최근 데이터는 PostgreSQL 일별 파티션에 유지하여 빠른 트랜잭션 접근을 지원합니다.
-
콜드 데이터: 오래된 데이터는 S3의 Parquet 파일로 아카이빙하여 비용 효율적인 장기 보관 및 분석에 활용합니다.
-
DROP PARTITION: PostgreSQL에서DELETE대신DROP PARTITION을 사용하여 autovacuum 사이클을 회피하고 I/O 부담을 줄입니다.
Parquet 기반 S3 스토리지 최적화
-
파일 구조: PostgreSQL 컬럼을 Parquet 포맷에 매핑하며, 로우 그룹 통계로 프레디케이트 푸시다운을 가능케 합니다.
-
결정론적 샤딩:
payload_id해시 함수를 통해 데이터를 샤드에 분산시키고, 계층적 S3 키 구조로 파일을 구성하여 파티션 푸르닝을 지원합니다. 파일은 128-256MB로 분할하고 1-4MB 로우 그룹으로 압축, HTTP 범위 요청에 최적화됩니다.
메타데이터 카탈로그 및 동기화
PostgreSQL에 s3_file_catalog 및 s3_row_groups 테이블을 유지하여 S3 파일 및 로우 그룹 메타데이터를 캐싱합니다. 카탈로그는 Parquet 푸터 파싱 및 통계 디코딩 없이 빠른 포인트 룩업을 지원합니다. 파티션 데이터는 스트리밍으로 Parquet 파일로 작성되며, 완료 후 메타데이터가 PostgreSQL 카탈로그에 기록됩니다.
이러한 접근 방식은 PostgreSQL이 ACID 트랜잭션과 활성 데이터 관리에 집중하고, S3와 Parquet이 비용 효율적인 저장 및 분석 쿼리를 처리하도록 역할을 분리하여 각 시스템의 최적 성능을 활용합니다.