📢 본 문서는 PostgreSQL Replication 설정 시 발생할 수 있는 내용을 다룹니다. PostgreSQL Replication 구성에 대한 내용은
PostgreSQL Replication - 구성을 참조하세요.1. ssh-keygen 설정
2. listen_addresses 설정하지 않았을 경우
3. pg_hba.conf 설정하지 않았을 경우
4. max_wal_senders를 1 이하로 설정했을 경우
5. hot_standby 설정
6. Replication User 접속 불가
7. PostgreSQL Database Encoding/locale 옵션이 다른 경우
8. recovery.conf
9. postgresql.conf 위치 확인
10. pg_hba.conf 위치 확인
11. Online 상태에서 Data Directory 백업
1. ssh-keygen 설정
📢 ssh-keygen 설정 후에도 SSH 접속 시 비밀번호를 물어보는 경우 SELinux(Security-Enhanced Linux) 설정을 확인하세요.
permissive 또는 disabled로 설정되어 있어야 합니다. SELinux 설정은 /etc/selinux/config에서 할 수 있습니다.2. listen_addresses 설정하지 않았을 경우
Standby Server에서 Main Server로 접속을 할 수 없어 에러가 발생합니다.
해결방법
Standby Server에서 Main Server로 접속 가능하도록 Main Server postgresql.conf의
listen_addresses = '*' 또는 listen_addresses = 'Standby_Server_IP'를 설정해 줍니다.3. pg_hba.conf 설정하지 않았을 경우
Streaming Replication 설정에서 Standby Server는 Main Server의 WAL Record를 추적합니다. Replication User로 Main Server에 접속하지 못하면 Replication은 실패합니다.
해결방법
Physical Replication에서 Standby Server가 Main Server에 Replication User로 접근이 가능하도록 pg_hba.conf에 설정해야 합니다. pg_hba.conf에서 DATABASE를
replication으로 지정해야 Replication User를 통한 접속이 가능합니다.이때, 허용 가능한 값 중
all이 존재하는데, all에는 replication이 포함되어 있지 않으므로 주의해야 합니다.📢 Logical Replication은 DATABASE를
all로 설정해야 합니다. 만약 replication으로 설정하면 아래와 같은 에러가 발생합니다. ERROR: could not connect to the publisher: connection to server at "main_server", port 5432 failed: FATAL: no pg_hba.conf entry for host "standby_server", user "repluser", database "postgres", no encryption4. max_wal_senders를 1 이하로 설정했을 경우
Replication을 사용할 경우, WAL 파일을 전달하기 위한 Sender 1개와 pg_basebackup을 위한 Sender 1개가 반드시 필요합니다. 따라서
max_wal_senders는 최소 2 이상으로 설정해야 하며, 이보다 작은 경우 Replication 구성에 실패합니다.해결방법
max_wal_senders의 값을 2 이상으로 설정합니다. max_wal_senders는 PostgreSQL 9.6 버전까지는 기본값이 0이지만, PostgreSQL 10 버전부터 기본값이 10입니다.5. hot_standby 설정
hot_standby 값을 off로 설정하면 Standby Server는 Main Server로부터 전달받은 WAL 파일을 Restore 하는 역할만 수행합니다. 즉, 사용자는 Standby Server에 접속하지 못할뿐더러, Query 수행을 할 수 없습니다.6. Replication User 접속 불가
Replication 전용 DB User를 생성했지만, Login 권한이 없어서 접속이 불가능할 경우 에러가 발생합니다. PostgreSQL에서는 User와 Role을 혼용해서 사용합니다. CREATE USER로 생성 시 Login 권한이 기본으로 부여가 되지만, CREATE ROLE로 생성 시 Login 권한이 부여되지 않습니다.
해결방법
Replication 전용 DB User에 Login 권한을 추가적으로 부여합니다.
7. PostgreSQL Database Encoding/locale 옵션이 다른 경우
PostgreSQL Database 생성 시 Encoding/locale 옵션이 다를 경우 Replication 초기화가 불가능할 수 있습니다. Linux의 경우 옵션 없이 initdb 수행 시 Encoding 옵션이 UTF8이지만, Windows의 경우 WIN1252입니다.
해결방법
Standby Server의 Database를 Encoding/locale 옵션을 Main Server와 동일하게 부여하여 다시 구성합니다.
8. recovery.conf
recovery.conf는 Replication에 관련된 파라미터로 구성되어 있습니다. postgresql.conf, pg_hba.conf, pg_ident.conf 등의 Configuration 파일 위치는 변경이 가능하지만, recovery.conf는 PostgreSQL Data Directory 내부에만 존재해야 합니다. recovery.conf 파일이 존재하는 Server는 Standby Server로 운영되며, recovery.conf 파일이 recovery.done으로 이름이 변경됩니다.
recovery.conf는 PostgreSQL 8.0 버전부터 사용되었으며, PostgreSQL 12 버전에서 recovery.conf에 기술된 파라미터는 postgresql.conf에 배치되고, standby.signal과 recovery.signal 두 개의 Signal 파일을 사용하는 것으로 대체되었습니다. 따라서, PostgreSQL 12 버전부터는 PostgreSQL Data Directory에 recovery.conf가 존재하면 Database가 기동 되지 않습니다.
standby.signal
Database Server를 Standby Server로 사용하기 위해 사용하는 Signal 파일입니다. PostgreSQL 12 버전부터 사용되며, recovery.conf의 standby_mode(on 또는 off)를 대체하여 사용됩니다. recovery.signal 파일보다 우선순위가 높습니다.
recovery.signal
Database Server를 Targeted Recovery Mode로 시작하기 위해 사용하는 Signal 파일입니다.
파라미터 변경내용 1) Archive Recovery Setting
아래 파라미터들은 PostgreSQL 12 버전부터 postgresql.conf의 Write_Ahead Log 항목으로 분류됩니다.
recovery.conf | 설명 |
archive_clenaup_command | 중복으로 Archive된 WAL 파일을 정리하기 위한 쉘 명령을 지정 |
recovery_end_command | 복구 종료 시 실행할 쉘 명령을 지정 |
restore_command | WAL Archive 파일을 이용하여 Database 복구 시 사용하는 쉘 명령을 지정 |
파라미터 변경내용 2) Recovery Target Setting
아래 파라미터들은 PostgreSQL 12 버전부터 postgresql.conf의 Write_Ahead Log 항목으로 분류됩니다. pause_at_recovery_target 파라미터는 PostgreSQL 9.6 버전부터 recovery_target_action으로 변경되었습니다.
recovery.conf | 설명 |
pause_at_recovery_target | 복구 대상에 도달했을 때 수행할 행동을 결정.9.5 버전 부터 recovery_target_action으로 변경. |
recovery_target | 일관적인 상태가 되자마자 복구가 종료되도록 지정 (immediate가 지정할 수 있는 유일한 값) |
recovery_target_action | 복구 대상에 도달했을 때 수행할 행동을 결정.9.5 버전 부터 pause_at_recovery_target에서 recovery_target_action로 변경 (pause/promote/shutdown) |
recovery_target_inclusive | 지정된 복구 대상 바로 뒤(true) 또는 복구 대상 바로 앞(false)에서 중지할지 여부를 지정. |
recovery_target_lsn | 복구가 진행될 WAL 위치의 LSN을 설정 |
recovery_target_name | pg_create_restore_point 함수를 이용하여 복원 지점을 지정 |
recovery_target_time | 복구가 진행될 시간을 지정. recovery_target_time과 recovery_target_xid 중 최대 하나만 지정가능. 정확한 정지 지점은 recovery_target_inclusive의 영향을 받음 |
recovery_target_timeline | 복구할 Timeline을 지정 |
recovery_target_xid | 복구가 진행될 트랜잭션 ID를 지정. recovery_target_time과 recovery_target_xid 중 최대 하나만 지정가능. 정확한 정지 지점은 recovery_target_inclusive의 영향을 받음 |
파라미터 변경내용 3) Standby Server Setting
아래 파라미터들은 PostgreSQL 12 버전부터 postgresql.conf의 Replication 항목으로 분류됩니다. PostgreSQL 12 버전부터 standby_mode 파라미터는 standby.signal과 recovery.signal 파일로 대체되었습니다.
recovery.conf | 설명 |
primary_conninfo | Replication 대상 DB(Main Server)의 접속 정보 |
primary_slot_name | Streaming Replication에서 Main Server에 연결할 때 사용할 복제슬롯이름 |
recovery_min_apply_delay | 지정한 시간만큼 복구를 지연시킴(단위:ms) |
standby_mode | Standby Server로 운영하고자 할 때, on으로 설정 |
tirgger_file | Standby 상태가 끝났음을 알리는 파일이름을 지정.지정한 파일이 존재하면 Standby Mode를 종료하고 Active 상태로 운영한다. standby_mode=off 이면 이 설정은 무시. PostgreSQL 12 버전부터 promote_trigger_file로 변경 |
9. postgresql.conf 위치 확인
프로세스 조회를 통한 위치 확인
SQL 조회를 통한 위치 확인
10. pg_hba.conf 위치 확인
프로세스 조회를 통한 위치 확인
SQL 조회를 통한 위치 확인
11. Online 상태에서 Data Directory 백업
Online 상태에서도 Data Directory에 대한 백업을 수행할 수 있습니다. 단, 이를 위해서는 다음과 같은 설정이 필요합니다.
wal_level = replica
archive_mode = on
archive_command
Online 백업을 수행하기 위해
pg_start_backup으로 Database를 Hot Backup 모드로 진입시키고 Data Directory를 백업합니다(OS). 백업 완료 후 pg_stop_backup 명령어를 통해 Hot Backup 모드를 종료합니다. 이때, 백업된 Data Directory와 Hot Backup 모드에서 발생한 WAL 파일들을 이용하면 완전복구가 가능합니다.pg_start_backup()
File System Level에서 백업을 수행할 수 있는 상태로 만드는 함수입니다. 함수를 수행한 시점에 백업파일에서 복구할 수 있는 최소 WAL 파일 위치의 LSN(Log Sequence Number)을 반환합니다. 또한, PostgreSQL Data Directory를 백업한 Directory에는 backup_label 파일이 생성됩니다.
📢 PostgreSQL 15 버전부터 pg_backup_start로 변경되었습니다.
backup_label
백업에 대한 Meta Data를 제공하기 위해 생성된 파일입니다. 특히 백업 시작 LSN에 대한 Meta Data를 포함하고 있어 백업된 서버는 처음 시작할 때 WAL 파일 적용을 시작할 위치를 알 수 있습니다. 복구(복제) 서버에서 PostgreSQL Database 기동이 성공하면, backup_label.old로 이름이 변경됩니다.
항목 | 설명 |
START WAL LOCATION | |
CHECKPOINT LOCATION | pg_start_backup 수행 시 발생한 Checkpoint가 기록된 LSN 위치 |
BACKUP METHOD | 백업 방식 |
BACKUP FROM | 백업이 수행된 서브 (primary 또는 standby) |
START TIME | pg_start_backup이 수행된 시간 |
LABEL | pg_start_backup 실행 시 입력한 라벨 값 |
START TIMELINE | PostgreSQL 11 버전에 도입되었고, 백업 시작 시점의 타임라인 값을 기록 |
pg_stop_backup()
pg_start_backup이 끝났음을 알려주는 함수이며, 수행되면 WAL File을 Switching 하며 백업이 끝났음을 WAL에 기록합니다. 또한, 백업 히스토리 파일을 생성합니다.
📢 PostgreSQL 15 버전부터 pg_backup_stop로 변경되었습니다.
함께 보면 좋은 아티클
