웹사이트 검색

Debian 10에서 복제 슬롯을 사용하여 PostgreSQL 스트리밍 복제를 설정하는 방법


이 페이지에서

  1. 요구 사항\n
  2. 1단계: PostgreSQL 설치
  3. 2단계: 초기 구성
  4. 3단계: 마스터 구성
  5. 4단계: 기본 백업
  6. 5단계: 대기 구성
  7. 테스트
    1. 복제 테스트
    2. 페일오버 테스트

    PostgreSQL은 강력하고 기능이 풍부한 관계형 데이터베이스 관리 시스템(RDBMS)입니다. 무료이며 오픈 소스이며 1996년부터 개발되었습니다. Postgres는 데이터를 보관하고 복제하는 다양한 방법을 제공하며 그 중 하나는 스트리밍 복제입니다. 이 모드에서 기본(마스터) 인스턴스는 기본 활성 데이터베이스를 처리하고 작업을 실행합니다. 보조(슬레이브) 인스턴스는 활성 데이터베이스의 동일한 복사본을 유지하면서 기본 인스턴스의 모든 변경 사항을 복사합니다. 보조 서버는 읽기 전용 쿼리도 수락할 수 있습니다. 기본이 실패하면 보조 서버는 대기 모드를 종료하고 새 마스터로 작동할 수 있습니다(이를 장애 조치라고 함).

    PostgreSQL 복제는 일반적으로 WAL(Write-Ahead Logging)에 의존하며, 디스크에 쓰기 전에 데이터 변경 사항을 로깅하는 프로세스입니다. 이러한 WAL 레코드는 파일로 두 번째 노드에 복사되거나(파일 기반 로그 전달) 노드 간에 직접 스트리밍됩니다(스트리밍 복제). 대부분의 경우 후자는 대기 노드가 마스터 노드의 변경 사항을 수신하는 지연을 줄입니다.

    파일 기반 로그 전달 없이 스트리밍 복제를 사용할 때의 문제는 기본 서버가 너무 빨리 폐기하면 보조 서버가 일부 WAL 레코드를 놓칠 수 있다는 것입니다. 많은 구성 매개변수로 이러한 위험을 줄일 수 있지만 종종 불필요한 스토리지 비용이 발생합니다. 해결 방법은 Postgres에서 제공하는 기능인 복제 슬롯으로 기본 서버가 대기 노드에서 WAL 레코드를 수신한 후에만 WAL 레코드를 버립니다.

    두 개의 Debian 10 노드에서 복제 슬롯을 사용하여 스트리밍 복제를 설정할 것입니다.

    요구 사항

    • 두 개의 동일한 Debian 10 인스턴스.\n
    • 두 인스턴스 모두에 대한 루트 액세스.\n
    • $EDITOR 환경 변수는 두 인스턴스 모두에 설정되어야 합니다.\n

    1단계: PostgreSQL 설치

    두 노드를 모두 업데이트하고 재부팅합니다.

    apt update
    apt upgrade -y
    reboot
    

    두 노드 모두에 Postgres를 설치하고 PostgreSQL이 활성화되어 실행 중인지 확인합니다.

    apt install -y postgresql
    systemctl enable --now 
    

    참고: PostgreSQL을 업데이트할 때 설명서에 따르면 대기를 먼저 업데이트하는 것이 더 안전한 옵션입니다.

    2단계: 초기 구성

    기본적으로 PostgreSQL은 루프백 인터페이스에서만 수신하며 외부에서 액세스할 수 없습니다. postgresql.conf를 편집하여 두 노드에서 수신 주소를 변경합니다.

    $EDITOR /etc/postgresql/11/main/postgresql.conf
    

    다음 줄을 찾으십시오.

    #listen_addresses = 'localhost'
    

    다음으로 변경:

    listen_addresses = 'node_ip_address,127.0.0.1'
    

    두 노드가 동일한 로컬 네트워크를 공유하는 경우 Postgres는 인터넷에 액세스할 수 없지만 node_ip_address에 개인 주소를 사용할 수 있습니다. 그렇지 않으면 공용 주소를 사용하십시오.

    변경 사항을 저장한 다음 두 인스턴스를 모두 다시 시작합니다.

    systemctl restart 

    3단계: 마스터 구성

    이 단계는 기본/마스터 서버에만 적용됩니다.

    Postgres 터미널을 엽니다.

    sudo -u postgres psql
    

    대기 노드는 사용자를 사용하여 마스터에 연결합니다. 만들기:

    postgres=# CREATE ROLE replicator LOGIN REPLICATION ENCRYPTED PASSWORD 'replicator_password';
    

    그런 다음 복제 슬롯을 생성하고 종료합니다.

    postgres=# SELECT * FROM pg_create_physical_replication_slot('replicator');
    postgres=# \q
    

    단순화를 위해 복제 역할과 슬롯은 모두 "replicator"로 이름이 지정되지만 동일할 필요는 없습니다.

    다음으로 복제자 사용자가 대기에서 마스터로 연결할 수 있도록 pg_hba.conf에 항목을 만듭니다. 열어 봐:

    $EDITOR /etc/postgresql/11/main/pg_hba.conf
    

    끝에 다음 줄을 추가합니다.

    host	replication	replicator	standby_ip_address/32		md5
    

    마스터 인스턴스를 다시 시작합니다.

    systemctl restart 

    4단계: 기본 백업

    이 단계의 명령은 보조/슬레이브 서버에서 실행되어야 합니다.

    먼저 보조 노드에서 Postgres를 중지합니다.

    systemctl stop 
    

    이전 데이터 디렉터리를 백업합니다.

    mv /var/lib/postgresql/11/main/ /var/lib/postgresql/11/main.bak
    

    다음 명령을 사용하여 마스터 데이터 디렉토리를 슬레이브에 복제하십시오.

    pg_basebackup -h master_ip_address -U replicator -D /var/lib/postgresql/11/main/ -P --password --slot replicator
    

    비밀번호를 입력하라는 메시지가 표시됩니다. 마스터에서 생성하는 동안 복제자 역할에 대해 선택한 암호를 입력합니다. 전송이 완료되면 데이터 디렉토리의 소유권을 postgres 사용자에게 부여합니다.

    chown -R postgres:postgres /var/lib/postgresql/11/main

    5단계: 대기 구성

    이 단계는 보조/슬레이브 서버에만 적용됩니다.

    postgresql.conf에서 상시 대기 모드를 활성화합니다.

    $EDITOR /etc/postgresql/11/main/postgresql.conf
    

    다음 행을 찾아 주석 처리를 제거하십시오.

    #hot_standby = on
    

    Postgres 데이터 디렉터리에 recovery.conf 파일을 만듭니다.

    $EDITOR /var/lib/postgresql/11/main/recovery.conf
    

    대기 모드 활성화:

    standby_mode = 'on'
    

    마스터에서 생성된 자격 증명을 사용하여 복제 연결 매개변수를 설정합니다.

    primary_conninfo = 'host=master_ip_address port=5432 user=replicator password=replicator_password'
    

    마스터에서 생성한 복제 슬롯의 이름을 설정합니다.

    primary_slot_name = 'replicator'
    

    장애 조치 트리거 파일의 경로를 설정합니다.

    trigger_file = '/var/lib/postgresql/11/main/failover.trigger'
    

    trigger_file 매개변수가 설정되면 Postgres는 이 트리거 파일이 생성될 때 대기 모드를 종료하고 주 서버로서 정상 작동을 시작합니다. 이 매개변수는 필수가 아닙니다.

    recovery.conf를 만든 후 postgres 사용자에게 소유권을 부여합니다.

    chown postgres:postgres /var/lib/postgresql/11/main/recovery.conf
    

    이제 Postgres를 시작할 수 있습니다.

    systemctl start 
    

    이제 대기 모드에 있으며 새 트랜잭션을 복제해야 합니다.

    테스트

    복제 테스트

    복제를 테스트하려면 마스터에서 쓰기 작업을 수행하십시오. 예를 들어 마스터에서 새 데이터베이스를 생성합니다.

    sudo -u postgres psql -c "CREATE DATABASE replitest"
    

    몇 초간 기다린 후 슬레이브의 데이터베이스를 나열합니다.

    sudo -u postgres psql -c "\l"
    

    replitest 데이터베이스가 실제로 대기 서버에 의해 복제되었는지 확인해야 합니다.

    List of databases
       Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
    -----------+----------+----------+-------------+-------------+-----------------------
     postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
     replitest | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
     template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
               |          |          |             |             | postgres=CTc/postgres
     template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
               |          |          |             |             | postgres=CTc/postgres
    (4 rows)

    장애 조치 테스트

    참고: 여기에 표시된 대로 장애 조치를 테스트하려면 장애 조치 후 대기 서버를 재설정해야 합니다.

    Postgres가 대기 모드에 있으므로 장애 조치 전에 보조 노드에서 쓰기 작업을 수행할 수 없어야 합니다. 예를 들어 다음 명령을 실행합니다.

    sudo -u postgres psql -c "CREATE DATABASE test"
    

    명령이 실패해야 합니다.

    ERROR:  cannot execute CREATE DATABASE in a read-only transaction
    

    장애 조치 신호를 보내려면 recovery.conf에 지정된 트리거 파일을 만듭니다.

    touch /var/lib/postgresql/11/main/failover.trigger
    

    몇 초간 기다린 다음 쓰기 작업을 수행해 보십시오. 예를 들어:

    sudo -u postgres psql -c "CREATE DATABASE test2"
    

    Postgres는 더 이상 대기 상태로 작동하지 않으므로 작업이 성공합니다. Postgres는 또한 recovery.conf 파일의 이름을 recovery.done으로 바꾸고 트리거 파일을 삭제합니다.

    대기 모드로 돌아가려면 (이전) 보조 노드에서 Postgres를 중지합니다.

    systemctl stop 
    

    데이터 디렉터리를 재설정합니다.

    mv /var/lib/postgresql/11/main/ /var/lib/postgresql/11/main.2.bak
    pg_basebackup -h master_ip_address -U replicator -D /var/lib/postgresql/11/main/ -P --password --slot replicator
    chown -R postgres:postgres /var/lib/postgresql/11/main
    

    그리고 recovery.conf를 다시 만듭니다.

    cp /var/lib/postgresql/11/main.2.bak/recovery.done /var/lib/postgresql/11/main/recovery.conf
    

    마지막으로 Postgres를 다시 시작합니다.

    systemctl start 
    

    보조 인스턴스는 이제 대기 모드로 돌아갑니다. 이 시점에서 복제를 다시 테스트할 수 있습니다.

    마무리

    예를 들어 마스터 노드에서 불필요한 데이터베이스를 제거합니다.

    sudo -u postgres psql
    postgres=# DROP DATABASE replitest;
    

    그리고 대기 노드에서 이전 데이터 디렉터리를 삭제합니다.

    rm /var/lib/postgresql/11/main.bak -r
    rm /var/lib/postgresql/11/main.2.bak -r