본문 바로가기
  • A space that records me :)
기술/DB 이중화(HA)

[PotgreSQL] PostgreSQL 이중화 (HA)

by yjkim_97 2021. 10. 29.
  • 2021.10.29 고객 데이터베이스가 PostgreSQL을 사용.
  • 새로운 프로젝트 구축할 때 PostgreSQL을 사용할 예정.
  • 이중화, failover 구축 예정

환경

  • Linux, Centos 7
  • PostgreSQL v.14

PostgreSQL

PostgreSQL 특징

 

PostgreSQL 설치

2021.10.31 - [IT story/DB] - [PostgreSQL] PostgreSQL 설치 및 외부접속 허용 (Centos7)

 

[PostgreSQL] PostgreSQL 설치 및 외부접속 허용 (Centos7)

환경 Linux, Centos7 PostgreSQL v.13 1. PostgreSQL 설치 DB 설치 $ sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm $ sudo yum..

yjkim97.tistory.com


PostgreSQL은 v.12부터 HA 설정이 달라졌다. 나는 v.13을 사용하기로 했다.

원래 현재 제일 최신버전 14를 사용하였지만 Pgpool-13이 최신이여서 다운그레이드 하였다.

1. Streaming Replication (Master-Slave)

PostgreSQL은 자체적으로 HA를 제공한다. Archive방식에는 두가지가 있으며, 해당 포스트에서는 Streaming 방식을 사용하였다.

그러나, PostgreSQL의 자체 HA는 부족한 점이 많다. 수동으로 FailOver와 FailBack처리를 해줘야한다. (이것은 Pgpool-II을 사용하면 Auto FailOver/FailBack이 된다.)

 

  • standby.signal, postgresql.auto.conf를 가진 서버를 Slave로 인식한다.
    1. standby.signal : 빈 파일
    2. postgresql.auto.conf : Master 연결 정보가 들어있다. (이 정보는 postgresql.conf에도 동일하게 존재한다.  postgresql.auto.conf 우선순위가 더 높다.)

 

1-1. Backup (Archive)

PostgreSQL에는 자체적으로 Slave를 만들어 다중화 기능이 있다.

PostgreSql은 Master-Slave-Slave를 권장한다. 이유는 Failover 발생 후 Failback하는 동안에 또다른 Slave를 두어 데이터 손실을 방지하기 위함이다.

 

PostgreSQL은 WAL 파일을 이용하여 Archive기능을 제공한다.

WAL(Write Ahead Log) 파일?
WAL 파일에는 DB의 변경 내용을 기록한다. MySQL의 binlog 파일과 같은 역할을 한다.

복제 방식 두가지

  1. Realtime Streaming
    • WAL 파일의 내용을 전송하는 실시간 스트리밍 기법
    • Master에서 wal sender 프로세스가 돌고, Slave에서는 wal receiver 프로세스가 돈다.
  2. Log-shipping
    • WAL 파일 자체를 전송하는 기법

Archive 구성 방법

Arichive 경로 : /data/postgresql/archive

 

1. DB 중지 [위치 : master, slave]

$ systemctl stop postgresql-13

2. OS에 postgresql이 사용할 User 생성 (User : postgres) [위치 : master, slave]

$ passwd postgres

3. DB archive 데이터용 디렉토리 생성

(디렉토리 경로는 원하는대로 바꿀 수 있다. 나는 /var/lib/pgsql/13/archive)

생성된 디렉토리의 소유권을 postgres 유저에게 넘긴다. [위치 : master, slave]

 

$ mkdir -p /data/postgresql/archive
$ chown -R postgres.postgres /data/postgresql/archive

4. PostgreSQL에 복제 계정 생성 (ID : repuser) [위치 : master]

$ sudo -u postgres psql
create user repl replication login encrypted password {password} connection limit -1;

5. archive 설정 후 재가동 [위치 : master]

  1. postgresql.conf에 archive 설정
  2. pg_hba.conf에 인증 허용 설정
$ vi /var/lib/pgsql/13/data/postgresql.conf
---> 
wal_level = replica
wal_log_hints = on 
archive_mode = on 
archive_command = 'test ! -f /data/postgresql/archive/%f && cp %p /data/postgresql/archive/%f'
max_wal_senders = 3
hot_standby = on
logging_collector = on

$ echo "local replication postgres trust" >> /var/lib/pgsql/13/data/pg_hba.conf 
$ echo "host replication repl {slave ip}/32 md5" >> /var/lib/pgsql/13/data/pg_hba.conf

$ systemctl restart postgresql-13

6. master의 데이터 복제/백업 [위치 : slave]

복제시 pg_basebackup 툴을 사용하는데, 이것은 postgresql의 자체 백업 툴이다.

$ mv /var/lib/pgsql/13/data/ /var/lib/pgsql/13/data.org
$ mkdir -p /var/lib/pgsql/13/data/
$ chown -R postgres:postgres /var/lib/pgsql/13/data
$ chmod -R 0700 /var/lib/pgsql/13/data

$ su - postgres
$ export LANG=C
$ /usr/pgsql-13/bin/pg_basebackup -h {master ip} -D /var/lib/pgsql/13/data -U repl -v -P -R -X stream -C -S pgstandby1
  • pg_basebackup-R 옵션이 복제이다. 이 옵션은 --write-recovery-conf로 대체 가능하다.
  • pg_basebackup의 -X stream옵션은 WAL 파일 백업 방법이다. 이 옵션은 --wal-method=stream로 대체 가능하다.

7. postgres data 경로에 가서 standby.signal, postgresql.auto.conf을 확인한다.

  • standby.signal은 빈파일로 복제 시 자동 생성되어 있다.
  • postgresql.auto.conf에 복제 대상이였던 master 접속 정보가 들어있다.

8. DB 재가동 [위치 : slave]

$ systemctl restart postgresql-13

9. DB 접속 후 해당 데이터베이스의 역할 확인 [위치 : master, slave]

master는 f, slave는 t로 나온다.

select pg_is_in_recovery();

10. slave에서는 select만 가능하며, master db에서 데이터를 추가 및 수정하면 slave에도 즉시 적용되어 있는 것을 확인 할 수 있다.

 

1-2. Failover 

Slave를 Master로 승격시킨다.

Master : A, Slave : B

  1. A에 문제 발생
  2. B를 Master로 승격
    • B의 postgresql.conf에 설정되어 있는 promote_trigger_file이 존재하면 B는 본인을 알아서 자동 승격 시킨다.
    • promote_trigger_file을 생성하는 것은 수동으로 해야한다. (이역할을 pgpool이 해줄수 있다.)
  3. Master가 된 B는 이제 Read/Write가능

1-2. Failback & Recovery

  1. A의 문제 해결
  2. A를 잠시 Slave로 전환 후 현재 Master인 B로 부터 Backup받음 (Archive)
  3. A를 Master로 B를 Slave로 원복

 


Pgpool을 이용한 HA와 커넥션 관리

2021.10.29 - [IT story/DB] - [PostgreSQL] Pgpool-II

 

[PostgreSQL] Pgpool-II + Watchdog setting

[2021.10.29] PostgreSQL 데이터베이스 서버 2대를 구성하던 중, PostgreSQL만으로는 자동 아카이빙 복제는 되지만 자동 failover는 되지 않는다는 것을 알게되었다. Auto Failovr 를 위해 알아보던 중 대표적인

yjkim97.tistory.com


https://www.postgresql.org/docs/14/index.html

 

PostgreSQL 14.0 Documentation

PostgreSQL 14.0 Documentation The PostgreSQL Global Development Group Copyright © 1996–2021 The PostgreSQL Global Development Group Legal Notice Table of …

www.postgresql.org

 

'기술 > DB 이중화(HA)' 카테고리의 다른 글

[PostgreSQL] Pgpool-II + Watchdog setting  (2) 2021.10.29