1️⃣ 개요
데이터베이스를 운영할 때, 읽기 부하(Read Load)를 분산하는 것은 성능 최적화의 핵심 요소입니다.
StatefulSet을 활용하면 읽기 전용 복제본(Read Replica)을 손쉽게 구성하여 트래픽을 효율적으로 분산할 수 있습니다.
이번 글에서는 StatefulSet을 활용하여 MySQL, PostgreSQL, MongoDB에서 Read Replica를 구성하는 방법과 운영 전략을 설명하겠습니다. 🚀
2️⃣ Read Replica(읽기 복제본)의 개념과 필요성
Read Replica는 데이터베이스의 읽기 요청을 처리하는 노드로, 리더(Primary) 노드의 부하를 줄이고 성능을 개선하는 역할을 합니다.
📌 Read Replica 활용 이유
이유 | 설명 |
읽기 성능 향상 | 다중 노드에서 읽기 요청을 처리하여 성능 개선 |
리더(Primary) 부하 감소 | 트랜잭션(쓰기 연산)은 리더가 담당하고, 읽기 연산은 복제본에서 수행 |
고가용성(HA) 향상 | 리더 장애 발생 시, Read Replica를 승격하여 운영 가능 |
✅ 읽기 성능이 중요한 워크로드에서는 Read Replica를 활용하는 것이 필수적입니다.
3️⃣ StatefulSet을 활용한 Read Replica 구성 방법
✅ 1. MySQL Read Replica 구성 (Master-Slave 복제)
MySQL에서는 리더-팔로워(Master-Slave) 복제 구조를 활용하여 Read Replica를 운영할 수 있습니다.
• 리더(Primary): 쓰기 및 읽기 연산 처리
• 팔로워(Replica): 리더의 데이터를 복제하여 읽기 요청 처리
📌 MySQL StatefulSet 구성 예제 (Read Replica 활성화)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8
env:
- name: MYSQL_REPLICATION_MODE
valueFrom:
fieldRef:
fieldPath: metadata.name
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
📌 리더(Primary)와 Read Replica 연결 설정
kubectl exec -it mysql-1 -- mysql -u root -p -e "CHANGE MASTER TO MASTER_HOST='mysql-0', MASTER_USER='replicator', MASTER_PASSWORD='password'; START SLAVE;"
📌 Read Replica 상태 확인
kubectl exec -it mysql-1 -- mysql -u root -p -e "SHOW SLAVE STATUS\G"
✅ 이제 mysql-1, mysql-2는 Read Replica로 동작하여 읽기 부하를 처리할 수 있습니다.
✅ 2. PostgreSQL Read Replica 구성 (Streaming Replication)
PostgreSQL은 Streaming Replication(스트리밍 복제) 방식을 사용하여 Read Replica를 구성할 수 있습니다.
Patroni를 활용하면 자동 리더 선출 기능도 함께 설정할 수 있습니다.
📌 PostgreSQL StatefulSet 예제 (Read Replica 포함)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 3
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: patroni:latest
env:
- name: PATRONI_SCOPE
value: "pg-cluster"
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 20Gi
📌 Read Replica 상태 확인
kubectl exec -it postgres-1 -- patronictl list
✅ PostgreSQL에서는 postgres-1, postgres-2가 Read Replica 역할을 수행합니다.
✅ 3. MongoDB Read Replica 구성 (ReplicaSet 방식)
MongoDB는 기본적으로 ReplicaSet을 활용하여 리더-팔로워 구조를 구성합니다.
📌 MongoDB StatefulSet 예제 (ReplicaSet 활용)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb
spec:
serviceName: mongodb
replicas: 3
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo:latest
args: ["--replSet", "rs0"]
volumeMounts:
- name: mongo-data
mountPath: /data/db
volumeClaimTemplates:
- metadata:
name: mongo-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
📌 MongoDB ReplicaSet 초기화 및 Read Replica 상태 확인
kubectl exec -it mongodb-0 -- mongo --eval "rs.initiate()"
kubectl exec -it mongodb-1 -- mongo --eval "rs.status()"
✅ MongoDB에서는 mongodb-1, mongodb-2가 Read Replica 역할을 수행합니다.
4️⃣ Read Replica 운영 시 고려해야 할 사항
✅ 1. Read Replica로 트래픽 라우팅 설정
일반적으로 읽기 요청은 Read Replica로 보내고, 쓰기 요청은 Primary 노드로 보내야 합니다.
📌 애플리케이션에서 Read Replica를 활용하는 예제
read_replica_host: "mysql-1.mysql,mysql-2.mysql"
primary_host: "mysql-0.mysql"
✅ 읽기 요청을 Read Replica로 보내면, Primary 노드의 부하를 줄일 수 있습니다.
✅ 2. 리더 장애 시 자동 승격 (Failover 설정)
리더가 장애가 발생하면 새로운 노드를 Primary로 승격해야 합니다.
📌 PostgreSQL Patroni 기반 리더 승격 예제
kubectl exec -it postgres-1 -- patronictl switchover --leader postgres-0 --candidate postgres-1
✅ 이제 postgres-1이 새로운 리더로 승격됩니다.
✅ 3. Read Replica 동기화 상태 확인
Read Replica가 정상적으로 데이터를 복제하고 있는지 주기적으로 확인해야 합니다.
📌 MySQL Read Replica 복제 상태 점검
kubectl exec -it mysql-1 -- mysql -u root -p -e "SHOW SLAVE STATUS\G"
📌 MongoDB Read Replica 동기화 상태 확인
kubectl exec -it mongodb-1 -- mongo --eval "rs.status()"
✅ 복제 상태를 지속적으로 모니터링해야 데이터 정합성을 유지할 수 있습니다.
🔥 5️⃣ 결론
✔ Read Replica를 활용하면 읽기 성능을 최적화하고 Primary 노드의 부하를 줄일 수 있음
✔ MySQL은 Master-Slave 복제 방식, PostgreSQL은 Streaming Replication, MongoDB는 ReplicaSet을 활용
✔ 트래픽 라우팅을 통해 읽기 요청을 Read Replica로 보내는 것이 중요함
✔ Primary 장애 발생 시 자동 승격(Failover) 설정을 적용해야 함
✔ Read Replica가 정상적으로 동작하는지 지속적으로 모니터링해야 함
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [StatefulSet 심화편 #19] StatefulSet에서 PVC 크기 동적 조정 (볼륨 확장 방법) (0) | 2025.03.14 |
---|---|
📌 [StatefulSet 심화편 #18] StatefulSet에서 Sharding(샤딩) 적용 방법 (0) | 2025.03.14 |
📌 [StatefulSet 심화편 #16] StatefulSet을 활용한 데이터베이스 클러스터 운영 (MySQL, PostgreSQL, MongoDB) (0) | 2025.03.14 |
📌 [StatefulSet 심화편 #15] StatefulSet의 다중 클러스터 배포 전략 (0) | 2025.03.14 |
📌 [StatefulSet 심화편 #14] StatefulSet과 동적 스토리지 프로비저닝 활용법 (0) | 2025.03.14 |