48.2. 논리적 디코딩 개념

48.2.1. 논리적 디코딩
48.2.2. 복제 슬롯
48.2.3. 출력 플러그인
48.2.4. 스냅샷 추출

48.2.1. 논리적 디코딩

논리적 디코딩이란 데이터베이스의 내부 상태에 대한 자세한 지식이 없이 데이터베이스의 모든 영구적인 변경 사항을 일관되고, 이해하기 쉬운 형식으로 해석하는 절차다.

PostgreSQL의 논리적 디코딩은 저장 단계의 변경 사항을 포함하는 미리 쓰는 로그의 내용을 응용프로그램 차원에서 다시 사용할 수 있도록 자료의 내용이나, SQL 구문으로 다시 풀이하는 것이다.

48.2.2. 복제 슬롯

논리적 복제 관점에서 보면, 하나의 슬롯은 원본 서버에서 만들어진 변경 사항을 클라이언트가 순차적으로 다시 실행 할 수 있도록 그 내용을 보관하는 곳이다. 각각의 슬롯은 그 데이터베이스의 변경 사항을 각각의 출력 플러그인으로 보내는 역할을 한다.

참고

PostgreSQL에는 스트리밍 복제 (26.2.5절 참조) 슬롯도 있지만 서로 다르게 사용된다.

하나의 복제 슬롯은 PostgreSQL 클러스터 단위로 구분된다. 즉 모든 데이터베이스를 포함한다. 슬롯은 언제든지 다시 접속하면 이어서 사용할 수 있도록 설계되었다.

논리적 슬롯은 일반적인 경우 한 번의 요청에 한 번의 변경 사항만 전달 한다. 현재 위치는 체크포인트 작업으로만 영구 기록된다. 따라서 서버의 비정상적인 종료 뒤 다시 시작되면, 이미 보냈던 변경 사항을 다시 볼 낼 수 있다. 따라서 논리적 디코딩을 사용하는 클라이언트는 이미 반영된 변경 사항을 중복해서 반영하는 문제를 피할 방법을 마련해 두어야 한다. 클라이언트는 논리적 디코딩 작업을 시작하려고, 서버에 접속해서 변경 사항을 가져올 때, 자신의 마지막 처리한 LSN 보다 이전 변경 사항들이 있으면 그것을 통과하는 처리를 해야 할 경우도 있을 것이다. 복제 과정 추적 기능은 이 중복 방지 목적으로 제공한다. 자세한 설명은 복제 원본에서 한다.

하나의 데이터베이스 서버에서 여러 개의 독립된 슬롯을 사용할 수 있다. 데이터베이스 변경 내역 가운데, 현재 각 슬롯 단위로 자신의 처리 상태를 관리한다. 각 응용프로그램은 자기가 사용할 슬롯을 각각 사용하면 될 것이다.

논리적 복제 슬롯은 그 슬롯을 사용하는 응용프로그램(수신자)의 상태는 알 수 없다. 또한 여러 다른 응용프로그램이 같은 슬롯을 서로 다른 시간에 사용할 수도 있다. 이 때는 그 응용프로그램이 마지막 반영한 변경 사항을 기억하고 있어야 할 것이다. 이때 서버의 슬롯 상태 변경은 하나의 응용프로그램만 해야 할 것이다.

경고

복제 슬롯은 서버 장애 상황에서도 안전하게 유지되도록 설계되었으며, 그 슬롯을 사용하는 응용프로그램의 상태는 알 수 없다. 따라서, 해당 슬롯이 전혀 사용되지 않을 수도 있다. 이런 경우, 아직 반영하지 않은(응용프로그램에서 사용하지 않은) WAL 파일을 계속 보관하고, 데이터 파일의 폐기된 로우에 대해서도 VACUUM 작업에서 제외된다. 이 대로 계속 유지된다면, 트랜잭션 ID 겹침 방지 정책에 따라 데이터베이스 사용을 더 이상 못하게 된다. 이런 이유로 사용하지 않는 슬롯은 반드시 삭제 되어야 한다.

48.2.3. 출력 플러그인

출력 플러그인은 복제 슬롯에서 지정한 응용프로그램(수신자)에게 미리 기록한 로그의 내부 내용을 분석해서, 그 응용프로그램이 사용할 수 있는 양식으로 자료를 변경해서 전달하는 역할을 한다.

48.2.4. 스냅샷 추출

스트리밍 복제 인터페이스(CREATE_REPLICATION_SLOT 참조)를 이용해서 새로운 복제 슬롯이 만들어질 때, 스냅샷이 추출된다(9.27.5절 참조). 슬롯이 만들어지는 시점 이후부터 데이터베이스의 변경 사항을 보관함을 의미한다. 이 기능은 SET TRANSACTION SNAPSHOT 명령을 사용해서 새로운 복제본을 만드는데 사용할 수 있다. 이렇게 해서, 그 뒤에 발생하는 자료 변경에 관계 없이 데이터베이스의 한 시점을 기준으로 덤프하는 트랜잭션으로 사용할 수 있다.

Creation of a snapshot is not always possible. In particular, it will fail when connected to a hot standby. Applications that do not require snapshot export may suppress it with the NOEXPORT_SNAPSHOT option.