복제를 사용하면 하나의 데이터베이스 서버인 소스에서 데이터를 복사합니다. , 다른 서버, 복제본 . 복제는 고가용성을 제공하고 재해 복구를 지원하는 강력한 데이터베이스 기능입니다.
소개
또한 테스트 및 보고 목적으로 사용할 복제본 서버를 생성하여 프로덕션 OLTP(온라인 트랜잭션 처리) 데이터베이스의 로드를 줄일 수 있습니다. 이 게시물은 PostgreSQL®의 다양한 복제 유형과 PostgreSQL 데이터베이스의 스트리밍 복제를 구현하는 데 필요한 단계를 이해하는 데 도움이 됩니다.
복제 세부정보
이제 PostgreSQL의 복제 모드, 모델 및 복제 유형을 이해하고 미리 쓰기 로깅에 대해 알아볼 차례입니다.
비동기 및 동기 모드
다음 다이어그램은 PostgreSQL 복제 모드를 보여줍니다.
비동기 복제의 경우 원본 서버는 복제 서버의 트랜잭션 완료 승인을 기다릴 필요가 없습니다. 복제 트랜잭션은 복제 서버에 대기하고 두 서버는 처리가 완료될 때까지 지정된 시간 동안 동기화되지 않은 상태를 유지할 수 있습니다.
동기식 모드 복제에서 원본 서버는 계속하기 전에 각 복제 트랜잭션이 완료되었다는 해당 복제 서버 또는 여러 서버의 승인을 기다립니다. 원본 서버와 복제 서버 모두 항상 사용할 수 있어야 합니다. 복제본에서 트랜잭션 실패 메시지를 받으면 원본 서버는 해당 트랜잭션을 롤백합니다. 이 복제 모드에서는 원본 서버와 복제 서버가 항상 동기화되어 있습니다. 단점은 복제 서버가 다운되거나 트랜잭션을 완료할 수 없는 경우 원본 서버가 정지 상태가 된다는 것입니다.
단일 및 다중 소스 복제 모델
단일 소스 사용 복제의 경우 하나의 원본 서버와 하나 이상의 복제 서버만 있습니다. 소스는 모든 복제본에 복제 트랜잭션을 보냅니다.
복제 서버는 원본 서버의 변경 사항만 수락할 수 있습니다. 소스가 아닌 서버에서 변경 사항을 수신하는 경우 복제본은 해당 트랜잭션을 소스로 다시 복제하지 않습니다.
다중 소스에서 복제, 두 개 이상의 원본 서버가 있습니다. 한 원본 데이터베이스에서 테이블 행이 변경되면 해당 원본 서버는 변경 사항을 다른 원본 서버의 상대 테이블 행에 복제합니다. 이 모델이 성공하려면 중복 기본 키 및 기타 문제를 방지하기 위해 충돌 해결 체계를 사용해야 합니다.
복제 유형
복제에는 세 가지 유형이 있습니다.
- 스트리밍 복제 :PostgreSQL은 버전 9 이상에서 이러한 유형의 복제를 사용할 수 있도록 했습니다. 복제본은 실행 전용 선택 쿼리에 사용할 수 있습니다. 이 유형의 기본 요구 사항은 원본 데이터베이스와 복제본 데이터베이스가 동일한 주 버전이어야 한다는 것입니다.
- 계단식 복제 :PostgreSQL 9.2에 도입된 그의 복제 유형을 사용하면 원본 서버에서 직접 복제하는 대신 대기 서버에서 복제할 수 있습니다. 이렇게 하면 원본 서버의 부하를 줄일 수 있습니다.
- 논리적 복제 :이 유형을 사용하여 선택한 데이터 세트 또는 데이터베이스 개체를 복제하거나 PostgreSQL의 다른 주요 버전 간에 복제할 수 있습니다. 비논리적 복제는 쓰기를 위해 대기 서버를 사용할 수 있지만 몇 가지 제한 사항이 있습니다. Truncate, (lob, blob, clob), 시퀀스, 스키마 및 DDL과 같은 대형 개체를 복제할 수 없습니다.
미리 쓰기 로깅
스트리밍 복제를 사용하기 전에 미리 쓰기 로깅(WAL)과 작동 방식을 이해해야 합니다.
PostgreSQL에서 시스템은 데이터베이스에 대한 변경 사항을 데이터 파일에 저장하기 전에 먼저 로그 파일에 저장하며 이러한 변경 사항을 WAL 레코드라고 합니다. 모든 WAL 레코드에는 LSN(로그 시퀀스 번호)이라는 고유 번호가 있습니다.
PostgreSQL의 스트리밍 복제를 사용하면 복제 데이터베이스 서버는 WAL 파일을 사용하여 원본 데이터베이스 서버에서 변경 사항을 복제합니다.
세 가지 필수 프로세스는 PostgreSQL 데이터베이스에서 스트리밍 복제에서 중요한 역할을 합니다.
- WAL 발신자
- WAL 수신기
- 시작
WAL 발신자 프로세스는 소스 서버에서 실행되는 반면 WAL 수신자 및 시작 프로세스는 복제 서버에서 실행됩니다. 복제를 시작하면 다음과 같은 이벤트가 발생합니다.
- WAL 수신자 프로세스는 복제본이 마스터에 WAL 데이터를 재생할 때까지 LSN을 보냅니다.
- 소스의 WAL 발신자 프로세스는 WAL 수신자가 보낸 최신 LSN에 도달할 때까지 WAL 데이터를 복제본으로 보냅니다.
- 다음으로 WAL 수신자는 WAL 발신자가 보낸 WAL 데이터를 WAL 세그먼트에 씁니다.
- 복제본의 시작 프로세스는 WAL 세그먼트에 기록된 데이터를 재생합니다.
- 드디어 스트리밍 복제가 시작됩니다.
테스트 케이스
원본과 하나의 복제본 간에 PostgreSQL에서 스트리밍 복제를 설정하는 단계는 다음과 같습니다.
1단계
먼저 원본 서버와 복제 서버 모두에 암호가 없는 SSH 인증이 구성되어 있는지 확인해야 합니다. 그렇지 않은 경우 ssh-keygen
을 사용하여 구성해야 합니다. .
비밀번호 없는 SSH 구성에 대해 알아보려면 https://linuxize.com/post/how-to-setup-passwordless-ssh-login/을 참조하십시오.
Source node 192.168.24.28
Replica node 192.168.24.29
Username `postgres` on both source and replica.
2단계
방화벽을 중지하려면 두 서버에서 다음 명령을 실행하십시오.
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
3단계
-
원본 서버에서 데이터 디렉터리로 이동합니다.
cd /var/lib/pgsql/11/data
-
postgresql.conf 수정 파일을 만들고 다음과 같이 변경하십시오.
archive_mode = on archive_command = ‘cp %p /var/lib/pgsql/archive/%f’ max_wall_senders = 5 wal_keep_segment =32 wal_level = replica listen_addresses = ‘*’
-
pg_hba.conf에 복제 서버 IP 주소 항목을 추가합니다. :
host postgres postgres (ip_address)192.168.24.29/32 trust host replication postgres (ip_address)192.168.24.29/32 trust
-
pg_hba.conf의 모든 변경 사항에 대해 , 서비스 다시 로드:
$ /usr/local/pgsql_11/bin/pg_ctl -D /var/lib/pgsql/11/ reload
-
/var/lib/pgsql/archive/ 생성 존재하지 않는 경우 아카이브 디렉토리.
-
변경 사항을 반영하려면 서버를 다시 시작하십시오.
4단계
복제 서버에서:
-
데이터 디렉토리로 이동하여 서비스를 중지하십시오.
$ /usr/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/data/ stop
-
복제본의 데이터 디렉토리에서 모든 것을 제거하고 다음 명령을 사용하여 소스에 연결을 시도하십시오.
$ /usr/pgsql-11/bin/psql -h 192.168.24.28
-
작동하면 복제본에서 기본 백업을 시작합니다.
$ cd /var/lib/pgsql/11/data $ /usr/pgsql-11/bin/pg_basebackup -D /var/lib/pgsql/11/data/ -X fetch -h 192.168.24.28 -R -P
이 명령은 소스 데이터베이스의 데이터 디렉토리에서 replicadata 디렉토리로 모든 데이터를 복사하고 recovery.conf를 생성합니다. 파일.
5단계
기본 백업이 완료된 후 recovery.conf를 확인해야 합니다. 파일. recovery.conf가 있는 모든 서버 데이터 디렉토리의 파일은 복제 서버이며 원본 서버의 정보를 포함합니다. 다음과 같이 수정하십시오.
Standby_mode = ‘on’
Primary_conninfo = ‘user=postgres host=192.168.24.28 port=5432’
파일은 다음과 같이 표시되어야 합니다.
$ Vi recovery.conf
Standby_mode = ‘on’
Primary_conninfo = ‘user=postgres passfile=’’/home/postgres/.pgpass’’ host=192.168.24.28 port=5432 sslmode=disable sslcompression=0 target_session_attrs=any’
6단계
이제 서버를 시작하고 변경 사항을 확인하십시오.
-
소스에 로그인:
/usr/local/pgsql_11/bin/psql Postgres=# Postgres=# Select * from pg_stat_replication; -[ RECORD 1 ]----+------------------------------ pid | 1934 usesysid | 26712 usename | postgres application_name | walreceiver client_addr | 192.168.24.29 client_hostname | client_port | 52143 backend_start | 2020-11-07 11:30:31.035614-05 backend_xmin | state | streaming sent_lsn | 0/50000E34 write_lsn | 0/50000E34 flush_lsn | 0/50000E34 replay_lsn | 0/50000E34 write_lag | flush_lag | replay_lag | sync_priority | 0 sync_state | async
-
복제본에 로그인:
/usr/local/pgsql_11/bin/psql Postgres=# Postgres=# Select * from pg_is_in_recovery(); Pg_is_in_recovery ---------------------------------- t
-
소스에서 OS 수준 명령으로 확인:
$ ps -ef|grep sender postgres 1934 1718 0 11:31 ? 00:00:00 postgres: wal sender process replicator 192.168.24.29(52143) streaming 0/50000E34
-
복제본에서 OS 수준 명령으로 확인:
$ ps -ef|grep receiver postgres 1358 1748 0 11:31 ? 00:00:04 postgres: wal receiver process streaming 0/50000E34
발신자와 수신자의 트랜잭션은 동일해야 하며 복제본은 항상 읽기 전용 모드입니다.
-
(선택 사항) 기본적으로 복제는 비동기식 모드입니다. 동기 복제로 변경하려면 소스 서버로 이동하여 postgresql.conf를 다음과 같이 변경합니다. :
synchronous_standby_names=’*’ in
그런 다음 서비스를 다시 시작합니다.
$ /usr/local/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/ restart
결론
이 게시물에서는 복제 유형과 스트리밍 복제를 설정하는 단계에 대해 설명합니다. 일반적으로 이것을 사용하여(특히 분석에서) 읽기 전용 복제본을 제공하여 기본 서버의 부하를 줄입니다.
고가용성 환경이 필요한 경우나 기본 서버가 다운된 경우 핫스탠바이 서버로 장애 조치하는 경우에도 유용합니다.
데이터 서비스에 대해 자세히 알아보세요.
피드백 탭을 사용하여 의견을 작성하거나 질문하십시오. 저희와 대화를 시작할 수도 있습니다.