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