AWS RDS Postgresql 을 Master 단일로 사용 중이다.
Master DB 에 데이터가 쌓이고 있는데
유관부서에서 Master DB에 붙어서 데이터를 조회하고 자유롭게 수정도 하고 싶다며
DB 접속정보를 요청했다.
요구사항
- Master DB 데이터 조회
- Master DB 데이터 쓰기 권한
- 동기화해야할 테이블은 110여개 정도임
- Master에서 데이터가 변경되면 Read Replica에도 반영되어야 함
- 이후 새로 추가되는 테이블은 로컬에서만 사용
- Master와 동기화되지 않고 Read Replica에서만 존재하는 테이블이어야 함
- Master의 부하를 최소화해야함
- Read Replica 를 활용하여 Master에 직접 쿼리를 날리는 것을 최소화해야 함
검토사항
- Master DB read-only 계정을 전달한다 👉 ❌
- 데이터 쓰기 권한 필요.
- 운영 중이거나 개발중인 DB에 쓰기 권한은 무리가 있다고 판단.
- 요청자가 자유롭게 작업할 수 있는 환경 제공을 목표로 설정
- Physical Replication 👉 ❌
- read replica 에서의 모든 트랜잭션은 read-only라, 데이터 쓰기 기능 불충족
- FDW(Foreign Data Wrapper) 👉 ❌
- read reaplica 에서 Master 로 커넥션을 생성하여 쿼리를 수행하여 Master 부하 발생가능
- BDR(Bi-Directional Replication) 👉 ❌
- read replica 에서 구성할 수 있는지 read replica를 프로모션해야함. 프로모션을 해야만하는 상황이라면 Logical Replication을 고려할것임.
Physical Replication(Read Replica) + Logical Replication 혼합
- 110개 테이블은 Read Replica로 Physical Replication 사용
- 새로운 테이블을 로컬에서만 관리하려면, Read Replica를 프로모션하여 독립적인 DB로 전환해야 함
- 새로 추가되는 테이블은 Logical Replication 을 제외하여 로컬에서만 사용
✔ Read Replica 상태에서는 테이블을 새로 만들 수 없으므로, Read Replica를 독립적인 Primary로 승격해야 함.
✔ 이제 기존의 Physical Replication은 깨지지만, 새로운 테이블을 자유롭게 생성 가능함.
✔ Read Replica가 Primary로 전환되었으므로, 이제 새로운 테이블을 만들 수 있음.
✔ 이 테이블은 기존 110개 테이블과는 독립적으로 운영됨.
✔ Master DB와는 별도로 관리되므로, 동기화되지 않음.
✔ Read Replica가 프로모션되었으므로, 기존의 Physical Replication(자동 복제)이 깨짐.
✔ 다시 Master DB와 동기화하려면 Logical Replication을 설정해야 함.
Master에서 110개 테이블만 복제 대상으로 설정
CREATE PUBLICATION my_pub FOR TABLE table1, table2, ..., table110;
프로모션된 Read Replica에서 Subscription 설정
CREATE SUBSCRIPTION my_sub
CONNECTION 'dbname=master_db host=master_host user=replica_user password=your_password'
PUBLICATION my_pub;
✔ 이제 110개 테이블은 다시 Master DB와 동기화되지만, 새로운 테이블(local_only_table)은 독립적으로 유지됨.
✔ Master에 부하를 최소화하면서도, 추가 테이블을 로컬에서 자유롭게 운영 가능.
⚠️ Replica 에서 Subscription을 등록하는데 아래 에러가 발생한 경우
SQL Error [08006]: ERROR: could not connect to the publisher: connection to server at "cgms-dev-kor-region-rdmsdb.cszq0iygpclo.ap-northeast-2.rds.amazonaws.com" (13.125.71.60), port 5432 failed: FATAL: no pg_hba.conf entry for host "52.79.144.174", user "cgmsrdbmsadmin", database "sdbio_kr", SSL encryption
connection to server at "cgms-dev-kor-region-rdmsdb.cszq0iygpclo.ap-northeast-2.rds.amazonaws.com" (13.125.71.60), port 5432 failed: FATAL: no pg_hba.conf entry for host "52.79.144.174", user "cgmsrdbmsadmin", database "sdbio_kr", no encryption
✅ 문제 원인
1. PostgreSQL의 pg_hba.conf에서 구독자(Subscriber)의 IP가 허용되지 않음.
2. AWS RDS 환경에서는 직접 pg_hba.conf를 수정할 수 없으므로, Security Group에서 접근을 허용해야 함.
3. SSL 관련 설정이 맞지 않거나, SSL을 강제하도록 설정되어 있음.
4. pg_hba.conf에서 SSL과 No SSL이 다르게 설정되었을 가능성 있음.
👌 위 사항들을 파악해보니, 잘 설정되어 있었다. 추가로 확인해야할 사항은...
✅ VPC 보안 그룹에서 포트 5432가 0.0.0.0/0로 열려 있음 → 보안 그룹 문제는 아님
✅ SHOW rds.force_ssl; 실행되지 않음 → AWS RDS에서는 특정 설정을 직접 확인할 수 없음
❌ pg_hba.conf 수정 불가능 (AWS RDS 제한 사항)
❌ Subscriber(Replica)에서 Publisher(Master)로의 연결이 차단됨
🔎 확인할 항목
AWS RDS에서는 기본적으로 Logical Replication이 비활성화되어 있음.
✅ Logical Replication을 사용하려면 rds.logical_replication을 활성화해야 함. (Master 에서)
🛠 확인 및 설정 방법
SHOW rds.logical_replication;
✔ 이제 Logical Replication이 활성화되었는지 확인 가능.🔹 rds.logical_replication 활성화는 어디에서 해야 하나?
✅ rds.logical_replication은 Master(Primary)에서만 활성화하면 됨.
❌ Read Replica에서는 rds.logical_replication을 활성화할 필요 없음.
❌ AWS RDS에서는 Read Replica에서 rds.logical_replication을 변경할 수도 없음.
🔎 이유
Logical Replication의 동작 방식
Read Replica는 Physical Replication(WAL 기반)
AWS RDS에서 rds.logical_replication 설정 가능 범위
📌 적용 방법
✔ Master(Primary)에서 새로운 Parameter Group을 생성하고, rds.logical_replication = 1 설정한 후 적용
✔ RDS 재시작 후 확인
SHOW rds.logical_replication;
➡ 즉, rds.logical_replication은 Master에서만 설정하면 된다! 🚀