Innovating today, leading tomorrow

OpenSQL_Technical Guide
[OpenSQL] pg_receivewal

[OpenSQL] pg_receivewal

pg_receivewal 개요

pg_receivewal 이란?

stream write-ahead logs from a PostgreSQL server
– PostgreSQL 공식 문서 –

pg_receivewal은 PostgreSQL 서버로 부터 Write-Ahead Log를 스트리밍 합니다.

스트리밍은 아카이브와 동일하게 Write-Ahead Log를 추가 보관하는 방법 중에 하나 이지만, 실시간으로 Write-Ahead Log를 저장하기 때문에 최신의 데이터베이스 상태와 가까운 상태의 Write-Ahead Log를 보관할 수 있다는 장점이 있습니다.

스트리밍 연결 시에 Replication Protocol을 사용하기 때문에 아래와 같은 권한이 필요합니다!!

  • 연결에 사용할 PostgreSQL 유저에 Replication 권한
  • pg_hba.conf에서 Replication 접속 허락

pg_receivewal 사용법

커맨드 시놉시스

pg_receivewal [option…] -D directory

옵션

옵션설명
-Ddirectory 또는 –directory=directorydirectory 에 스트리밍 결과 파일을 저장합니다. 필수 파라미터입니다!
-hhost 또는 –host=host연결할 PostgreSQL 서버의 host를 지정합니다.
-pport 또는 –port=port연결할 PostgreSQL 서버의 port를 지정합니다.
-Uusername 또는 –username=usernamePostgreSQL 서버에 연결할 때 사용할 유저를 지정합니다.
-w 또는 –no-passwordPostgreSQL 서버에 연결할 때 패스워드를 사용하지 않습니다. 해당 접속에 대해 패스워드를 사용하지 않는 연결 방법이 서버에 설정되어 있어야 합니다.
-W 또는 –passwordPostgreSQL 서버에 연결할 때 패스워드를 사용합니다. pg_receivewal 프로세스가 서버에 연결할 때 패스워드가 있는지 확인 하고 재연결을 하는 것이 아니라 바로 패스워드를 입력받기 때문에, 연결 시에 장점이 있습니다.
-E 또는 –endpos=lsn스트리밍을 끝낼 lsn 위치를 지정합니다. 지정한 위치까지 스트리밍이 완료되면, pg_receivewal 프로세스가 정상 종료코드(0)를 반환 및 종료합니다.
-sslotname  또는 –slot=slotname연결된 서버에서 pg_receivewal이 필요로 하는 WAL 파일을 지우거나 재활용 하지 않도록 슬롯을 사용합니다. 서버에서 pg_receivewal이 더 이상 필요로 하지 않는 파일인지 확인할 수 있도록 –syncrhonous 옵션을 같이 사용해야 합니다.
–create-slot-s 또는–slot이름의 물리적 복제 슬롯을 생성합니다.
–if-not-exists–create-slot 옵션을 주었을 때, 해당 이름을 가진 슬롯이 없을 경우에만 슬롯을 생성합니다. 이 옵션을 주지 않을 경우 기존에 같은 이름의 슬롯이 있다면 에러가 발생합니다.
–drop-slot-s 또는–slot이름의 물리적 복제 슬롯을 삭제합니다.
-n 또는 –no-loop이 옵션을 사용하게 되면, 연결에 실패했을 경우 에러가 발생하며 프로세스가 종료되고 연결을 재시도하지 않습니다
–no-syncWAL 데이터를 디스크에 강제로 flush 하지 않도록 합니다. 속도가 빨라지지만, 운영체제의 동작으로 인해서 WAL segement가 손상될 수 있습니다
–synchronousWAL 데이터를 받는 즉시 디스크에 flush 합니다. flushing 작업이 끝나면 PostgreSQL 서버에 결과 패킷을 전송합니다.
-sinterval 또는 –status-interval=interval서버로 다시 전송할 상태 패킷의 전송 주기를 지정합니다. 값이 0이면 주기적 상태 업데이트가 완전히 비활성화 되지만 시간 초과 연결 해제를 방지하기 위해 서버에서 요청할 때 업데이트가 계속 전송됩니다. 기본값은 10초입니다.
-v 또는 –verbose진행 상황을 자세하게 출력합니다.
-zlevel 또는 –compress=levelgzip을 이용해 압축하며, 압축 레벨을 설정합니다. 레벨은 0부터 9까지 있으며 레벨이 높을 수록 높은 압축률을 가집니다. gzip의 기본 압축 레벨은 6입니다.
-V 또는 –versionpg_receivewal의 버전을 출력합니다.
-? 또는 –helppg_receive_wal 커맨드 설명서를 출력합니다.

pg_receivewal 기본 사용 예시

pg_receivewal 실행 예시

pg_receivewal을 이용해서 /opensql/archive 디렉토리에 WAL 파일을 스트리밍 해보겠습니다.

  1. 먼저 슬롯을 생성해줍니다.

[opensql@localhost:~]$ pg_receivewal -D /opensql/archive –host=opensql.server –port=5432 –username=opensql -w –slot=rev_test –create-slot –if-not-exists -v
pg_receivewal: creating replication slot “rev_test”[opensql@localhost:~]$ pg_receivewal -D /opensql/archive –host=opensql.server –port=5432 –username=opensql -w –slot=rev_test –create-slot –if-not-exists –synchronous -v

2. pg_receivewal을 이용해 스트리밍을 시작합니다.

[opensql@localhost:archive]$ pg_receivewal -D /opensql/archive –host=opensql.server –port=5432 –username=opensql -w –slot=rev_test –synchronous -v
pg_receivewal: starting log streaming at 0/2000000 (timeline 1)

3. 스트리밍 프로세스를 확인합니다.

[opensql@localhost:~]$ ps x
PID TTY STAT TIME COMMAND
29439 pts/1 S 0:00 -bash
36061 pts/0 S+ 0:00 pg_receivewal -D /opensql/archive –host=opensql.server –port=5432 –username=opensql -w –slot=rev_test –synchronous -v
36083 pts/1 R+ 0:00 ps x

4. PostgreSQL 서버에서도 연결을 확인해줍니다.

[opensql@server:~]$ ps x
PID TTY STAT TIME COMMAND
2930 ? Ss 0:05 /usr/pgsql-14/bin/postgres -D /hypersql/pg/14/data
2931 ? Ss 0:00 postgres: logger
2933 ? Ss 0:02 postgres: checkpointer
2934 ? Ss 0:27 postgres: background writer
2935 ? Ss 0:29 postgres: walwriter
2936 ? Ss 0:09 postgres: autovacuum launcher
2937 ? Ss 0:02 postgres: archiver last was 000000010000000000000001
2938 ? Ss 0:07 postgres: stats collector
2939 ? Ss 0:00 postgres: logical replication launcher
67286 ? Ss 0:00 postgres: walsender opensql xxx.xxx.xxx.xxx(46594) streaming 0/2D914A8
67301 pts/1 R+ 0:00 ps x
96927 pts/1 S 0:00 -bash

아래와 같이PostgreSQL 데이터베이스 서버에 접속해서 자세한 정보를 확인할 수도 있습니다!

postgres=# SELECT * FROM pg_stat_replication;
pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_l
sn | write_lag | flush_lag | replay_lag | sync_priority | sync_state | reply_time
——-+———-+———+——————+—————–+—————–+————-+——————————-+————–+———–+———–+———–+———–+———
—+—————–+—————–+—————–+—————+————+——————————-
67286 | 22766 | opensql | pg_receivewal | xxx.xxx.xxx.xxx | | 46594 | 2023-02-15 15:37:15.719713+09 | | streaming | 0/2D92DF0 | 0/2D92DF0 | 0/2D92DF0 |
| 00:00:00.002695 | 00:00:00.002695 | 00:03:24.789592 | 0 | async | 2023-02-15 15:40:40.513205+09
(1 row)

백업 복구 관점에서의 pg_receivewal

Archive와 Streaming의 차이점

ArchiveWAL 파일의 기본 사이즈인 16MB까지 WAL 로그를 작성한 다음 파일 작성이 완료되면, 지정된 아카이브 위치로 WAL 파일을 복사합니다.
Streaming실시간으로 WAL 파일의 내용을 받아서 저장 하기 때문에, WAL 파일 작성이 완료되지 않더라도, 작성된 부분 까지 Write-Ahead Log를 보관할 수 있습니다.

위와 같은 차이점으로 인해서, 데이터베이스 서버에 문제가 생겼을 때 데이터 일관성을 복구할 수 있는 범위가 달라지게 됩니다!

지금까지 ‘PostgreSQL pg_receivewal’에 관해 알아보았습니다

‘PostgreSQL WAL’을 바로 이어서 확인해보세요!


광고성 정보 수신

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다.
내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보
  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
 

개인정보 수집 및 이용

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다. 내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보

  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
  •