Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #16] StatefulSet을 활용한 데이터베이스 클러스터 운영 (MySQL, PostgreSQL, MongoDB)

ygtoken 2025. 3. 14. 10:16
728x90

 

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)를 사용하는 것이 일반적

728x90