[AWS RDS] Replica 구성

codesheep09·2025년 2월 18일
1

1. 구성 배경

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을 고려할것임.

2. Replica 구성 전략

Physical Replication(Read Replica) + Logical Replication 혼합

  • 110개 테이블은 Read Replica로 Physical Replication 사용
  • 새로운 테이블을 로컬에서만 관리하려면, Read Replica를 프로모션하여 독립적인 DB로 전환해야 함
  • 새로 추가되는 테이블은 Logical Replication 을 제외하여 로컬에서만 사용
  1. Read Replica를 사용하여 110개 테이블 Physical Replication

    ✔ AWS RDS에서 Read Replica를 생성하면 Master의 모든 데이터를 Physical Replication으로 동기화
    ✔ 이 방식은 WAL 기반이므로 Master 부하 없이 110개 테이블이 자동 복제됨
    ✔ 하지만 Read Replica 상태에서는 새 테이블을 만들 수 없음!
  1. Read Replica를 프로모션하여 독립적인 DB로 변환

    ✔ Read Replica 상태에서는 테이블을 새로 만들 수 없으므로, Read Replica를 독립적인 Primary로 승격해야 함.
    ✔ 이제 기존의 Physical Replication은 깨지지만, 새로운 테이블을 자유롭게 생성 가능함.

  2. 새 테이블을 로컬에서 독립적으로 관리

    ✔ Read Replica가 Primary로 전환되었으므로, 이제 새로운 테이블을 만들 수 있음.
    ✔ 이 테이블은 기존 110개 테이블과는 독립적으로 운영됨.
    ✔ Master DB와는 별도로 관리되므로, 동기화되지 않음.

  3. Master DB와 기존 110개 테이블 동기화 유지

    ✔ 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에 부하를 최소화하면서도, 추가 테이블을 로컬에서 자유롭게 운영 가능.


3. 에러 발생시

⚠️ 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)로의 연결이 차단됨

✅ RDS 파라미터 그룹에서 Logical Replication 활성화 여부 확인

🔎 확인할 항목
AWS RDS에서는 기본적으로 Logical Replication이 비활성화되어 있음.

✅ Logical Replication을 사용하려면 rds.logical_replication을 활성화해야 함. (Master 에서)

🛠 확인 및 설정 방법

  1. AWS 콘솔 → RDS → "Parameter Groups" 이동
  2. 사용 중인 RDS 파라미터 그룹을 선택
  3. rds.logical_replication 설정 확인
    • 값이 1이면 Logical Replication 활성화됨 (정상)
    • 값이 0이면 Logical Replication이 비활성화되어 있음 (변경 필요)
  4. 값이 0이면 1로 변경 후 저장
  5. 변경 후 RDS 인스턴스를 재시작해야 적용됨.
    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을 변경할 수도 없음.


🔎 이유

  1. Logical Replication의 동작 방식

    • Master(Primary): PUBLICATION을 생성하여 데이터 변경 내용을 관리.
    • Replica(Subscriber): SUBSCRIPTION을 생성하여 Master에서 변경된 데이터를 받아옴.
  2. Read Replica는 Physical Replication(WAL 기반)

    • Read Replica는 Master의 변경 사항을 WAL(Write-Ahead Logging)로 복제받음.
    • Logical Replication은 WAL을 사용하지 않고 SQL 수준에서 동작하므로, Read Replica에서 활성화할 필요가 없음.
    • Read Replica에서는 rds.logical_replication을 활성화할 수도 없음.
  3. AWS RDS에서 rds.logical_replication 설정 가능 범위

    • rds.logical_replication 설정은 Master(Primary)에서만 적용 가능.
    • Read Replica는 기본적으로 Read-Only이므로 변경할 수 없음.

📌 적용 방법
✔ Master(Primary)에서 새로운 Parameter Group을 생성하고, rds.logical_replication = 1 설정한 후 적용
✔ RDS 재시작 후 확인

SHOW rds.logical_replication;

➡ 즉, rds.logical_replication은 Master에서만 설정하면 된다! 🚀

profile
IT 관련 내용들을 정리하는 공간입니다.

0개의 댓글