이 페이지는 Lakebase에서 논리 복제를 모니터링하는 방법, 복제가 스케일 투 제로 및 브랜치와 어떻게 상호작용하는지, 그리고 일반적인 문제를 해결하는 방법을 설명합니다. 설정에 대해서는 Lakebase에 데이터를 복제 하기와 Lakebase에서 데이터를 복제하기를 참조하세요.
모니터 미러링
모든 Postgres 역할은 두 가지 예외를 제외하고 이 페이지의 복제 카탈로그를 조회할 수 있습니다.
subconninfo의 pg_subscription 열은 연결 비밀번호를 포함할 수 있고 제한되어 있으니, SELECT * 대신 특정 열을 선택하세요.
pg_stat_replication에서 대부분의 열은 역할에 pg_read_all_stats이(가) 없는 한 숨겨져 있으며, 이는 databricks_superuser의 구성원이 가진 권한입니다.
구독자에서 구독이 존재하고 활성화되어 있는지 확인하세요:
SELECT subname, subenabled FROM pg_catalog.pg_subscription;
게시자에서 출판물이 존재하는지 확인하세요:
SELECT pubname FROM pg_catalog.pg_publication;
구독자의 테이블별 동기화 상태를 확인하세요. 모든 표마다 Ready (fully live)로 표시되면 초기 사본이 완성되고 구독이 스트리밍됩니다:
SELECT
srrelid::regclass AS table_name,
CASE srsubstate
WHEN 'i' THEN 'Initializing'
WHEN 'd' THEN 'Data copying (in progress)'
WHEN 's' THEN 'Synchronized (catching up)'
WHEN 'r' THEN 'Ready (fully live)'
END AS sync_status
FROM pg_catalog.pg_subscription_rel;
구독 상태와 지연 확인:
SELECT subname, received_lsn, latest_end_lsn, last_msg_receipt_time
FROM pg_catalog.pg_stat_subscription;
퍼블리셔와 구독자의 행 수를 비교하여 테이블이 동기화되어 있는지 확인하세요:
SELECT COUNT(*) FROM public.playing_with_lakebase;
publisher에서 복제 슬롯과 각 슬롯이 얼마나 진행되었는지 목록을 작성하세요:
SELECT slot_name, slot_type, active, restart_lsn
FROM pg_catalog.pg_replication_slots;
Lakebase에서는 결과에 내부 물리적 슬롯 wal_proposer_slotwal_retention_slot과 도 포함됩니다. Lakebase가 이 슬롯들을 관리하며, 이들은 논리적 복제의 일부가 아닙니다.
논리적 복제와 0으로 스케일링
활성 구독자가 있는 Lakebase 컴퓨트는 0으로 확장되지 않아 컴퓨트 사용량이 증가할 수 있습니다.
활성 구독자 확인:
SELECT *
FROM pg_catalog.pg_stat_replication
WHERE application_name <> 'walproposer';
복제 슬롯과 저장 공간
복제 슬롯은 구독자가 변경 사항을 받았다고 확인할 때까지 발행자가 선행 기록 로그(WAL)를 유지하도록 합니다. 구독자가 변경 사항을 소비하지 않게 되면, 예를 들어 구독자가 비활성화되었거나, 연결이 끊겼거나, 실패하거나 뒤처졌다면, WAL은 퍼블리셔에 누적됩니다. 이것이 논리 복제에서 심각한 문제의 가장 흔한 원인입니다:
- 출판사는 저장 공간이 부족할 수 있습니다. 보유된 WAL은 퍼블리셔의 저장 공간이 가득 찰 때까지 증가하며, 이로 인해 데이터베이스가 쓰기를 받지 못하고 장애가 발생할 수 있습니다.
- 슬롯을 삭제해도 즉시 저장 공간이 해제되지 않습니다. Postgres는 이후 체크포인트에서 WAL 세그먼트를 재활용할 때만 남아 있는 WAL을 제거합니다. 출판사가 이미 저장 공간을 다 써버렸다면, 그 재순환이 완료되지 않을 수도 있습니다.
- 이 위험은 외부 출판사에도 적용됩니다. Lakebase가 외부 데이터베이스를 구독하면, 구독이 변경 사항을 더 이상 소비하지 않으면 WAL이 그 외부 소스에 누적됩니다.
유지된 WAL 모니터링
퍼블리셔에서 각 논리 슬롯이 얼마나 많은 WAL을 유지하는지, 그리고 활성 상태인지 확인하세요:
SELECT slot_name, active, wal_status,
pg_catalog.pg_size_pretty(pg_catalog.pg_wal_lsn_diff(pg_catalog.pg_current_wal_lsn(), restart_lsn)) AS retained_wal
FROM pg_catalog.pg_replication_slots
WHERE slot_type = 'logical';
복제가 활성화된 상태에서 이 쿼리를 정기적으로 실행하세요.
active가 계속 증가하거나 false가 retained_wal인 경우를 조사하세요.
wal_status의 extended는 해당 슬롯이 퍼블리셔가 일반적으로 유지하는 것보다 더 많은 WAL을 유지하고 있다는 뜻입니다.
wal_status의 unreserved 또는 lost는 슬롯이 max_slot_wal_keep_size를 초과했고 필요한 WAL을 잃고 있거나 이미 잃었음을 의미하므로 구독을 다시 생성해야 합니다.
WAL 축적에서 회복하기
Monitor retained WAL의 쿼리로 WAL을 유지하는 슬롯을 찾으세요.
가입자가 복구할 수 있다면, 네트워크 문제, 구독 비활성화, 적용 실패 등 원인을 해결해 가입자가 따라잡고 슬롯이 진행되도록 합니다.
구독이 더 이상 필요 없다면, 구독자에서 구독을 취소하세요. 구독자에게 연락이 닿지 않으면 퍼블리셔에서 슬롯을 직접 삭제하세요. 슬롯을 드롭하려면 먼저 비활성 상태여야 합니다:
SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');퍼블리셔가 보관된 WAL을 재사용할 때까지 기다리세요. 자체 관리 퍼블리셔의 저장 공간이 거의 부족한 경우 먼저 저장 공간을 추가하여 재순환이 완료될 수 있도록 하세요.
Lakebase의 비활성 슬롯 자동 제거
Lakebase가 퍼블리셔일 때는 약 40시간 동안 비활성 상태였던 복제 슬롯을 자동으로 제거하여 슬롯이 WAL을 무기한 유지하지 못하게 합니다. 슬롯은 구독자가 변경 사항을 처리하지 않으면 슬롯이 진행을 멈출 때 비활성 상태가 됩니다. 이는 가입자가 비활성화되거나 사용 불가 상태가 되었거나, 가입자의 복제 지연 시간이 길게 설정되어 있을 때 발생할 수 있습니다.
슬롯이 삭제되는 것을 막으려면, 해당 구독자가 계속 연결되어 변경 사항을 계속 소비하도록 하세요. 가입자가 설정 가능한 복제 지연이나 복제 빈도를 사용한다면, 슬롯이 계속 진행되도록 40시간 이내로 유지하세요. 슬롯이 삭제되었는데도 여전히 필요하다면, 구독자에서 구독을 다시 생성하세요.
외부 출판사는 비활성 슬롯을 자동으로 제거하지 않습니다. 자가 관리 퍼블리셔에서는 max_slot_wal_keep_size을 설정하여 슬롯이 유지할 수 있는 WAL을 제한합니다. 슬롯이 한도를 초과하면 Postgres가 해당 슬롯을 무효화하고 구독을 다시 생성해야 합니다.
브랜치 복원은 복제 슬롯을 제거합니다
분기를 복원하면 그 분기의 모든 복제 슬롯이 삭제됩니다. 지점 복원 후 출판물과 구독을 다시 생성하세요.
자식 지부는 구독을 상속받지 않습니다
상위 브랜치에서 정의된 구독은 하위 브랜치에 복제되지 않습니다. Lakebase는 자식 브랜치의 컴퓨트가 시작되기 전에 자식 브랜치에서 이를 제거하기 때문에, 두 컴퓨트가 동일한 구독을 복제하지 않습니다. 이는 자식 브랜치를 생성, 초기화 또는 복원할 때 적용됩니다. 복제가 필요하면 자식 브랜치에서 구독을 다시 생성하세요.
구독자 데이터베이스를 삭제하면 그 슬롯은 퍼블리셔에 남게 됩니다
Lakebase 앱, Databricks CLI, REST API를 사용해 구독이 있는 데이터베이스를 삭제하면, Lakebase는 먼저 해당 구독을 삭제하지만, 퍼블리셔에서 복제 슬롯을 제거하지는 않습니다. 각 슬롯은 퍼블리셔에 남아 있으며 WAL을 계속 보유하여 퍼블리셔의 저장 공간을 채울 수 있습니다. 마이그레이션 시 퍼블리셔는 종종 프로덕션 데이터베이스 역할을 합니다.
SQL DROP DATABASE 명령어는 표준 Postgres와 마찬가지로 데이터베이스에 구독이 있을 때 database "<name>" is being used by logical replication subscription와 함께 실패합니다.
슬롯이 남지 않도록 데이터베이스를 삭제하기 전에 구독을 모두 중단하세요. 퍼블리셔에 연결할 수 있으면, DROP SUBSCRIPTION 퍼블리셔의 슬롯도 제거합니다. 구독 또는 게시 삭제 항목을 참조하세요.
이미 데이터베이스를 삭제했다면, 퍼블리셔의 남은 슬롯을 제거하세요. 기본적으로 구독 슬롯은 구독과 동일한 이름을 가집니다. 구독을 만들 때 slot_name을 설정했다면 그 이름을 대신 사용하세요. 데이터베이스를 삭제하기 전에 슬롯 이름을 기록하려면 그 데이터베이스에서 실행 SELECT subname, subslotname FROM pg_catalog.pg_subscription; 하세요. 슬롯이 존재하고 비활성화되어 있는지 확인하세요:
SELECT slot_name, database, plugin, active
FROM pg_catalog.pg_replication_slots
WHERE slot_type = 'logical' AND slot_name = '<slot_name>';
삭제된 구독에 속했던 슬롯만 빼세요. 다른 비활성 슬롯은 가입자 소유이거나 일시적으로 연결이 끊긴 변경 데이터 캡처(CDC) 도구에 속할 수 있으며, 해당 슬롯을 삭제하면 해당 복제가 중단됩니다. 슬롯을 놓으세요:
SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');
복제 역할
전용 복제 역할은 해당 REPLICATION 속성을 가져야 합니다. Lakebase 앱, Azure Databricks CLI 또는 REST API에서 생성된 역할은 이들이 databricks_superuser의 구성원인지 여부와 관계없이 이 속성을 가집니다. SQL로 생성된 역할은 REPLICATION 속성을 자동으로 부여받지 않습니다. SQL로 하나를 만들려면, 예를 들어 속성을 포함하세요 CREATE ROLE replication_user WITH LOGIN REPLICATION PASSWORD '<password>';. 기존 역할에 추가하려면 ALTER ROLE <role_name> REPLICATION; 실행하세요. 두 문장 모두 프로젝트 소유자 역할과 같이 CREATEROLE 및 REPLICATION 속성이 있는 역할을 요구합니다.
역할의 권한을 확인:
SELECT rolname, rolreplication
FROM pg_catalog.pg_roles
WHERE rolname = '<role_name>';
디코더 플러그인
Lakebase는 두 가지 논리적 디코딩 출력 플러그인을 지원합니다:
-
pgoutput: 내장 Postgres 논리 복제 플러그인, 기본값 표준 Postgres-to-Postgres 복제에 사용하세요. -
wal2json: 변경 데이터를 JSON 형식으로 소비하는 시스템의 경우 WAL 변경 사항을 JSON 형식으로 출력합니다.
Publisher 설정
Lakebase에서 max_wal_senders와 max_replication_slots는 둘 다 10로 설정되어 있습니다:
max_wal_senders = 10
max_replication_slots = 10
max_wal_senders 가입자에게 변경 사항을 스트리밍하는 동시 WAL 송신 프로세스에 제한을 두고, max_replication_slots는 가입자 진행 상황을 추적하는 복제 슬롯 수를 제한합니다. 구독자당 각각 하나씩 플랜. 다른 값을 요청하려면 Databricks에 문의하세요.
전용 복제 슬롯을 생성하세요
일부 데이터 서비스는 미리 생성해 둔 복제 슬롯을 요구합니다. 표준 Postgres 기능으로 디코더 플러그인 이름을 지정하여 하나 만드세요:
SELECT pg_catalog.pg_create_logical_replication_slot('my_replication_slot', 'pgoutput');
구독 또는 게시를 삭제하세요
더 이상 필요하지 않을 때 구독을 취소하세요. 퍼블리셔에 접속 가능한 경우 구독을 끊으면 퍼블리셔와의 연결이 끊기고 퍼블리셔의 복제 슬롯이 제거됩니다. 복제된 데이터는 가입자 데이터베이스에 남아 있습니다.
DROP SUBSCRIPTION my_subscription;
퍼블리셔에 연결할 수 없으면 원격 슬롯을 제거하기 위해 연결할 수 없으므로 DROP SUBSCRIPTION이 완료되지 않습니다. 먼저 슬롯을 분리한 후 구독을 삭제하세요:
ALTER SUBSCRIPTION my_subscription DISABLE;
ALTER SUBSCRIPTION my_subscription SET (slot_name = NONE);
DROP SUBSCRIPTION my_subscription;
이 경우 복제 슬롯은 퍼블리셔에 남아 있으며 WAL을 계속 유지합니다. WAL을 해제하려면 publisher에서 제거하세요:
SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');
출판사에 출판물을 드롭하세요:
DROP PUBLICATION my_publication;
Troubleshooting
| 증상 | 원인 및 해결 방법 |
|---|---|
| 구독 서비스가 연결되지 않습니다. | 퍼블리셔에 접속 가능한지, 그리고 연결 문자열, role, password가 정확한지 확인하세요. Lakebase가 가입자일 때, 퍼블리셔 엔드포인트가 계정 네트워크 정책 허용 목록에 있는지 확인하세요. Lakebase에 데이터 복제를 참조하세요. |
| 다른 Lakebase 데이터베이스 구독이 멈추고 연결이 되지 않습니다. | 동일 지역 내 Lakebase 데이터베이스 간 복제는 지원되지 않습니다. 출처와 목표는 서로 다른 지역에 있어야 합니다. 제한 사항을 참조하세요. |
CREATE SUBSCRIPTION은 restricted by Account Network Policies에서 실패합니다. |
귀하의 계정에는 네트워크 정책이 적용되어 있으며, 퍼블리셔 호스트는 허용된 인터넷 대상에 포함되지 않습니다. 호스트를 계정 네트워크 정책에 추가하세요. Lakebase에 데이터 복제를 참조하세요. |
| 저장 공간은 증가하고 해제되지 않습니다. | 복제 슬롯이 구독자가 변경 사항을 소비하지 않기 때문에 WAL을 유지하고 있습니다. 해결되지 않으면 출판사는 저장 공간이 부족할 수 있습니다. 보유된 WAL을 확인한 후 구독자를 다시 연결하거나 슬롯을 삭제하세요. 저장소는 퍼블리셔가 WAL을 재사용한 후에만 해제됩니다. 복제 슬롯과 저장소를 참조하세요. |
| 행이 구독 서버에 도착하지 않습니다. | 목표 테이블의 이름과 열이 일치하는지 확인하고, 게시에 예상한 테이블이 포함되어 있는지 확인하세요. |
다음 단계
- Lakebase로 마이그레이션: 기존 Postgres 데이터베이스를 Lakebase로 마이그레이션합니다. Lakebase에 데이터 복제를 참조하세요.
- Lakebase에서 스트리밍하기: 변경 사항을 외부 Postgres 구독자에게 게시하세요. Lakebase에서 데이터 복제를 참조하세요.
- 기능 이해하기: 논리적 복제가 무엇이며 언제 사용해야 하는지 검토하세요. 논리 복제를 참조하세요.