웹사이트 검색

Ubuntu 16.04에서 PostgreSQL 9.6용 마스터-슬레이브 복제를 설정하는 방법


이 튜토리얼은 다음 OS 버전에 대해 존재합니다.

  • 우분투 16.04(Xenial Xerus)
  • 우분투 15.04(Vivid Vervet)

이 페이지에서

  1. 1단계 - PostgreSQL 9.6 설치
  2. 2단계 - UFW 방화벽 구성\n
  3. 3단계 - PostgreSQL 마스터 서버 구성
  4. 4단계 - SLAVE 서버 구성
  5. 5단계 - MASTER에서 SLAVE로 PostgreSQL 데이터 복사
  6. 6단계 - 테스트
  7. 참조

PostgreSQL 또는 Postgres는 15년 이상 활발하게 개발된 오픈 소스 객체 관계형 데이터베이스 관리 시스템(ORDBMS)입니다. 강력한 데이터베이스 서버이며 높은 워크로드를 처리할 수 있습니다. PostgreSQL은 Linux, Unix, BSD 및 Windows 서버에서 사용할 수 있습니다.

마스터/슬레이브 데이터베이스 복제는 한 서버(마스터)의 데이터베이스에서 다른 서버(슬레이브)의 데이터베이스로 데이터를 복사(동기화)하는 프로세스입니다. 이 프로세스의 주요 이점은 데이터베이스를 여러 시스템에 분산하여 마스터 서버에 문제가 있을 때 중단 없이 요청을 처리할 수 있는 동일한 데이터가 있는 백업 시스템이 있다는 것입니다.

PostgreSQL은 데이터베이스를 복제하는 여러 가지 방법을 제공합니다. 백업용으로 사용할 수 있으며 고가용성 데이터베이스 서버를 제공할 수 있습니다. 이 자습서에서는 Ubuntu 16.04 서버에서 PostgreSQL 9.6 마스터-슬레이브 복제를 설치하고 구성하는 방법을 보여줍니다. PostgreSQL을 깊이 있게 배우기에 매우 좋은 출발점인 상시 대기 모드를 사용할 것입니다.

우리가 할 일:

  1. PostgreSQL 9.6을 설치합니다.\n
  2. UFW 방화벽을 구성합니다.\n
  3. MASTER 서버를 구성합니다.\n
  4. SLAVE 서버를 구성합니다.\n
  5. MASTER에서 SLAVE로 PostgreSQL 데이터를 복사합니다.\n
  6. 테스트 중입니다.

전제 조건:

  • 1 우분투 16.04 서버
    • MASTER - 읽기 및 쓰기 허용 - IP: 10.0.15.10\n

    • SLAVE - 읽기 전용 - IP: 10.0.15.11

    1단계 - PostgreSQL 9.6 설치

    이 튜토리얼에서는 최신 버전의 PostgreSQL 9.6을 설치합니다. 공식 Ubuntu 리포지토리에서는 PostgreSQL 9.5만 제공하므로 PostgreSQL 리포지토리에서 직접 최신 버전을 설치해야 합니다.

    postgreSQL 9.6 저장소를 sources.list.d 디렉터리에 추가합니다.

    echo 'deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main' | tee /etc/apt/sources.list.d/postgresql.list

    그리고 PostgreSQL 서명 키를 시스템으로 가져옵니다.

    wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | sudo apt-key add -

    이제 apt 명령으로 시스템 저장소를 업데이트하십시오.

    apt-get update

    그런 다음 아래의 apt 명령어를 사용하여 PosgreSQL 9.6 패키지를 설치합니다.

    apt-get install -y postgresql-9.6 postgresql-contrib-9.6

    설치가 완료되었으면 부팅시 자동으로 시작되도록 추가합니다.

    systemctl enable postgresql

    기본적으로 PostgreSQL은 Ubuntu에서 포트 5432를 사용하는 localhost(127.0.0.1) IP 주소에서 실행 중입니다. netstat 명령으로 확인하십시오.

    netstat -plntu

    PostgreSQL 9.6이 시스템에서 실행 중입니다. 다음 단계에서는 postgres 사용자의 비밀번호를 구성해야 합니다.

    루트 계정에서 su 명령을 사용하여 postgres 사용자에 로그인한 다음 postgres 프런트 엔드 터미널 psql에 액세스합니다.

    su - postgres
    psql

    postgres 사용자의 비밀번호를 변경하고 아래 postgres 쿼리와의 연결 정보를 확인하세요.

    \password postgres
    \conninfo

    PostgreSQL 9.6이 시스템에 설치되었고 오류 없이 실행 중이며 postgres 사용자의 암호가 업데이트되었습니다.

    2단계 - UFW 방화벽 구성

    UFW(Uncomplicated Firewall)는 우분투에서 iptables 기반 방화벽을 관리하는 애플리케이션입니다. UFW는 Ubuntu Linux용 기본 방화벽 구성 도구이며 사용자에게 친숙한 방화벽 구성 방법을 제공합니다.

    apt 명령을 사용하여 기본 우분투 저장소에서 ufw를 설치할 수 있습니다.

    apt-get install -y ufw

    UFW 방화벽에 새 서비스 추가: 아래 명령을 사용하여 SSH 및 PostgreSQL 서비스를 추가합니다.

    ufw allow ssh
    ufw allow postgresql

    UFW 방화벽을 활성화하고 상태를 확인하십시오.

    ufw enable
    ufw status

    UFW 방화벽이 설치되었고 PostgreSQL 서비스가 추가되었습니다.

    노트:

    MASTER 및 SLAVE 서버에서 1단계와 2단계를 실행합니다.

    3단계 - PostgreSQL 마스터 서버 구성

    마스터 서버의 IP 주소는 10.0.15.10이고 postgres 서비스는 기본 포트를 사용하여 해당 IP에서 실행됩니다. 마스터 서버는 데이터베이스에 대한 읽기 및 쓰기 권한을 가지며 슬레이브 서버에 대한 스트리밍 복제를 수행합니다.

    postgres 구성 디렉토리 /etc/postgresql/9.6/main으로 이동하고 vim으로 postgresql.conf 파일을 편집합니다.

    cd /etc/postgresql/9.6/main/
    vim postgresql.conf

    listen_addresses 줄의 주석을 제거하고 값을 마스터 서버 IP 주소 10.0.15.10으로 변경합니다.

    listen_addresses = '10.0.15.10'

    wal_level 행의 주석을 제거하고 값을 hot_standby로 변경하십시오.

    wal_level = hot_standby

    동기화 수준의 경우 로컬 동기화를 사용합니다. 아래와 같이 값 라인을 주석 해제하고 변경합니다.

    synchronous_commit = local

    보관 모드를 활성화하고 archive_command 옵션을 cp %p /var/lib/postgresql/9.6/main/archive/%f 명령으로 변경합니다.

    archive_mode = on
    archive_command = 'cp %p /var/lib/postgresql/9.6/main/archive/%f'

    복제 설정의 경우 이 자습서에서는 마스터와 슬레이브의 2개 서버만 사용하고 wal_sender 행의 주석을 제거하고 값을 2로 변경하고 wal_keep_segments 값은 10으로 변경합니다.

    max_wal_senders = 2
    wal_keep_segments = 10

    애플리케이션 이름의 경우 synchronous_standby_names 줄의 주석을 제거하고 값을 이름 pgslave001로 변경합니다.

    synchronous_standby_names = 'pgslave001'

    파일을 저장하고 편집기를 종료합니다.

    postgresql.conf 파일에서 아카이브 모드가 활성화되어 있으므로 아카이브를 위한 새 디렉토리를 생성해야 합니다. 새 아카이브 디렉토리를 생성하고 권한을 변경하고 소유자를 postgres 사용자로 변경합니다.

    mkdir -p /var/lib/postgresql/9.6/main/archive/
    chmod 700 /var/lib/postgresql/9.6/main/archive/
    chown -R postgres:postgres /var/lib/postgresql/9.6/main/archive/

    다음으로 인증 구성을 위해 pg_hba.conf 파일을 편집합니다.

    vim pg_hba.conf

    아래 구성을 줄 끝에 붙여넣습니다.

    # Localhost
    host    replication     replica          127.0.0.1/32            md5

    # PostgreSQL Master IP address
    host    replication     replica          10.0.15.10/32            md5

    # PostgreSQL SLave IP address
    host    replication     replica          10.0.15.11/32            md5

    저장하고 종료한 다음 PostgreSQL을 다시 시작하십시오.

    systemctl restart postgresql

    PostgreSQL은 IP 주소 10.0.15.10에서 실행 중입니다. netstat 명령으로 확인하십시오.

    netstat -plntu

    다음으로 복제를 위한 새 사용자를 만듭니다. 비밀번호가 [email 인 replica라는 이름의 새 사용자를 생성합니다. 설정을 위해 여기에서 보안 암호를 선택하십시오! postgres 사용자로 로그인하고 postgres 프런트 엔드 터미널 psql에 액세스합니다.

    su - postgres
    psql

    아래의 postgres 쿼리를 사용하여 [이메일 보호] 비밀번호로 새 복제 사용자를 만듭니다.

    CREATE USER replica REPLICATION LOGIN ENCRYPTED PASSWORD '';

    이제 아래에서 du 쿼리로 새 사용자를 확인하면 복제 권한이 있는 복제 사용자가 표시됩니다.

    \du

    MASTER 서버 구성이 완료되었습니다.

    4단계 - SLAVE 서버 구성

    SLAVE 서버의 IP 주소는 10.0.15.11입니다. 그리고 이 서버는 데이터베이스에 대한 READ 권한만 갖습니다. Postgres 데이터베이스 서버는 localhost IP가 아닌 서버의 IP 주소로 실행됩니다.

    아래의 systemctl 명령을 사용하여 슬레이브 서버에서 postgres 서비스를 중지합니다.

    systemctl stop postgresql

    Postgres 구성 디렉토리 /etc/postgresql/9.6/main으로 이동한 다음 구성 파일 postgresql.conf를 편집합니다.

    cd /etc/postgresql/9.6/main/
    vim postgresql.conf

    listen_addresses 줄의 주석을 제거하고 값을 슬레이브 서버 IP 주소 10.0.15.11로 바꿉니다.

    listen_addresses = '10.0.15.11'

    wal_level 행의 주석을 제거하고 값을 hot_standby로 변경하십시오.

    wal_level = hot_standby

    동기화 수준의 경우 synchronous_commit 행의 주석을 제거하고 아래와 같이 값을 변경합니다.

    synchronous_commit = local

    복제 설정의 경우 max_wal_senders 줄의 주석을 제거하고 2개의 서버만 사용하므로 값을 2로 바꿉니다. 그리고 wal_keep_segments의 값을 10으로 변경합니다.

    max_wal_senders = 2
    wal_keep_segments = 10

    애플리케이션 이름에 대한 synchronous_standby_names 줄의 주석을 제거하고 값을 pgslave001이라는 이름으로 변경합니다.

    synchronous_standby_names = 'pgslave001'

    다음 줄의 주석을 제거하고 값을 on으로 변경하여 슬레이브 서버에 대해 hot_standby를 활성화합니다.

    hot_standby = on

    파일을 저장하고 편집기를 종료합니다.

    5단계 - MASTER에서 SLAVE로 PostgreSQL 데이터 복사

    다음으로 SLAVE 서버의 postgres 기본 디렉터리를 MASTER 서버의 기본 데이터 디렉터리로 교체하려고 합니다.

    SLAVE 서버에 로그인하고 postgres 사용자에 액세스합니다.

    su - postgres

    postgres 데이터 디렉터리 main으로 이동하고 디렉터리 이름을 변경하여 백업합니다.

    cd 9.6/
    mv main main-bekup

    postgres 사용자로 새 기본 디렉토리를 만들고 main-bekup 디렉토리와 같은 권한이 있는지 확인하십시오.

    mkdir main/
    chmod 700 main/

    다음으로 pg_basebackup 명령을 사용하여 MASTER 서버에서 SLAVE 서버로 기본 디렉터리를 복사합니다. 복제 사용자를 사용하여 이 데이터 복사를 수행합니다.

    pg_basebackup -h 10.0.15.10 -U replica -D /var/lib/postgresql/9.6/main -P --xlog
    Password:

    데이터 전송이 완료되면 기본 데이터 디렉터리로 이동하여 새 recovery.conf 파일을 만듭니다.

    cd /var/lib/postgresql/9.6/main/
    vim recovery.conf

    아래 구성을 붙여넣습니다.

    standby_mode = 'on'
    primary_conninfo = 'host=10.0.15.10 port=5432 user=replica application_name=pgslave001'
    restore_command = 'cp /var/lib/postgresql/9.6/main/archive/%f %p'
    trigger_file = '/tmp/postgresql.trigger.5432'

    저장하고 종료한 다음 chmod를 사용하여 파일의 권한을 600으로 변경합니다.

    chmod 600 recovery.conf

    이제 SLAVE 서버에서 PostgreSQL 9.6을 시작하고 netstat를 사용하여 postgres 서비스가 IP 주소 10.0.15.11에서 실행되고 있는지 확인합니다.

    systemctl start postgresql
    netstat -plntu

    SLAVE 서버에 대한 데이터 전송 및 구성이 완료되었습니다.

    6단계 - 테스트

    테스트를 위해 PostgreSQL 9.6의 복제 상태를 확인하고 MASTER 서버에 새 테이블 생성을 시도한 다음 SLAVE 서버에서 모든 데이터를 확인하여 복제를 확인합니다.

    MASTER 서버에 로그인하고 postgres 사용자로 로그인합니다.

    su - postgres

    아래의 psql 명령을 실행하여 복제 상태를 확인하십시오.

    psql -c "select application_name, state, sync_priority, sync_state from pg_stat_replication;"
    psql -x -c "select * from pg_stat_replication;"

    아래와 같은 결과를 얻게 됩니다.

    다음으로 MASTER 서버에서 새 테이블을 생성해 보십시오. 마스터 서버에서 postgres 사용자로 로그인합니다.

    su - postgres
    psql

    그리고 아래의 postgres 쿼리를 실행하여 replica_test라는 새 테이블을 만들고 테이블에 데이터를 삽입합니다.

    CREATE TABLE replica_test (hakase varchar(100));
    INSERT INTO replica_test VALUES ('linux-console.net');
    INSERT INTO replica_test VALUES ('This is from Master');
    INSERT INTO replica_test VALUES ('pg replication by hakase-labs');

    다음으로 SLAVE 서버에서 postgres 사용자로 로그인하고 psql 터미널에 액세스합니다.

    su - postgres
    psql

    아래 postgres 쿼리로 replica_test 테이블의 데이터를 확인하십시오.

    select * from replica_test;

    그리고 MASTER 서버에서 SLAVE 서버로 복제된 MASTER와 동일한 데이터를 얻게 됩니다.

    추가 테스트:

    아래 쿼리로 SLAVE 서버에 쓰기를 테스트합니다.

    INSERT INTO replica_test VALUES ('this is SLAVE');

    그러면 SLAVE 서버에서 INSERT 쿼리를 실행할 수 없다는 오류 메시지가 표시됩니다.

    Ubuntu 16.04 Xenial Xerus에서 마스터-슬레이브 복제를 사용하는 PostgreSQL 9.6의 설치 및 구성이 성공적으로 완료되었습니다.

    참조

    • https://linux-console.net/tutorial/postgresql-replication-on-ubuntu-15-04/