Postgresql/백업 및 복구

wal-g 에 대해

dbavayne 2025. 3. 9. 17:21

WAL-G: PostgreSQL 백업을 위한 오픈소스 도구

WAL-G는 PostgreSQL 데이터베이스의 백업과 복구를 효율적으로 처리하기 위한 오픈소스 도구입니다. 기존 WAL-E의 후속 버전으로 개발되었으며, 더욱 강력한 기능과 성능 최적화를 제공합니다. 이번 포스팅에서는 WAL-G의 주요 특징과 장점을 간략히 정리해보겠습니다.

주요 기능

  1. 물리적 백업과 원격 스토리지 연동
    WAL-G는 데이터베이스의 전체 백업과 증분 백업을 지원하며, 백업 데이터를 로컬 파일시스템에 저장하지 않고 바로 Amazon S3, Google Cloud Storage(GCS) 같은 원격 스토리지로 전송합니다. 이를 통해 디스크 공간을 절약하고 클라우드 환경에서의 활용성을 높였습니다.
  2. 압축과 암호화
    LZ4, ZSTD와 같은 고성능 압축 알고리즘을 사용해 백업 파일 크기를 줄이고, 암호화를 통해 데이터 보안을 강화합니다. 백업 과정에서 성능과 안전성을 동시에 잡은 점이 돋보입니다.
  3. WAL 아카이빙과 PITR
    PostgreSQL의 WAL(Write-Ahead Log)을 연속적으로 아카이빙하여 특정 시점 복구(Point-in-Time Recovery, PITR)를 지원합니다. 이를 통해 데이터 손실을 최소화하고 정확한 복구가 가능합니다.
  4. 병렬 처리
    백업과 복구 작업을 병렬로 처리하여 속도를 크게 향상시켰습니다. 대규모 데이터베이스 환경에서도 빠르고 안정적인 운영이 가능합니다.

특징 및 장점

  • 간편한 설정: PostgreSQL 환경 변수를 활용해 쉽게 구성할 수 있습니다.
  • 클라우드 친화적: 원격 스토리지와의 통합으로 재해 복구(Disaster Recovery)에 최적화되어 있습니다.
  • 확장성: PostgreSQL뿐만 아니라 MySQL, SQL Server 등 다른 데이터베이스도 지원하며 지속적으로 발전 중입니다.
  • 오픈소스: Apache 2.0 라이선스로 제공되어 누구나 자유롭게 사용할 수 있습니다.

주요 명령어 정리

1. backup-fetch

  • 사용 방법: 특정 백업을 지정된 경로로 복구하거나, 최신 백업(LATEST)을 가져옵니다.
    • 예: wal-g backup-fetch ~/extract/to/here example-backup
    • 최신 백업: wal-g backup-fetch ~/extract/to/here LATEST
    • 사용자 데이터로 특정 백업 선택: wal-g backup-fetch /path --target-user-data "{ \"x\": [3], \"y\": 4 }"
  • 주의 사항:
    • 복구 경로가 존재하지 않으면 WAL-G가 자동으로 생성합니다.
    • 부분 복구(--restore-only)는 실험적 기능으로, 시스템 데이터베이스는 자동 복구되지만, 복구되지 않은 데이터베이스나 테이블의 잔여 데이터는 수동으로 삭제해야 할 수 있습니다.
    • 역방향 델타 압축 해제(--reverse-unpack)와 중복 아카이브 건너뛰기(--skip-redundant-tars)는 효율성을 높이지만, 설정이 올바르지 않으면 복구가 불완전할 수 있으니 주의하세요.

2. backup-push

  • 사용 방법: PostgreSQL 데이터 디렉토리에서 백업을 생성하고 원격 저장소로 업로드합니다.
    • 예: wal-g backup-push $PGDATA
    • 원격 백업: PGHOST=srv1 wal-g backup-push
  • 주의 사항:
    • $PGDATA 환경 변수와 명령줄 인자가 일치해야 하며, 그렇지 않으면 오류가 발생할 수 있습니다.
    • 대기 서버(standby)에서 실행 시 타임라인 변경(프로모션 등)이 발생하면 백업이 완료되지 않고 오류로 종료됩니다. 이 경우 로그를 확인해 수동으로 마무리해야 할 수 있습니다.
    • --permanent 플래그를 사용하면 백업이 영구적으로 표시되어 삭제되지 않으니, 필요한 경우에만 사용하세요.
    • 델타 백업(WALG_DELTA_MAX_STEPS > 0)을 사용할 때는 기본적으로 최신 백업을 기반으로 하지만, --delta-from-name 또는 --delta-from-user-data로 특정 백업을 지정할 수 있습니다.

3. wal-fetch

  • 사용 방법: 지정된 WAL 아카이브를 다운로드하며, 프리페치(prefetch) 기능으로 후속 WAL 파일을 캐시에 저장합니다.
    • 예: wal-g wal-fetch example-archive new-file-name
  • 주의 사항:
    • 복구 대상 파일은 사전에 존재하면 안 됩니다(WAL-G가 생성).
    • 캐시(./.wal-g/prefetch)가 과도하게 커지지 않도록 오래된 파일은 자동 삭제되지만, 디스크 공간을 주기적으로 확인하세요.
    • WAL 파일이 저장소에 없으면 오류 코드 74(EX_IOERR)를 반환하며, 기타 오류는 코드 1로 종료되므로 PostgreSQL 복구 설정(restore_command)에서 이를 처리하는 스크립트가 필요할 수 있습니다.

4. wal-push

  • 사용 방법: WAL 아카이브를 원격 저장소로 업로드합니다.
    • 예: wal-g wal-push /path/to/archive
  • 주의 사항:
    • PostgreSQL의 archive_command에 사용되므로 절대 경로를 정확히 지정해야 합니다.
    • WALG_PREVENT_WAL_OVERWRITE 설정 시 동일 이름의 WAL이 이미 존재하면 업로드가 실패하니, 중복 확인이 필요합니다.

5. wal-show

  • 사용 방법: WAL 저장소의 타임라인과 백업 상태를 확인합니다.
    • 예: wal-g wal-show
  • 주의 사항:
    • 기본 출력은 텍스트 테이블이며, 상세 JSON 출력을 원하면 --detailed-json 플래그를 추가하세요.
    • 누락된 세그먼트가 있으면 LOST_SEGMENTS 상태로 표시되므로, PITR(Point-in-Time Recovery)에 문제가 생길 수 있습니다.

6. wal-verify

  • 사용 방법: WAL 저장소의 무결성과 타임라인 상태를 점검합니다.
    • 예: wal-g wal-verify integrity timeline
  • 주의 사항:
    • integrity 체크는 백업 시작부터 현재 클러스터까지의 WAL 연속성을 확인하며, MISSING_LOST 세그먼트가 있으면 FAILURE로 표시됩니다.
    • timeline 체크는 분리된 브레인(split-brain) 상황을 감지하며, 저장소가 초기화되지 않은 상태라면 결과가 부정확할 수 있습니다.

7. wal-receive

  • 사용 방법: 스트리밍 복제를 통해 WAL을 수신하고 저장소에 업로드합니다.
    • 예: wal-g wal-receive
  • 주의 사항:
    • WALG_SLOTNAME으로 복제 슬롯 이름을 지정할 수 있으며, 유효한 문자(0-9, A-Z, a-z, _)만 사용 가능합니다.

8. backup-mark

  • 사용 방법: 백업을 영구적으로 표시하거나 해제합니다.
    • 예: wal-g backup-mark example-backup -i
  • 주의 사항:
    • 영구 백업은 delete 명령으로 제거되지 않으므로, 신중히 사용하세요.

9. catchup-push / catchup-fetch

  • 사용 방법: 복제본(replica)을 위한 증분 백업을 생성하고 복구합니다.
    • 예: wal-g catchup-push /path/to/master/postgres --from-lsn replica_lsn
    • 예: wal-g catchup-fetch /path/to/replica/postgres backup_name
  • 주의 사항:
    • 복제본을 중지한 후 LSN을 확인하고, 마스터에서 백업을 시작해야 합니다.

10. copy

  • 사용 방법: 백업을 다른 저장소로 복사합니다.
    • 예: wal-g copy --from=config_from.json --to=config_to.json
  • 주의 사항:
    • -w 플래그로 WAL 복사 범위를 조정할 수 있으니, 필요에 따라 설정하세요.

11. delete garbage

  • 사용 방법: 오래된 WAL 아카이브와 실패한 백업 파일을 삭제합니다.
    • 예: wal-g delete garbage
  • 주의 사항:
    • 영구 백업 이전의 모든 비영구 객체를 삭제하므로, 삭제 전 백업 상태를 확인하세요.

12. wal-restore

  • 사용 방법: pg_rewind에 필요한 WAL 세그먼트를 복구합니다.
    • 예: wal-g wal-restore path/to/target-pgdata path/to/source-pgdata
  • 주의 사항:
    • 현재 로컬 클러스터만 지원합니다.

13. daemon

  • 사용 방법: 백그라운드에서 WAL을 아카이빙하고 가져옵니다.
    • 예: wal-g daemon path/to/socket-descriptor
  • 주의 사항:
    • WALG_DAEMON_WAL_UPLOAD_TIMEOUT(기본 60초) 초과 시 작업이 중단되니 네트워크 상태를 고려하세요.

설정 관련 주의 사항

  • 환경 변수: PGHOST, PGPORT, PGUSER, PGPASSWORD 등 PostgreSQL 환경 변수를 올바르게 설정해야 연결이 가능합니다. 특히 UNIX 소켓(PGHOST=/var/run/postgresql)을 선호하므로, TCP 연결 시 IP 주소를 명시하세요.
  • 동시성 설정: WALG_UPLOAD_CONCURRENCY, WALG_DOWNLOAD_CONCURRENCY 등으로 작업 속도를 조정할 수 있지만, 리소스 사용량이 증가하니 서버 성능에 맞게 설정하세요.
  • 델타 백업: WALG_DELTA_MAX_STEPS로 델타 백업 깊이를 설정할 수 있으나, 너무 크면 복구 시간이 길어질 수 있습니다.
  • 메타데이터: WALG_WITHOUT_FILES_METADATA를 사용하면 메모리 사용량이 줄지만, 일부 기능(예: 델타 백업)이 제한됩니다.

 


wal-g에서 생성된 표준경로

1. basebackups/ (또는 basebackups_005/)

  • 역할: 베이스 백업(Base Backup) 파일이 저장되는 디렉토리입니다.
  • 베이스 백업: 데이터베이스의 전체 스냅샷으로, 특정 시점의 모든 데이터 파일을 포함합니다.
  • 복구 시 필요성: WAL 파일만으로는 복구가 불가능하며, 반드시 최신 베이스 백업을 기준으로 복구를 시작해야 합니다.

파일명 규칙:

 

  • backup_label → 백업 시점에 대한 정보 (시작 시점, LSN 위치 등)
  • tablespace_map → 테이블스페이스 관련 정보
  • pg_data/ → PostgreSQL 데이터베이스 파일 전체

 

2. wal/ (또는 wal_005/)

  • 역할: WAL (Write-Ahead Logging) 파일이 저장되는 디렉토리입니다.
  • WAL 파일은 PostgreSQL의 트랜잭션 로그로, 모든 변경 사항이 기록되어 장애 복구 시 필수입니다.
  • WAL-G는 PostgreSQL에서 발생하는 WAL 파일을 지속적으로 압축 및 보관하는 방식으로 작동합니다.

 

 

파일명 규칙:

  • 00000001 → 타임라인 (Timeline ID)
  • 00000000000000A → WAL 세그먼트 번호 (각 파일은 16MB 단위)
  • .lz4 → WAL-G에서 기본적으로 사용하는 압축 형식