1️⃣ 개요
StatefulSet은 데이터 일관성을 보장해야 하는 데이터베이스 클러스터(MySQL, PostgreSQL, MongoDB 등) 운영에 필수적인 리소스입니다.
그러나, 단순히 StatefulSet을 배포하는 것만으로는 데이터 복제(Replication), 리더 선출(Leader Election), 장애 복구(Failover) 와 같은 중요한 기능을 제대로 운영할 수 없습니다.
이번 글에서는 StatefulSet을 활용하여 데이터베이스 클러스터를 운영하는 방법과 주요 고려 사항을 정리하겠습니다. 🚀
2️⃣ StatefulSet을 활용한 주요 데이터베이스 유형 및 특징
StatefulSet은 다양한 데이터베이스 클러스터를 운영하는 데 사용될 수 있습니다.
각 데이터베이스는 클러스터 아키텍처 및 복제 방식이 다르므로 적절한 StatefulSet 설정이 필요합니다.
📌 StatefulSet을 활용한 주요 데이터베이스 클러스터 비교
데이터베이스 | 클러스터 유형 | 복제 방식 | StatefulSet 운영 특징 |
MySQL | Master-Slave / Group Replication | 비동기 / 동기 복제 | 리더-팔로워 구조, 리더 장애 시 재선출 필요 |
PostgreSQL | Streaming Replication / Patroni 기반 | 비동기 / 동기 복제 | Patroni를 활용한 리더 자동 선출 권장 |
MongoDB | ReplicaSet 기반 | 동기 복제 | 3개 이상의 노드 구성 필요 |
✅ 각 데이터베이스의 복제 방식과 리더 선출 방법을 고려하여 StatefulSet을 구성해야 합니다.
3️⃣ StatefulSet을 활용한 데이터베이스 클러스터 운영 방법
✅ 1. MySQL StatefulSet 구성 (Master-Slave 방식)
MySQL은 마스터-슬레이브(Master-Slave) 복제 또는 Group Replication을 사용하여 클러스터를 구성할 수 있습니다.
StatefulSet을 활용하면 각 Pod가 고유한 Persistent Volume을 가지면서도, 마스터-슬레이브 관계를 유지할 수 있습니다.
📌 MySQL StatefulSet 예제 (Master-Slave 복제)
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
📌 MySQL 리더(마스터) 선출 확인
kubectl exec -it mysql-0 -- mysql -u root -p -e "SHOW MASTER STATUS;"
✅ MySQL에서는 mysql-0이 기본적으로 마스터로 동작하며, 슬레이브는 복제를 수행합니다.
✅ 2. PostgreSQL StatefulSet 구성 (Patroni 기반 리더 선출)
PostgreSQL은 Streaming Replication을 활용하여 리더-팔로워(Leader-Follower) 구조로 운영할 수 있습니다.
Patroni를 활용하면 장애 발생 시 자동으로 리더를 선출할 수 있습니다.
📌 PostgreSQL StatefulSet 예제 (Patroni 기반 자동 리더 선출)
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
📌 현재 리더 확인
kubectl exec -it postgres-0 -- patronictl list
✅ Patroni를 활용하면 장애 발생 시 자동으로 새로운 리더를 선출할 수 있습니다.
✅ 3. MongoDB StatefulSet 구성 (ReplicaSet 기반 클러스터)
MongoDB는 ReplicaSet을 활용하여 다중 노드 클러스터를 운영할 수 있습니다.
StatefulSet을 사용하면 각 Pod가 고유한 ID를 가지면서 자동으로 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 초기화 및 리더 확인
kubectl exec -it mongodb-0 -- mongo --eval "rs.initiate()"
kubectl exec -it mongodb-0 -- mongo --eval "rs.status()"
✅ MongoDB는 rs.initiate() 명령을 실행해야 ReplicaSet이 정상적으로 구성됩니다.
4️⃣ 데이터베이스 클러스터 운영 시 고려해야 할 사항
✅ 1. PVC 자동 확장 설정 (allowVolumeExpansion)
데이터베이스의 데이터가 증가할 경우 PVC를 자동으로 확장할 수 있도록 설정해야 합니다.
📌 StorageClass에서 PVC 자동 확장 활성화
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: database-storage
provisioner: kubernetes.io/aws-ebs
allowVolumeExpansion: true
✅ PVC 자동 확장을 설정하면 데이터베이스 운영 중에도 용량을 쉽게 확장할 수 있습니다.
✅ 2. 데이터 정합성 유지 (ReadWriteOnce vs ReadWriteMany)
StatefulSet에서 데이터 정합성을 유지하려면 ReadWriteOnce(RWO)를 사용하는 것이 일반적입니다.
📌 PVC 설정 예제 (RWO 적용)
volumeClaimTemplates:
- metadata:
name: database-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 20Gi
✅ 데이터 정합성이 중요한 데이터베이스는 ReadWriteOnce(RWO)로 PVC를 설정하는 것이 안전합니다.
🔥 5️⃣ 결론
✔ StatefulSet을 활용하면 MySQL, PostgreSQL, MongoDB 등의 데이터베이스 클러스터를 안정적으로 운영 가능
✔ Patroni, ReplicaSet 등을 활용하면 장애 발생 시 리더를 자동으로 선출 가능
✔ PVC 자동 확장을 설정하여 데이터 증가에 유연하게 대응 가능
✔ 데이터 정합성을 유지하기 위해 ReadWriteOnce(RWO)를 사용하는 것이 일반적
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [StatefulSet 심화편 #18] StatefulSet에서 Sharding(샤딩) 적용 방법 (0) | 2025.03.14 |
---|---|
📌 [StatefulSet 심화편 #17] StatefulSet에서 Read Replica(읽기 전용 복제본) 구성하기 (0) | 2025.03.14 |
📌 [StatefulSet 심화편 #15] StatefulSet의 다중 클러스터 배포 전략 (0) | 2025.03.14 |
📌 [StatefulSet 심화편 #14] StatefulSet과 동적 스토리지 프로비저닝 활용법 (0) | 2025.03.14 |
📌 [StatefulSet 심화편 #13] ReadWriteOnce(RWO) vs ReadWriteMany(RWX) 스토리지 모드 비교 및 활용 전략 (0) | 2025.03.14 |