새소식

PostgreSQL

[ PostgreSQL ] Wal-g Backup ( Cloud ObjectStorage )

  • -
반응형

현재 고객사에서 사용하고있는 wal-g Backup Opensource 관련하여 작성할예정이다.

WAL-G는 PostgreSQL, MySQL/MariaDB 및 MS SQL Server(MongoDB 및 Redis용 베타)용 아카이브 복원 도구입니다.

WAL-G는 몇 가지 주요 차이점이 있는 WAL-E의 후속 제품입니다. WAL-G는 Postgres용 LZ4, LZMA 또는 Brotli 압축, 다중 프로세서 및 비독점적 기본 백업을 사용합니다.

 

https://github.com/wal-g/wal-g

 

GitHub - wal-g/wal-g: Archival and Restoration for Postgres

Archival and Restoration for Postgres. Contribute to wal-g/wal-g development by creating an account on GitHub.

github.com

 

■ 다운로드

- 해당 URL에서 원하는 Version의 wal-g 를 다운로드

https://github.com/wal-g/wal-g/releases

 

Releases · wal-g/wal-g

Archival and Restoration for Postgres. Contribute to wal-g/wal-g development by creating an account on GitHub.

github.com

 

■ Wal-g 설치

[root@postgres ~]# tar -zxvf wal-g.linux-amd64.tar.gz 
wal-g

 

■ PostgreSQL 설치

- RPM을 이용하여 설치하도록 하겠습니다

https://yum.postgresql.org/rpmchart/  --> PostgreSQL 다운로드 가능

1.Postgresql package 설치
[root@postgres ~]# ll
total 60164
-rw-r--r-- 1 root root  1666016 Dec  1 09:06 postgresql12-12.3-5PGDG.rhel7.x86_64.rpm
-rw-r--r-- 1 root root   623648 Dec  1 09:06 postgresql12-contrib-12.3-5PGDG.rhel7.x86_64.rpm
-rw-r--r-- 1 root root   377888 Dec  1 09:06 postgresql12-libs-12.3-5PGDG.rhel7.x86_64.rpm
-rw-r--r-- 1 root root  5199596 Dec  1 09:06 postgresql12-server-12.3-5PGDG.rhel7.x86_64.rpm

[root@postgres ~]# yum -y install ./postgresql*

2.Database Data Directory 생성 & 권한 부여
[root@postgres ~]# mkdir -p /mnt/pgsql/12/data
[root@postgres ~]# chown -R postgres.postgres /mnt/pgsql/ 

3.PostgreSQL 설치
[root@postgres ~]# su - postgres
-bash-4.2$ /usr/pgsql-12/bin/initdb -D /mnt/pgsql/12/data/

이 데이터베이스 시스템에서 만들어지는 파일들은 그 소유주가 "postgres" id로
지정될 것입니다. 또한 이 사용자는 서버 프로세스의 소유주가 됩니다.

데이터베이스 클러스터는 "ko_KR.UTF-8" 로케일으로 초기화될 것입니다.
기본 데이터베이스 인코딩은 "UTF8" 인코딩으로 설정되었습니다.
initdb: "ko_KR.UTF-8" 로케일에 알맞은 전문검색 설정을 찾을 수 없음
기본 텍스트 검색 구성이 "simple"(으)로 설정됩니다.

자료 페이지 체크섬 기능 사용 하지 않음

이미 있는 /mnt/pgsql/12/data 디렉터리의 액세스 권한을 고치는 중 ...완료
하위 디렉터리 만드는 중 ...완료
사용할 동적 공유 메모리 관리방식을 선택하는 중 ... posix
max_connections 초기값을 선택하는 중 ...100
기본 shared_buffers를 선택하는 중... 128MB
기본 지역 시간대를 선택 중 ... Asia/Seoul
환경설정 파일을 만드는 중 ...완료
부트스트랩 스크립트 실행 중 ... 완료
부트스트랩 다음 초기화 작업 중 ... 완료
자료를 디스크에 동기화 하는 중 ... 완료

initdb: 경고: 로컬 접속용 "trust" 인증을 설정 함
이 값을 바꾸려면, pg_hba.conf 파일을 수정하든지,
다음번 initdb 명령을 사용할 때, -A 옵션 또는 --auth-local,
--auth-host 옵션을 사용해서 인증 방법을 지정할 수 있습니다.

작업완료. 이제 다음 명령을 이용해서 서버를 가동 할 수 있습니다:

    /usr/pgsql-12/bin/pg_ctl -D /mnt/pgsql/12/data/ -l 로그파일 start


4. PostgreSQL 시작
-bash-4.2$ /usr/pgsql-12/bin/pg_ctl -D /mnt/pgsql/12/data/ -l /mnt/pgsql/12/pgsql.log start

 

 

■ Wal-g .walg.json 파일 생성

- wal-g Backup때 사용할 Config 파일을 생성하낟.

- .walg.json에 Cloud의 ObjectStorage와 관련된 정보를 적어주면 ObjectStorage로 바로 Postgres의 Backup & Archive 파일들이 저장되게된다.

  "WALG_UPLOAD_CONCURRENCY": "2",  --> 백업 업로드 중에 사용할 동시성 스트림수 Default 16
  "WALG_DOWNLOAD_CONCURRENCY": "2",  --> 백업 다운로드 중에 사용할 동시성 스트림수 Default 10
  "WALG_UPLOAD_DISK_CONCURRENCY": "2",
  "WALG_DELTA_MAX_STEPS": "7",  --> 전제 백없 사이에 있을수 있는 델타 백업의 수 
  "WALG_COMPRESSION_METHOD": "brotli"   -- > 압축 방법 ( 3개가 있는데 가장 나음 ) 

postgres@postgres:/mnt/pgsql/12# mkdir -p wal

postgres@postgres:/mnt/pgsql/12# cd wal/

postgres@postgres:/mnt/pgsql/12/wal# vi .walg.json 
{
  "WALG_S3_PREFIX": "s3://nhtest/test/walg/",
  "AWS_ACCESS_KEY_ID": "VPcSO5skHg1bcxxp3CXz",
  "AWS_SECRET_ACCESS_KEY": "Mbzt5rpYxj2A2vX467Hw7LBsCnfOc1YJKmOE0fqa",
  "AWS_ENDPOINT": "https://kr.object.ncloudstorage.com",
  "AWS_S3_FORCE_PATH_STYLE": "true",
  "AWS_REGION": "us-east-1",
  "PGHOST": "localhost",
  "PGPORT": "5432",
  "PGDATA": "/mnt/pgsql/12/data",
  "WALG_UPLOAD_CONCURRENCY": "2",
  "WALG_DOWNLOAD_CONCURRENCY": "2",
  "WALG_UPLOAD_DISK_CONCURRENCY": "2",
  "WALG_DELTA_MAX_STEPS": "7",
  "WALG_COMPRESSION_METHOD": "brotli"
}

 

■ Postgres.conf 파일 수정

- Archive mode로 변경 ( Database Restart 필요 )

 ( /usr/pgsql-12/bin/pg_ctl -D /mnt/pgsql/12/data/ -l /mnt/pgsql/12/pgsql.log restart )

 

- Archive_command로 Archive가 바로 ObjectStorage로 올라가도록 변경 ( Database reload 필요 )

 ( /usr/pgsql-12/bin/pg_ctl reload -D /mnt/pgsql/12/data/ )

postgres@postgres:/mnt/pgsql/12/wal# cd /mnt/pgsql/12/data

*Archive 관련 파라미터 수정
postgres@postgres:/mnt/pgsql/12/data# vi postgresql.conf   

archive_mode = on
archive_command = '/mnt/pgsql/12/bin/wal-g wal-push --config /mnt/pgsql/12/wal/.walg.json %p'

 

■ FULL Backup

postgres@postgres:/mnt/pgsql/12/wal# /mnt/pgsql/12/bin/wal-g backup-push --config /mnt/pgsql/12/wal/.walg.json  /mnt/pgsql/12/data/ --full
INFO: 2021/12/07 10:15:02.892855 Doing full backup.
INFO: 2021/12/07 10:15:02.904687 Calling pg_start_backup()
INFO: 2021/12/07 10:15:02.969821 Walking ...
INFO: 2021/12/07 10:15:02.970009 Starting part 1 ...
INFO: 2021/12/07 10:15:02.970083 Starting part 2 ...
INFO: 2021/12/07 10:15:03.173430 Finished writing part 2.
INFO: 2021/12/07 10:15:03.421691 Finished writing part 1.
INFO: 2021/12/07 10:15:03.461775 Starting part 3 ...
INFO: 2021/12/07 10:15:03.461812 /global/pg_control
INFO: 2021/12/07 10:15:03.463342 Finished writing part 3.
INFO: 2021/12/07 10:15:03.468063 Calling pg_stop_backup()
INFO: 2021/12/07 10:15:04.520385 Starting part 4 ...
INFO: 2021/12/07 10:15:04.520463 backup_label
INFO: 2021/12/07 10:15:04.520472 tablespace_map
INFO: 2021/12/07 10:15:04.527869 Finished writing part 4.
INFO: 2021/12/07 10:15:04.902792 Wrote backup with name base_00000005000000000000003B

 

■ Backup List 조회

postgres@postgres:/mnt/pgsql/12/data# /mnt/pgsql/12/bin/wal-g --config /mnt/pgsql/12/wal/.walg.json backup-list
name                          last_modified        wal_segment_backup_start
base_000000040000000000000031 2021-12-02T07:31:53Z 000000040000000000000031
base_000000040000000000000033 2021-12-03T04:40:33Z 000000040000000000000033
base_000000040000000000000038 2021-12-03T05:27:19Z 000000040000000000000038
base_00000005000000000000003B 2021-12-07T01:15:04Z 00000005000000000000003B

 

■ Restore

- 기존 DataFile 경로가 있으면 Error가 발생하기때문에 mv 한후 진행

- wal-g backup-fetch명령어로 objectstorage에서 백업본을 가져온다. 뒤에 LATEST 또는 백업본의 이름을 지정할수있다.

- postgresql.auto.conf에 restore_command 를 추가하여 Backup 이후에 발생한 Archive 또한 가져올수있다.

postgres@postgres:/mnt/pgsql/12# mv /mnt/pgsql/12/data /mnt/pgsql/12/data4

postgres@postgres:/mnt/pgsql/12# /mnt/pgsql/12/bin/wal-g backup-fetch --config=/mnt/pgsql/12/wal/.walg.json /mnt/pgsql/12/data LATEST 
INFO: 2021/12/07 10:34:17.778360 LATEST backup is: 'base_00000005000000000000003B'
INFO: 2021/12/07 10:34:19.204340 Finished extraction of part_001.tar.br
INFO: 2021/12/07 10:34:19.204632 Finished decompression of part_001.tar.br
INFO: 2021/12/07 10:34:19.238117 Finished extraction of part_004.tar.br
INFO: 2021/12/07 10:34:19.238137 Finished decompression of part_004.tar.br
INFO: 2021/12/07 10:34:19.540026 Finished extraction of part_002.tar.br
INFO: 2021/12/07 10:34:19.540235 Finished decompression of part_002.tar.br
INFO: 2021/12/07 10:34:19.556205 Finished decompression of pg_control.tar.br
INFO: 2021/12/07 10:34:19.556215 Finished extraction of pg_control.tar.br
INFO: 2021/12/07 10:34:19.556221 
Backup extraction complete


postgres@postgres:/mnt/pgsql/12/data# vi postgresql.auto.conf 
restore_command='/mnt/pgsql/12/bin/wal-g wal-fetch --config=/mnt/pgsql/12/wal/.walg.json %f %p'


postgres@postgres:/mnt/pgsql/12/data# /usr/pgsql-12/bin/pg_ctl -D /mnt/pgsql/12/data/ -l /mnt/pgsql/12/pgsql.log start
waiting for server to start.... done
server started

 

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.