PostgreSQL 18에서 즉시 데이터베이스 복제 구현

1 month ago 13

  • PostgreSQL 18은 파일 복제 전략(FILE_COPY)파일 시스템 클론 기능을 결합해 데이터베이스를 거의 즉시 복제할 수 있음
  • 새로운 설정값 file_copy_method = clone 을 사용하면 XFS, ZFS, APFS 등 현대적 파일시스템의 복제 기능(FICLONE) 을 활용 가능
  • 벤치마크 결과, 6GB 데이터베이스 복제 시 기존 WAL_LOG 방식은 약 67초, 클론 방식은 0.2초 수준으로 단축됨
  • 복제된 데이터베이스는 초기에는 동일한 물리 블록을 공유하지만, 쓰기 작업 시 copy-on-write로 분리됨
  • 단, 활성 연결이 없는 상태에서만 복제 가능하며, 단일 파일시스템 내에서만 작동하는 제약 존재

PostgreSQL의 템플릿 기반 복제 구조

  • PostgreSQL은 CREATE DATABASE dbname 명령 시 내부적으로 template1 데이터베이스를 복제해 새 데이터베이스를 생성
    • 이는 CREATE DATABASE dbname TEMPLATE template1 과 동일한 동작
  • template1 대신 다른 데이터베이스를 지정할 수 있어, 사용자 정의 템플릿을 활용한 복제 가능
  • PostgreSQL 18에서는 이 템플릿 시스템을 즉시 복제 가능한 구조로 확장

CREATE DATABASE ... STRATEGY

  • PostgreSQL 15부터 CREATE DATABASE ... STRATEGY 매개변수가 도입되어 복제 방식 선택 가능
    • 기본값은 WAL_LOG로, Write-Ahead Log를 통한 블록 단위 복제 수행
    • 이 방식은 I/O 부하를 줄이고 동시성 지원을 개선하지만, 대용량 복제 시 속도가 느림
  • STRATEGY=FILE_COPY를 지정하면 기존 파일 복사 방식으로 되돌릴 수 있으며, PostgreSQL 18에서는 이를 기반으로 새로운 복제 옵션 추가

FILE_COPY와 file_copy_method

  • PostgreSQL 18의 file_copy_method 설정은 운영체제 수준의 파일 복제 방식을 제어
    • 기본값은 copy이며, 모든 바이트를 읽고 새 위치에 기록
    • clone으로 변경하면 파일시스템의 클론 기능(FICLONE) 을 사용해 즉시 복제 및 추가 공간 소모 없음
  • 지원 파일시스템: XFS, ZFS, APFS, FreeBSD ZFS
  • 설정 절차
    • 해당 파일시스템 위에 PostgreSQL 클러스터 구성
    • file_copy_method = clone 설정 후 재로드

벤치마크 결과

  • 약 6GB 크기의 테스트 데이터베이스(source_db) 생성 후 두 가지 방식 비교
    • WAL_LOG 방식: 67,000ms (약 67초)
    • FILE_COPY + clone 방식: 212ms
  • 동일한 데이터 크기에서 약 300배 이상 속도 향상 확인
  • 복제된 데이터베이스(fast_clone)는 추가 디스크 공간을 거의 사용하지 않음

복제된 데이터의 동작 원리

  • file_copy_method = clone 사용 시, 파일시스템 메타데이터만 복제되어 두 데이터베이스가 동일한 물리 블록을 공유
  • PostgreSQL이 보고하는 데이터베이스 크기는 논리적 크기(약 6GB)로 동일
  • 쓰기 작업 발생 시 copy-on-write(COW) 가 작동하여 해당 페이지가 분리됨
    • 수정된 행이 포함된 페이지
    • 새 튜플이 기록되는 페이지
    • 인덱스 페이지 및 FSM, visibility map 페이지 등
  • VACUUM 실행 시에도 추가적인 페이지 분리 발생

XFS에서의 공유 블록 검증

  • filefrag -v 명령으로 두 데이터베이스의 물리 블록 공유 여부 확인
    • 초기 상태에서는 모든 extents가 shared로 표시
    • 일부 행을 업데이트하면 첫 40블록(약 160KB)이 분리되어 서로 다른 물리 주소로 변경
    • 나머지 extents는 여전히 공유 상태 유지

주의사항 및 제약

  • 복제 시 원본 데이터베이스에 활성 연결이 없어야 함
    • 이는 PostgreSQL의 제약이며, 파일시스템 문제는 아님
    • 실서비스 환경에서는 별도의 템플릿 데이터베이스를 사용하는 것이 일반적
  • 단일 파일시스템 내에서만 복제 가능
    • 여러 테이블스페이스가 서로 다른 마운트 포인트에 있을 경우, 일반 복사로 대체됨
  • 클라우드 관리형 서비스(AWS RDS, Google Cloud SQL 등) 에서는 파일시스템 접근이 불가하므로 이 기능 사용 불가
    • 자체 VM이나 베어메탈 환경에서는 완전한 제어 가능

결론

  • PostgreSQL 18의 file_copy_method = clone 기능은 운영체제 수준의 클론 기능을 직접 활용
    대용량 데이터베이스 복제 시간을 극적으로 단축
  • 테스트, 개발, 학습 환경에서 즉시 복제 및 리셋 가능한 데이터베이스 워크플로우 구현 가능
  • 단, 활성 연결 제약과 파일시스템 단일성을 고려한 운영 설계 필요

Read Entire Article