Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #30] StatefulSet을 활용한 고성능 데이터 저장소 운영 전략

ygtoken 2025. 3. 15. 11:24
728x90

1️⃣ 개요

 

StatefulSet은 데이터 영속성을 유지하면서 확장 가능한 애플리케이션을 배포하는 데 최적화된 Kubernetes 리소스입니다.

특히, 대용량 데이터를 다루는 데이터베이스(MySQL, PostgreSQL), 메시지 브로커(Kafka, RabbitMQ), 분산 저장소(Elasticsearch, Ceph) 등의 운영에서는 성능 최적화가 필수적입니다.

 

이번 글에서는 StatefulSet을 활용하여 고성능 데이터 저장소를 운영하는 전략과 튜닝 방법을 정리하겠습니다. 🚀

 


2️⃣ StatefulSet을 활용한 데이터 저장소 운영 시 고려해야 할 사항

 

📌 StatefulSet 기반 데이터 저장소 운영 시 주요 고려 사항

항목 설명 최적화 방법
스토리지 IOPS 데이터베이스나 로그 저장소의 입출력 성능 고성능 디스크(NVMe, SSD) 활용
데이터 복제 데이터 손실 방지를 위한 복제 설정 Read Replica 또는 Sharding 적용
네트워크 성능 다중 노드 간 빠른 데이터 동기화 필요 Multi-AZ, Direct I/O 설정
Pod 간 데이터 정합성 데이터 일관성을 유지해야 함 Pod Anti-Affinity 및 Leader Election 활용

이러한 요소를 고려하여 StatefulSet 기반 데이터 저장소를 최적화해야 합니다.

 


3️⃣ StatefulSet의 스토리지 성능 최적화 전략

 

✅ 1. 고성능 스토리지(NVMe, SSD) 활용

 

📌 고성능 디스크(NVMe, SSD)를 사용하면 IO 성능이 대폭 향상됩니다.

 

📌 고성능 디스크를 지원하는 StorageClass 설정 예제

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:
  type: io1
  iopsPerGB: "50"
  fsType: ext4
allowVolumeExpansion: true

 

📌 StatefulSet에서 고성능 StorageClass 사용

volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "fast-storage"
      resources:
        requests:
          storage: 100Gi

NVMe 또는 SSD를 사용하면 데이터베이스 및 로그 저장소의 입출력 성능을 극대화할 수 있습니다.

 


✅ 2. Persistent Volume을 Multiple Read/Write 지원하는 스토리지로 변경

 

📌 NFS, CephFS와 같은 ReadWriteMany(RWX) 지원 스토리지 사용

apiVersion: v1
kind: PersistentVolume
metadata:
  name: cephfs-pv
spec:
  capacity:
    storage: 500Gi
  accessModes:
    - ReadWriteMany
  cephfs:
    monitors:
      - "192.168.1.10:6789"
    path: "/"
    secretRef:
      name: ceph-secret

이제 다중 노드에서도 동일한 데이터 저장소를 공유할 수 있습니다.

 


✅ 3. PVC 크기 자동 확장 설정

 

📌 StatefulSet PVC 크기 동적 확장 설정 예제

persistentVolumeClaimRetentionPolicy:
  whenDeleted: Retain
  whenScaled: Retain

 

📌 PVC 크기 변경 명령어

kubectl patch pvc data-mysql-0 -p '{"spec":{"resources":{"requests":{"storage":"200Gi"}}}}'

데이터 증가 시 PVC를 자동 확장하여 성능 저하를 방지할 수 있습니다.

 


4️⃣ 데이터베이스 운영 최적화 (MySQL, PostgreSQL, MongoDB)

 

✅ 1. Read Replica를 활용한 부하 분산

 

📌 MySQL StatefulSet에서 Read Replica 구성 예제

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  replicas: 3
  serviceName: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:8
          args: ["--server-id=1", "--log-bin=mysql-bin"]

 

📌 Replica 설정 적용

kubectl exec -it mysql-1 -- mysql -e "CHANGE MASTER TO MASTER_HOST='mysql-0.mysql', MASTER_USER='replication', MASTER_PASSWORD='password'; START SLAVE;"

읽기 요청을 Replica 노드로 분산하면 성능을 최적화할 수 있습니다.

 


✅ 2. 데이터 샤딩(Sharding) 적용

 

📌 MongoDB Sharded Cluster 구성 예제

sh.addShard("shard1/mongodb-0.mongodb:27017")
sh.addShard("shard2/mongodb-1.mongodb:27017")

샤딩을 적용하면 데이터 분산이 가능하여 대규모 트래픽을 처리할 수 있습니다.

 


5️⃣ StatefulSet 네트워크 최적화

 

✅ 1. Pod Anti-Affinity를 활용한 분산 배포

 

📌 동일한 노드에 StatefulSet Pod가 몰리지 않도록 설정

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: mysql
        topologyKey: "kubernetes.io/hostname"

Pod가 서로 다른 노드에서 실행되도록 강제하여, 성능과 안정성을 확보할 수 있습니다.

 


✅ 2. Multi-AZ 배포를 통한 네트워크 성능 최적화

 

📌 Multi-AZ에 StatefulSet을 배포하면 AZ 장애 시에도 서비스가 지속됩니다.

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
                - us-east-1a
                - us-east-1b

AZ 장애 발생 시에도 StatefulSet이 자동으로 복구됩니다.

 


6️⃣ StatefulSet 장애 복구 및 데이터 보호 전략

 

✅ 1. Velero를 활용한 StatefulSet 백업 및 복구

 

📌 Velero를 사용하여 StatefulSet 데이터 백업

velero backup create mysql-backup --include-namespaces=default

 

📌 백업된 데이터 복구

velero restore create --from-backup mysql-backup

Velero를 활용하면 StatefulSet 데이터를 안전하게 백업하고 복구할 수 있습니다.

 


✅ 2. StatefulSet Pod 강제 재배치 및 복구

 

📌 장애 발생 노드에서 Pod 강제 제거

kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data

 

📌 새로운 노드에서 Pod 실행 확인

kubectl get pods -o wide

장애가 발생한 노드에서 StatefulSet Pod를 자동으로 복구할 수 있습니다.

 


🔥 7️⃣ 결론

 

고성능 스토리지(NVMe, SSD)를 활용하면 StatefulSet의 IO 성능을 극대화할 수 있음

Persistent Volume을 ReadWriteMany(RWX) 지원 스토리지로 변경하면 다중 노드 간 데이터 공유 가능

Read Replica 및 Sharding을 활용하면 데이터베이스 부하를 분산할 수 있음

Pod Anti-Affinity 및 Multi-AZ 배포를 통해 네트워크 성능을 최적화 가능

Velero를 활용한 데이터 백업 및 복구 전략을 적용하여 안정성을 확보해야 함

728x90