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=directory | directory 에 스트리밍 결과 파일을 저장합니다. 필수 파라미터입니다! |
-hhost 또는 –host=host | 연결할 PostgreSQL 서버의 host를 지정합니다. |
-pport 또는 –port=port | 연결할 PostgreSQL 서버의 port를 지정합니다. |
-Uusername 또는 –username=username | PostgreSQL 서버에 연결할 때 사용할 유저를 지정합니다. |
-w 또는 –no-password | PostgreSQL 서버에 연결할 때 패스워드를 사용하지 않습니다. 해당 접속에 대해 패스워드를 사용하지 않는 연결 방법이 서버에 설정되어 있어야 합니다. |
-W 또는 –password | PostgreSQL 서버에 연결할 때 패스워드를 사용합니다. 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-sync | WAL 데이터를 디스크에 강제로 flush 하지 않도록 합니다. 속도가 빨라지지만, 운영체제의 동작으로 인해서 WAL segement가 손상될 수 있습니다 |
–synchronous | WAL 데이터를 받는 즉시 디스크에 flush 합니다. flushing 작업이 끝나면 PostgreSQL 서버에 결과 패킷을 전송합니다. |
-sinterval 또는 –status-interval=interval | 서버로 다시 전송할 상태 패킷의 전송 주기를 지정합니다. 값이 0이면 주기적 상태 업데이트가 완전히 비활성화 되지만 시간 초과 연결 해제를 방지하기 위해 서버에서 요청할 때 업데이트가 계속 전송됩니다. 기본값은 10초입니다. |
-v 또는 –verbose | 진행 상황을 자세하게 출력합니다. |
-zlevel 또는 –compress=level | gzip을 이용해 압축하며, 압축 레벨을 설정합니다. 레벨은 0부터 9까지 있으며 레벨이 높을 수록 높은 압축률을 가집니다. gzip의 기본 압축 레벨은 6입니다. |
-V 또는 –version | pg_receivewal의 버전을 출력합니다. |
-? 또는 –help | pg_receive_wal 커맨드 설명서를 출력합니다. |
pg_receivewal 기본 사용 예시
pg_receivewal 실행 예시
pg_receivewal을 이용해서 /opensql/archive 디렉토리에 WAL 파일을 스트리밍 해보겠습니다.
- 먼저 슬롯을 생성해줍니다.
[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의 차이점
Archive | WAL 파일의 기본 사이즈인 16MB까지 WAL 로그를 작성한 다음 파일 작성이 완료되면, 지정된 아카이브 위치로 WAL 파일을 복사합니다. |
---|---|
Streaming | 실시간으로 WAL 파일의 내용을 받아서 저장 하기 때문에, WAL 파일 작성이 완료되지 않더라도, 작성된 부분 까지 Write-Ahead Log를 보관할 수 있습니다. |
위와 같은 차이점으로 인해서, 데이터베이스 서버에 문제가 생겼을 때 데이터 일관성을 복구할 수 있는 범위가 달라지게 됩니다!
지금까지 ‘PostgreSQL pg_receivewal’에 관해 알아보았습니다
‘PostgreSQL WAL’을 바로 이어서 확인해보세요!