Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

Streaming Replication 본문

PostgreSQL/Replication

Streaming Replication

`O` 2021. 3. 8. 00:50
728x90
반응형
  • 해당 페이지에서는 Streaming Replication 작동 메커니즘 및 구성방법을 기재한다.

  • Streaming Replication 기본 작동 개요는 아래와 같다.

(그림 출처 : https://www.cybertec-postgresql.com/en/postgresql-high-availability-and-patroni-an-introduction/streaming-replication/)

(다른분 개인 블로그 : https://kimdubi.github.io/postgresql/psql_replication/)

 

 

  • Streaming Replication 은 아래와 같은 메커니즘으로 작동한다.

    • Master 서버 에서 데이터 변동이 일어난 파일은 WAL 파일에 해당 기록들이 저장된다.

    • 두 서버간 Replication 으로 연결이 되어 있다면 Master Server 에 설정된 WAL Sender 프로세스가 해당 변경 내용들을 Slave 서버에 전달한다.
      실제 구동되는 리플리케이션 내부에서 프로세스를 확인해보면 아래와 같이 Master Server 에서는 Wal Sender 가 추가로 기동되어 있다.
      (프로세스옆에 있는 0/숫자 는 Wal file 의 위치 포인터역할을 하는 LSN (Log Sequence Number) 이다.

 

    • Slave 서버에서는 WAL Sender 에서 온 내용들을 WAL Receiver 프로세스가 받으며, 이를 Slave 서버의 WAL 파일로 전달한다.
      실제 구동되는 리플리케이션 내부에서 프로세스를 확인해보면 아래와 같이 Slave Server 에서는 Wal Receiver 가 추가로 기동되어 있다.
      (Master 서버에 있는 숫자와 동일한 LSN 숫자를 받은 것에 주목한다)

  •  
    • 해당 파일들로 전부 전달하면 Slave 서버에 있는 DB가 WAL 의 변경 내용들을 읽어들여서 Master Server 와 동기화 상태가 된다.

  • Streaming Replication 을 기본방법으로 구성하는 방법은 아래와 같다.

    • 먼저 Master Server 에서 DB를 설치 후 아래와 같이 Replication 을 구성하기 위해 postgresql.conf 내에서 변경 해야 할 최소한의 파라미터를 설정 한다.
      (yum 설치 혹은 source 설치로 미리 DB 를 설치해 놓는다.)

      • listen_addresses : 외부에서 접근을 허용할 대상 IP 를 기재하는 파라미터, 보통은 * 로 모두 허용으로 설정 뒤, pg_hba.conf 에서 세부적으로 접근 허용 IP 조절을 한다.

 

      • wal_level : wal 적재 방식을 조절하는 파라미터다. 아래와 같이 세가지가 있는데 replication 으로 구성시에는 replica 로 설정한다. (10 이전 버전에서는 hot_standby 로 설정)

 

      • max_wal_senders (default 0): wal 파일을 전송할 대상 서버 갯수를 지정 할 수 있다(wal_sender 프로세스 수와 관련). 보통은 replication 대상서버보다 크게 잡아서
        각 서버에 연결된 프로세스가 비정상적으로 종료 시, 바로 다른 프로세스가 연결 될 수 있도록 한다. (아래 화면 참조)

    •  
      • wal_keep_segments : wal file 을 보관하는 디렉토리에 최대 보관 할 wal file 갯수를 지정한다. wal file 이 지속적으로 적대 되면서 최대 갯수를 초과하게 될 시, 맨 처음부터 overwrite 되어
        기존 wal 파일들이 삭제 되고 다시 적재 된다. Replication 서버들간에 동기화 중, log 가 갱신되면 이에 대한 gap 및 지연이 발생하므로 적정 수준의 갯수를 지정한다. (아래 화면 참조)

    • postgresql.conf 설정이 끝나면 pg_hba.conf 파일에서도 slave 서버의 접근을 허용하도록 slave 서버 접속 허용 정보를 추가한다.
      (해당 화면에서는 맨 아래에 추가 했으며, 비밀번호 접근이 필요없다면 md5 대신 trust 로 설정한다.)

 

    • 그 후, Master DB 내에 replication 을 위해서 사용할 계정을 생성한다. (계정 및 패스워드는 임의로 지정한다.)

  •  
    • 위의 설정을 마쳤다면, Master Server 의 DB 를 재기동하여 위의 옵션들을 적용시킨다.

    • master 설정이 완료되면 이제 slave 서버와의 동기화가 필요하다. MySQL / MariaDB 에서는 보통 mysqldump 으로 구성된 slave 서버에 master 데이터를 넣어서 데이터 일치를 만드나
      PostgreSQL / PPAS 는 이에 대응하는 pg_dump 이외의 아래와 같은 방법들이 있다.

    • 가장 보편적으로 쓰는 방법은 pg_basebackup 기능이다. ssh 전송 + DB 형상 일치화 작업을 같이 수행하는 기능이라 보면된다. slave 서버에서 master 서버로의 형상을 아래와 같이 가져온다.
      (아래의 명령어로만 사용 시, PW 는 따로 입력해야함. OS 내에 PW 기록 여부 문제가 없을시 PW도 -W 옆에 같이 기입한다.)
    •  
pg_basebackup -h 192.168.137.105 -D /data/ -U repl -W
  •  
    • data 영역이 바로 설치 직후 혹은 운영이 오래되지 않아서 보관하는 데이터가 많지 않을 시, 이에 대해서 ssh 를 통해 통째로 slave 서버에 복사하는 방법도 있다.

    • 그 후, slave 서버의 postgresql.conf 에서 Master 서버와 같이 listen_address 를 * 로 설정 하고, 아래의 hot_standby 파라미터를 on 으로 조절한다.
      (slave 서버를 읽기전용으로 사용하기 뒤에 사용하는 파라미터다.)

  •  
    • 설정을 완료한 뒤, slave 서버에서 master 서버에 접속 및 동기화 시 사용하는 파일을 data 영역에 만들어야한다.
      파일명은 recovery.conf 이며, 직접 이름을 지정해서 만들거나, postgresql 에서 자제적으로 이를 위해서 보관하는 sample 디렉토리에서 파일을 복사해서 사용한다.
      일반적으로 엔진 경로내의 share 디렉토리에 아래와 같이 sample 로 보관한다.

  •  
    • 해당 페이지에서는 직접 작성하는걸로 설명을 한다. 작성시 필수로 설정 해야하는 항목은 아래와 같다.

      • standby_mode

        해당 옵션을 on 으로 하면 해당 옵션이 적용되는 서버는 slave 서버가 되며, 이를 응용한 H.A 구성시에도 standby 서버 역할을 하게 된다.

      • primary_conninfo

        외부 master 서버 (혹은 H.A 구조에서는 primary) 의 정보를 입력하여 해당 서버와 연결 및 지속적으로 동기화를 수행한다.
        위에서 생성했던 replication 동기화용 계정 정보를 입력한다.

  •  
    • 설정을 마치면 Slave 서버의 DB 를 재기동한다. 정상적으로 설정이 완료됐다면 에러없이 정상기동이 되고
      에러가 발생하면 지속적으로 error 가 발생하는 log 를 보여줘서 이에 대한 정상 동기화 여부를 파악 할 수 있다.

  •  
    • 정상 기동 및 동기화 시에는 Master 서버에서 해당 명령어를 통해 확인 해 볼 수 있다.

postgres=# select * from pg_stat_replication;

  •  
    • 위의 최소 기본 설정에서 더 원활한 운영을 위하여 추가로 설정 할 수 있는 항목들은 아래와 같다.

      • pg_replication_slots

        • Master 서버에서 wal_keep_segments 이상으로 트랜잭션이 들어와서 기존 wal 파일들이 삭제 되고 갱신이 될 때,
          Slave 서버에서 마저 기존 wal 파일들을 동기화하지 못하여 에러가 발생하는 경우가 있다. 이러한 경우를 대비하여
          미리 replication 을 구성시 replication slot 이라는 동기화용 wal 기록들을 보관 할 수 있는 공간을 만들 수 있다.

        • 생성 구문은 다음과 같다.

 SELECT * FROM pg_create_physical_replication_slot('repl_slot_01');
--repl_slot_01 은 임의의 이름으로 지정한다.

 

        • 생성한 뒤, 생성한 slot 리스트들은 아래와 같이 조회 할 수 있다.

select * from pg_replication_slots;

 

        • Slave 서버에서 이를 사용하기 위해서는 recovery.conf 파일에 아래의 항목을 추가하면 된다. (설정 후, 재기동 필요)

primary_slot_name='repl_slot_01'

    •  
      • restore_command

        • Slave 서버에서 Master 서버와의 동기화 중 crash 발생 시, 이 후 이에 대한 복구를 하는데 필요한 archive 파일을 참조하기 위해 설정하는 파일이다.
          Master 서버에서 먼저 archive 를 아래와 같이 on 으로 먼저 설정을 해줘야 한다.
          (archive_command 는 linux 명령어 형식으로 지정하여 원하는 포맷으로 꾸밀 수 있다.


        • 설정이 끝나면 Slave 서버의 recovery.conf 파일에서 restore_command 를 추가하면 된다.
          (마찬가지로 command 는 임의로 지정하여 파일 포맷을 바꿀 수 있다.)

반응형
Comments