[PostgreSQL] 백업 방법 - 아카이브 모드 백업

참고

 

개요

  • 데이터베이스는 하나의 서비스에 꼭 필요하며, 무결성과 지속 가능성이 깨지지 않도록 하는 게 원칙입니다.
  • 그에 따라 철저한 백업 관리 및 정책이 당연시 요구됩니다.
  • PostgreSQL 백업 방법에는 3가지 방법이 있고, 이번에는 아카이브 모드 백업 방식에 대한 자료 조사 및 PoC 진행합니다.

 

WAL (Write-Ahead Logging) 파일이란?

  • 아카이브 모드 백업을 하기 전에 WAL 파일에 대해서 우선 개념 정리가 필요합니다.
  • Write-Ahead Logging (WAL) 파일은 데이터 무결성을 보장하는 표준 방법인데 어떤 데이터베이스에 쿼리를 날려 이벤트를 실행 할 때, 데이터를 변경하기 전에 해당 변경 내용을 로그에 미리 담아두고 이후에 변경한다는 개념입니다.
  • 이렇게 되면, 어떠한 문제 (데이터 충돌, 파괴 등등..) 이 발생했을 때 WAL 파일에 로깅된 내용을 보고 복구가 가능할 수 있기 떄문에 무결성을 보장해 줄 수 있습니다.

 

아카이브 모드 백업이란?

  • PostgreSQL 은 미리 쓰기 로그(WAL) 을 pg_wal 디렉터리에서 관리합니다.
  • 이 로그는 데이터베이스에 대한 모든 조작 기록을 보관하고 있어, 서버가 갑자기 비정상적으로 종료된 경우 데이터파일에 적용하지 못한 작업은 이 로그파일을 읽어서 복구할 수 있습니다.
  • 이 로그를 다른 서버로 보내, 이 로그의 내용을 그대로 실행하여 원본 서버와 똑같이 만들 수 있습니다.
  • 또한, 특정 시점까지만 실행하도록 하여, 특정 시점으로 복구할 수도 있습니다.
  • 이 방법은 SQL 덤프 / 파일 시스템 백업보다 복잡하지만 다양한 장점이 있습니다.

 

pg_wal 디렉터리

  • PostgreSQL / PPAS 10 버전 이전에는 pg_xlog wlog 지만, 그 이후 버전에서는 pg_wal 로 변경되었습니다.
  • 타 RDBMS 에서 사용하는 Redo 로그 파일의 개념인 WAL 파일들을 보관하는 공간입니다.
  • DB가 비정상 종료되어 기록중이던 데이터들을 디스크에 쓰지 못했을 때, 복구하는 용도로 쓰는것이 1순위 기능이며 PostgreSQL / PPAS 에서는 이를 사용하여 replication 을 겁니다.
  • 보통 생각하는 ORACLE Redo 로그 파일 순환과 다른 점이 있는데 PostgreSQL / PPAS 에서는 pg_wal 파일을 지속적으로 만들어서 쌓아 두다가 변경 데이터들을 메모리에서 디스크에 써내리는 checkpoint 가 일어나면 해당 시점 이전의 파일들을 삭제합니다.
  • 그래서 이러한 삭제 파일들도 보관하여 나중에 필요 시 복구 때 쓸수 있도록 설정하는 것이 archive 입니다.
  • ORACLE 과 동일하게 archive 는 기본 설정이 OFF 이므로, 운영 서버에서는 필수로 설정을 해줘야 합니다.

 

아카이브 모드 백업의 장점

  • 파일 시스템을 백업할 때, 파일 시스템 상태에 대해서 신경 쓸 필요가 없습니다. 즉, 파일 시스템의 스냅샷 기능을 고려할 필요가 없습니다.
  • 복원 작업에 필요한 WAL 파일의 수량은 제한이 없기 떄문에, 백업을 시작한 시점 이후에 생긴 WAL 로그파일만 보관된다면, 백업 기간이 아무리 길어져도 복구가 가능합니다. 이는 전체 백업을 자주 할 수 없는 대용량 데이터베이스 백업에서 유용하빈다.
  • 복원을 할 때 WAL 파일의 내용을 끝까지 실행할 필요가 없습니다. 이 복구를 특정 시점 복구 Point-In-Time-Recovery 라고 합니다.
  • 다른 호스트에 전체 백업을 복원할 후, 운영서버에서 만들어진 WAL 파일을 주기적으로 다른 호스트로 복사하여 반영해 놓으면, 운영 서버에서 장애가 발생할 때 빠르게 복구가 가능합니다.

 

아카이브 모드 백업의 단점

  • 아카이브 모드 백업 작업도 특정 데이터베이스만을 대상으로 할 수 없고 전체를 대상으로 진행합니다.
  • 또한, 아카이브 로그를 저장해야 하기 때문에 디스크의 여유 공간도 많이 필요합니다.
  • 따라서, 아카이브 로그 파일이 계속 쌓이지 않도록 관리해 주어야 합니다.

참고로, 계속 쌓이지 않도록 파일을 로테이션 방식으로 재사용할 수 있도록 설정할 수도 있습니다.

 

WAL 아카이브 파일

  • PostgreSQL 은 데이터베이스 조작시 순차적인 WAL 레코드를 만듭니다.
  • 이 레코드는 물리적인 디스크 공간에 저장하기 위해 16MB 인 WAL 세그먼트 파일로 나뉘어 저장합니다.
  • 이 파일의 이름은 WAL 순서에 따른 해당 번호 파일로 부여되며, WAL 아카이브 파일을 만들지 않도록 설정하면 몇 개만 만들어지며 사용하지 않는 로그파일을 로테이션 방식으로 재사용 합니다.
  • 내부적으로 WAL 레코드들의 상태 정보를 찾아, 체크포인트 작업이 일어난 것에 대해서는 사용하지 않는 상태로 바꾸고 그 자리에 새로운 WAL 레코드를 기록하는 방식으로 재사용하게 됩니다.

 

WAL 아카이브 파일 만드는 방법

  • 아카이브 백업과 복구를 위해 WAL 아카이브 파일을 만들어 보겠습니다.
  • 아카이브 파일을 만들기 위해 postgresql.conf 파일에 다음 3가지의 프로퍼티를 설정해 줍니다.
프로퍼티
wal_level replica 혹은 logical
archive_mode on
archive_command 완료된 WAL 파일 세그먼트를 아카이브 하기 위해 실행하는 로컬 쉘 명령으로 사용자가 지정
예약어
%p : WAL 로그파일 절대 경로
%f : 보관할 로그 파일 이름

 

파라미터 설정

  • WAL 파일을 만들기 위해서 파라미터 설정이 필요합니다. (postgresql.conf)
    • wal_level : WAL에 기록되는 정보의 양을 지정하는 요소, WAL 아카이브 설정에 필요한 archive 설정
      • minimal : 기본값은 충돌 또는 즉시 셧다운으로부터 복구하기 위해 필요한 정보만 기록합니다.
      • archive : WAL 아카이브에 필요한 로깅만 추가합니다. (9.6 버전부터는 hot_standby 와 archive 모두 replica 로 대체 되었습니다.)
      • replica : 9.4 버전까지는 hot_standby 였습ㄴ디ㅏ. 9.6 버전 부터는 replica 라는 값으로 대체 되었고, Slave 노드에서 읽기 전용 쿼리에 필요한 정보를 좀 더 추가합니다.
      • logical : 논리적 디코딩을 지원하는데 필요한 정보를 추가합니다.
    • archive_command : WAL 파일을 아카이브 시키는 명령어 (%p : WAL 파일의 절대 경로, %f : 저장할 로그 파일의 이름)
      • archive_command = 'cp %p 아카이브 파일을 저장할 곳%f'
    • archive_mode : on - WAL 파일이 archive_command 설정에 따라 아카이브를 저장하는 저장소로 전달, off 설정 - archive_mode 를 on 으로 설정하려면 wal_level 을 archive 로 설정해야 합니다.
    • archive_timeout : 아카이브 되지 않고 데이터가 남아 있는 경우를 방지하기 위해 지정한 시간마다 새로운 WAL 파일을 아카이브하도록 지정하는 명령어입니다. 60 ~ 120 초 사이로 설정
wal_level = replica
archive_command = 'cp %p /var/lib/postgresql/archive/%f'
archive_mode = on
archive_timeout = 1 #minute
  • 현재 저는 postgresql.conf 파일 적용이 되지 않아서, 수동으로 직접 archive 옵션을 설정해 주었습니다.
  • 수동으로 옵션주는 방법은 수동 아카이브 백업 파일 생성 해당 사이트를 참고하였습니다.

 

백업 결과

  • 수동으로 Archive Mode, Archive Command 설정 후, 확인 결과 백업 경로에 WAL 로그가 생성되는 것을 확인할 수 있습니다.

 

WAL 아카이브 파일 만들 때 주의점

  • archive_command 명령은 PostgreSQL 서버를 실행했던 시스템 사용자 권한으로 실행 되어야 합니다.
  • 또한, 실행 리턴값은 성공한 경우 0, 아닌 경우 0 이 아니게 반환 되도록 해야 합니다.
  • 그래야 이 리턴값으로 파일을 잘 보관했는지 실패했는 지 판단하고 실패한 경우 재처리할 수 있기 때문입니다.
  • WAL 파일을 저장할 때, 그 저장장치의 속도도 고려해야 하는데 정상적으로 진행된다 하더라도 WAL 파일이 만들어지는 속도가 보관하는 속도보다 빠르다면, 중간 내용이 없이 보관되는 문제가 발생할 수 있기 때문입니다.
  • WAL 파일은 트랜잭션 정보만 있기 때문에 conf 파일의 변경사항은 수동으로 작업을 해야 합니다.
  • 아카이브 명령은 WAL 파일 가운데 서버에 모두 반영된 파일(rollback 이나 commit 되어 checkpoint 작업이 끝난) 에 대해서 실행됩니다.
  • 즉, 작업량이 아주 적은 데이터베이스인 경우 아카이브 명령이 실행될 간격이 길어지게 됩니다.
  • 이 사이 데이터베이스 장애가 생긴다면 간격이 길어진만큼 손실될 가능성이 크기 때문에 archive_timeout 값을 짧게 하여 강제로 세그먼트 파일을 따로 저장하도록 할 수 있습니다.

 

728x90

이 글을 공유하기

댓글

Designed by JB FACTORY