PostgreSQL 스트리밍 복제

PostgreSQLBeginner
지금 연습하기

소개

이 랩에서는 PostgreSQL 스트리밍 복제 (streaming replication) 를 구성하는 방법을 배우게 됩니다. 이 강력한 기능은 주 데이터베이스의 실시간 읽기 전용 복사본을 복제본 (replica) 이라고 하는 보조 서버에 유지할 수 있도록 합니다. 복제본은 주 서버로부터 데이터 변경 사항을 지속적으로 수신하고 적용하여 고가용성, 읽기 쿼리 로드 밸런싱 및 백업에 유용합니다.

복제를 허용하도록 주 서버를 구성하는 것부터 시작하여 전체 프로세스를 진행합니다. 그런 다음 기본 백업 (base backup) 을 사용하여 복제본 서버를 생성합니다. 마지막으로 복제본을 시작하고 두 서버 간의 데이터 흐름을 테스트하며 복제본이 주 서버와 동기화되는 방식을 확인합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 92%입니다.

복제를 위한 주 서버 구성

첫 번째 단계에서는 복제를 위해 주 PostgreSQL 서버를 구성합니다. 여기에는 네트워크 연결을 허용하도록 구성 파일을 수정하고, 필요한 Write-Ahead Log (WAL) 레벨을 활성화하며, 복제를 위한 특수 사용자를 생성하는 작업이 포함됩니다.

1. PostgreSQL 구성 파일 수정

복제를 준비하려면 기본 구성 파일인 postgresql.conf를 수정해야 합니다. nano와 같은 텍스트 편집기로 이 큰 파일을 수동으로 편집하는 것은 옵션이 많기 때문에 어렵고 오류가 발생하기 쉽습니다. 더 효율적이고 안정적인 방법은 명령줄 도구를 사용하여 필요한 설정을 보거나 업데이트하는 것입니다. 이렇게 하면 수백 줄을 스크롤할 필요가 없고 실수로 인한 오류를 방지할 수 있습니다.

먼저 수정해야 하는 설정인 listen_addresses, wal_level, max_wal_senders의 현재 값을 확인해 보겠습니다.

CONF_FILE="/etc/postgresql/14/main/postgresql.conf"
echo "--- Current Settings ---"
sudo grep -E "^#?\s*(listen_addresses|wal_level|max_wal_senders)" $CONF_FILE

이 줄들은 아마도 #으로 주석 처리되어 있을 것입니다.

이제 이러한 설정을 자동으로 업데이트해 보겠습니다. 다음 명령은 구성 파일을 백업한 다음 각 필수 매개변수를 업데이트합니다.

CONF_FILE="/etc/postgresql/14/main/postgresql.conf"
## 변경 전에 백업 생성
sudo cp $CONF_FILE ${CONF_FILE}.bak.$(date +%s)

## 모든 IP 주소에서의 연결을 허용하도록 listen_addresses 설정
sudo sed -i -E "s/^[#\s]*listen_addresses\s*=.*/listen_addresses = '*'/" "$CONF_FILE"

## 복제 로그를 활성화하기 위해 wal_level을 'replica'로 설정
sudo sed -i -E "s/^[#\s]*wal_level\s*=.*/wal_level = replica/" "$CONF_FILE"

## 동시 복제 연결 최대 개수 설정
sudo sed -i -E "s/^[#\s]*max_wal_senders\s*=.*/max_wal_senders = 10/" "$CONF_FILE"

마지막으로 변경 사항이 올바르게 적용되었는지 확인해 보겠습니다. 아래 명령은 주석 처리된 줄을 제외하고 업데이트된 값을 표시합니다.

echo "--- Verified Settings ---"
sudo grep -E "^(listen_addresses|wal_level|max_wal_senders)" $CONF_FILE

출력은 업데이트되고 활성화된 구성을 보여야 합니다.

listen_addresses = '*'
wal_level = replica
max_wal_senders = 10

이 설정이 확인되었으므로 서버는 다음 단계를 위해 올바르게 구성되었습니다.

2. 전용 복제 사용자 생성

슈퍼유저 대신 복제를 위한 전용 사용자를 사용하는 것이 좋습니다. replicator라는 역할을 생성해 보겠습니다.

psql 명령줄 클라이언트를 사용하여 PostgreSQL 에 연결합니다.

sudo -u postgres psql

이제 다음 SQL 명령을 실행하여 복제 권한과 암호를 가진 사용자를 생성합니다.

CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'replicapass';

CREATE ROLE 출력이 표시되어야 합니다. 이제 psql 클라이언트를 종료합니다.

\q

3. 복제 연결 허용

다음으로, replicator 사용자가 복제 서버에서 연결할 수 있도록 서버를 구성해야 합니다. pg_hba.conf 파일을 편집하여 이 작업을 수행합니다.

nano로 파일을 엽니다.

sudo nano /etc/postgresql/14/main/pg_hba.conf

파일 끝에 다음 줄을 추가합니다. 이 규칙은 replicator 사용자가 replication 의사 데이터베이스에 모든 IP 주소 (0.0.0.0/0) 에서 연결할 수 있도록 허용합니다. 이 랩에서는 두 서버가 동일한 머신에 있으므로 127.0.0.1/32를 사용합니다.

host    replication     replicator      127.0.0.1/32            md5

Ctrl+X, Y, Enter를 눌러 저장하고 종료합니다.

4. 주 서버 재시작

이러한 모든 구성 변경 사항을 적용하려면 PostgreSQL 서비스를 다시 시작해야 합니다.

sudo service postgresql restart

이제 주 서버는 복제 연결을 수락할 준비가 되었습니다.

기본 백업으로 복제본 생성

주 서버 구성이 완료되었으므로 다음 단계는 복제본을 생성하는 것입니다. 이를 수행하는 표준 방법은 주 서버의 "기본 백업 (base backup)"을 가져오는 것입니다. 이렇게 하면 주 서버의 데이터 디렉터리 복사본이 생성되며, 이는 복제본의 시작점으로 사용됩니다.

1. 복제본을 위한 데이터 디렉터리 생성

먼저 복제본의 데이터가 저장될 새 디렉터리를 생성합니다. 권한 문제를 피하기 위해 시스템 위치에 생성하는 것이 좋습니다. PostgreSQL 의 표준 디렉터리에서 postgres 사용자로 생성하겠습니다.

sudo -u postgres mkdir -p /var/lib/postgresql/14/replica

2. 기본 백업 가져오기

이제 pg_basebackup 유틸리티를 사용하여 주 서버에서 데이터를 복사합니다. 이 명령은 replicator 사용자로 주 서버에 연결하고 데이터를 새 복제본 디렉터리로 스트리밍합니다. 디렉터리를 postgres 사용자로 생성했기 때문에 해결해야 할 권한 문제가 없습니다.

다음 명령을 실행합니다. replicator 사용자의 암호 (replicapass) 를 입력하라는 메시지가 표시됩니다.

sudo -u postgres pg_basebackup -h localhost -p 5432 -U replicator -D /var/lib/postgresql/14/replica -P -v -R

이 명령을 자세히 살펴보겠습니다.

  • sudo -u postgres: 필요한 권한이 있는 postgres 시스템 사용자로 명령을 실행합니다.
  • pg_basebackup: 기본 백업을 가져오는 유틸리티입니다.
  • -h localhost -p 5432: 주 서버의 호스트와 포트를 지정합니다.
  • -U replicator: 연결할 사용자 이름입니다.
  • -D /var/lib/postgresql/14/replica: 백업 대상 디렉터리입니다.
  • -P: 진행 상황 보고서를 표시합니다.
  • -R: 매우 유용한 옵션입니다. standby.signal 파일을 생성하고 대상 디렉터리의 postgresql.auto.conf 파일에 연결 설정을 추가하여 새 데이터 디렉터리를 복제본으로 자동 구성합니다.

3. 구성 파일 복사

기본 백업은 주요 데이터 파일을 복사하지만, 많은 Debian 기반 시스템 (이 Ubuntu 환경과 같은) 에서는 구성 파일 (pg_hba.confpg_ident.conf) 이 /etc/postgresql/에 별도로 저장되며 백업에 포함되지 않습니다. 수동으로 복제본의 데이터 디렉터리로 복사해야 합니다. 복사 후에는 서버 프로세스가 읽을 수 있도록 postgres 사용자가 소유하도록 해야 합니다.

sudo cp /etc/postgresql/14/main/pg_hba.conf /var/lib/postgresql/14/replica/
sudo cp /etc/postgresql/14/main/pg_ident.conf /var/lib/postgresql/14/replica/
sudo chown postgres:postgres /var/lib/postgresql/14/replica/pg_hba.conf
sudo chown postgres:postgres /var/lib/postgresql/14/replica/pg_ident.conf

데이터 파일과 구성이 제자리에 배치되었으므로 복제본 디렉터리는 최종 구성 단계를 준비할 수 있습니다.

복제본 서버 구성 및 시작

기본 백업으로 복제본의 데이터 디렉터리가 준비되었습니다. 하지만 주 서버와 복제본 서버를 동일한 머신에서 실행하므로 두 서버가 동일한 네트워크 포트 (기본값: 5432) 를 사용할 수 없습니다. 이 단계에서는 복제본이 다른 포트를 사용하도록 구성한 다음 시작합니다.

1. 복제본 포트 구성

복제본의 데이터 디렉터리 내 postgresql.conf 파일을 편집하여 수신 포트를 변경합니다. 이 파일은 이제 postgres 사용자가 소유하므로 sudo가 필요합니다.

sudo nano /var/lib/postgresql/14/replica/postgresql.conf

파일 끝에 다음 줄을 추가하여 포트를 5433으로 설정합니다.

port = 5433

Ctrl+X, Y, Enter를 눌러 저장하고 종료합니다.

2. 데이터 디렉터리 권한 설정

보안을 위해 PostgreSQL 은 데이터 디렉터리에 다른 사용자가 액세스할 수 없도록 요구합니다. 권한을 700으로 설정해야 하며, 이는 소유자 (postgres) 에게만 읽기, 쓰기 및 실행 권한을 부여합니다.

sudo chmod 0700 /var/lib/postgresql/14/replica

3. 복제본 서버 시작

이제 복제본 서버를 시작할 수 있습니다. 데이터베이스 서버 제어를 위한 표준 PostgreSQL 유틸리티인 pg_ctl을 사용합니다.

복제본을 시작하려면 다음 명령을 실행합니다. sudo 명령이 pg_ctl을 찾지 못할 수 있으므로 전체 경로를 사용해야 합니다. 또한 서버 상태를 쉽게 확인하기 위해 /tmp에 로그 파일을 지정합니다.

sudo -u postgres /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/14/replica -l /tmp/replica.log start
  • pg_ctl: 서버 제어 유틸리티입니다.
  • -D /var/lib/postgresql/14/replica: 이 서버 인스턴스의 데이터 디렉터리를 지정합니다.
  • -l /tmp/replica.log: 로그 파일을 지정합니다.
  • start: 수행할 작업입니다.

다음 메시지가 표시되어야 합니다.

waiting for server to start.... done
server started

4. 복제본 로그 파일 확인

복제본이 올바르게 시작되고 주 서버에 연결되었는지 확인하려면 로그 파일이 postgres 사용자가 소유하므로 sudo를 사용하여 로그 파일을 봅니다.

sudo cat /tmp/replica.log

읽기 전용 연결을 수락할 준비가 되었다는 메시지와 주 서버에서 WAL 스트리밍을 시작했다는 메시지를 찾으십시오. 다음과 유사한 내용이 표시되어야 합니다.

...
LOG:  database system is ready to accept read-only connections
LOG:  started streaming WAL from primary at 0/4000000 on timeline 1
...

이는 복제본 서버가 실행 중이고 주 서버에 성공적으로 연결되었음을 확인합니다.

복제 테스트

이제 두 서버가 모두 실행 중이므로 복제가 예상대로 작동하는지 테스트할 차례입니다. 주 서버에 테이블을 생성하고 복제본에 나타나는지 확인할 것입니다. 또한 복제본이 읽기 전용인지 확인할 것입니다.

1. 주 서버에서 복제 상태 확인

먼저 주 서버 (포트 5432) 에 연결하고 pg_stat_replication 뷰를 확인합니다. 이 뷰는 연결된 복제본에 대한 모니터링 정보를 제공합니다.

sudo -u postgres psql -p 5432

다음 쿼리를 실행합니다.

SELECT client_addr, state, sync_state FROM pg_stat_replication;

출력에는 복제본이 연결되어 있으며 상태는 streaming이고 sync_stateasync 또는 sync로 표시되어야 합니다.

 client_addr |   state   | sync_state
-------------+-----------+------------
 127.0.0.1   | streaming | async
(1 row)

2. 주 서버에 데이터 생성

주 서버에 계속 연결된 상태에서 새 테이블을 생성하고 일부 데이터를 삽입합니다.

CREATE TABLE replication_test (id INT, message TEXT);
INSERT INTO replication_test VALUES (1, 'Hello from primary!');

이제 테이블을 쿼하여 데이터가 있는지 확인합니다.

SELECT * FROM replication_test;

방금 삽입한 행이 표시되어야 합니다. 주 서버의 psql 셸을 종료합니다.

\q

3. 복제본에서 데이터 확인

새 터미널을 열거나 기존 터미널을 사용하여 포트 5433의 복제본 서버에 연결합니다. postgres 사용자의 암호 (labex) 를 제공해야 합니다.

psql -h localhost -p 5433 -U postgres -d postgres

이제 복제본에서 replication_test 테이블을 쿼합니다.

SELECT * FROM replication_test;

주 서버에서 생성한 것과 정확히 동일한 데이터를 볼 수 있어야 합니다. 이는 스트리밍 복제가 작동하고 있음을 확인합니다!

 id |      message
----+---------------------
  1 | Hello from primary!
(1 row)

4. 복제본의 읽기 전용 특성 테스트

복제본에서 테이블에 데이터를 삽입해 봅니다.

INSERT INTO replication_test VALUES (2, 'Hello from replica?');

복제본 서버는 기본적으로 읽기 전용 모드이므로 명령이 오류와 함께 실패합니다.

ERROR:  cannot execute INSERT in a read-only transaction

이는 예상된 동작이며 스트리밍 복제본의 주요 특징입니다. 복제본의 psql 셸을 종료합니다.

\q

환경 정리

마지막 단계에서는 서버를 종료하고 실험 중에 생성된 파일 및 디렉터리를 제거하여 환경을 초기 상태로 되돌립니다.

1. 복제본 서버 중지

먼저 pg_ctl을 사용하여 복제본 서버를 중지합니다. 실행 파일의 전체 경로를 사용해야 합니다.

sudo -u postgres /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/14/replica stop

서버가 중지되었다는 확인 메시지가 표시됩니다.

waiting for server to shut down.... done
server stopped

2. 주 서버 중지

다음으로 service 명령을 사용하여 주 서버를 중지합니다.

sudo service postgresql stop

3. 복제본 데이터 및 로그 제거

서버가 중지되었으므로 복제본의 데이터 디렉터리와 생성한 로그 파일을 안전하게 제거할 수 있습니다. 이 파일들은 postgres 사용자가 소유하므로 sudo가 필요합니다.

sudo rm -rf /var/lib/postgresql/14/replica /tmp/replica.log

이로써 정리 프로세스가 완료되었습니다. PostgreSQL 스트리밍 복제 환경을 성공적으로 설정, 테스트 및 해체했습니다.

요약

이 실험에서는 PostgreSQL 스트리밍 복제를 처음부터 성공적으로 구성했습니다. postgresql.confpg_hba.conf를 수정하고 전용 복제 사용자를 생성하여 주 서버를 준비하는 방법을 배웠습니다. 그런 다음 pg_basebackup을 사용하여 복제본을 생성하고 별도의 포트에서 실행되도록 구성했습니다.

설정을 테스트하여 주 서버에 기록된 데이터가 거의 실시간으로 보조 서버에 자동으로 복제되는지 확인했습니다. 또한 복제본 서버가 읽기 전용임을 확인했는데, 이는 설계의 근본적인 측면입니다. 이러한 기술은 강력하고 확장 가능한 PostgreSQL 배포를 관리하는 데 필수적입니다.