Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #6] StatefulSet의 장애 복구와 데이터 정합성 유지 전략

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

 

1️⃣ 개요

 

StatefulSet은 데이터를 저장하는 애플리케이션(예: 데이터베이스, 메시지 브로커, 분산 캐시 시스템 등) 에 사용되기 때문에, 장애 발생 시 데이터 정합성을 유지하면서 복구하는 것이 매우 중요합니다.

일반적인 Deployment와 달리 StatefulSet은 Pod가 장애로 인해 종료되더라도, 기존 데이터를 유지하면서 다시 정상적으로 복구될 수 있도록 설계되어야 합니다.

 

이번 글에서는 StatefulSet의 장애 복구 과정과, 데이터 정합성을 유지하는 방법을 정리하겠습니다. 🚀

 


2️⃣ StatefulSet의 장애 유형과 복구 방법

 

✅ 1. StatefulSet에서 발생할 수 있는 장애 유형

 

StatefulSet 환경에서 발생할 수 있는 대표적인 장애 유형은 다음과 같습니다.

 

장애 유형 설명 주요 해결 방법
Pod 장애 특정 Pod가 비정상 종료됨 kubectl delete pod 후 재시작
PVC 장애 Persistent Volume이 손상됨 kubectl delete pod 후 PV 재마운트
Node 장애 특정 노드가 비정상 종료됨 StatefulSet이 자동으로 다른 노드에서 복구
데이터 불일치 클러스터 내 데이터 정합성이 깨짐 백업 복원 또는 리플리케이션 재설정

각 장애 상황별로 적절한 복구 방법을 적용해야 데이터 손실을 방지할 수 있습니다.

 


3️⃣ Pod 장애 복구 방법

 

StatefulSet의 Pod가 장애로 인해 종료되었을 경우, 쿠버네티스는 자동으로 새로운 Pod를 생성합니다.

하지만, PVC가 정상적으로 연결되지 않으면 데이터가 손실될 가능성이 있습니다.

 

📌 비정상 종료된 Pod 강제 삭제 후 복구

kubectl delete pod mysql-1

 

📌 Pod 상태 확인 (재시작 여부 체크)

kubectl get pods -l app=mysql

StatefulSet의 Pod는 삭제되더라도 기존 PVC를 유지하면서 자동으로 재시작됩니다.

 


4️⃣ Persistent Volume 장애 복구 방법

 

StatefulSet에서 PVC(Persistent Volume Claim)가 손상되었을 경우, PVC를 삭제하고 다시 생성해야 합니다.

하지만 PVC를 삭제하면 데이터도 함께 삭제될 수 있으므로 주의해야 합니다.

 

📌 PVC 삭제 전 기존 Persistent Volume 확인

kubectl get pvc

 

📌 특정 PVC 강제 삭제 (데이터 삭제됨 - 주의 필요)

kubectl delete pvc mysql-data-mysql-1

 

📌 StatefulSet Pod를 다시 시작하여 PVC를 재생성

kubectl delete pod mysql-1

PVC를 삭제하면 PV도 함께 삭제될 수 있으므로, 중요 데이터가 있는 경우 백업을 반드시 수행해야 합니다.

 


5️⃣ 노드 장애 복구 방법

 

StatefulSet은 특정 노드에서 실행 중인 Pod가 장애를 일으킬 경우, 다른 노드에서 자동으로 복구됩니다.

하지만 Persistent Volume이 특정 노드에 종속되어 있으면 다른 노드에서 복구되지 않을 수도 있습니다.

 

📌 현재 실행 중인 Pod와 노드 정보 확인

kubectl get pods -o wide

 

📌 비정상 노드에서 실행 중인 Pod 강제 재배치

kubectl cordon 노드이름  # 해당 노드 스케줄링 차단
kubectl drain 노드이름 --ignore-daemonsets --delete-emptydir-data

 

📌 Pod가 다른 노드에서 정상적으로 실행되는지 확인

kubectl get pods -o wide

Persistent Volume이 특정 노드에 고정되지 않도록 StorageClass에서 동적 프로비저닝을 활성화하면 장애 발생 시 다른 노드에서 자동 복구가 가능합니다.

 


6️⃣ 데이터 정합성 유지 방법

 

StatefulSet을 운영할 때, 데이터 불일치 문제가 발생하지 않도록 주의해야 합니다.

대표적인 데이터 정합성 문제와 해결 방법을 정리하면 다음과 같습니다.

 

✅ 1. 리더-팔로워(마스터-슬레이브) 데이터 정합성 유지

MySQL, PostgreSQL과 같은 데이터베이스는 리더(마스터) 노드가 다운되었을 때 새로운 리더를 선출해야 합니다.

리더 선출이 자동으로 이루어지지 않으면, 수동으로 새로운 리더를 지정해야 합니다.

 

📌 MySQL에서 리더 상태 확인

kubectl exec -it mysql-0 -- mysql -u root -p -e "SHOW SLAVE STATUS\G"

 

📌 새로운 리더를 강제로 지정

kubectl exec -it mysql-1 -- mysql -u root -p -e "RESET MASTER"

리더 노드가 변경될 경우 애플리케이션이 새로운 리더를 참조하도록 설정해야 합니다.

 


✅ 2. Kafka, Elasticsearch 같은 분산 저장소의 데이터 정합성 유지

Kafka, Elasticsearch 등의 분산 저장소는 데이터 노드가 사라지면, 자동으로 리플리케이션을 재설정해야 합니다.

특정 노드가 다운되면, 데이터 균형이 무너질 수 있으므로 리밸런싱 작업을 수행해야 합니다.

 

📌 Kafka에서 파티션 재할당 실행

kubectl exec -it kafka-0 -- kafka-reassign-partitions --zookeeper zookeeper:2181 --reassignment-json-file rebalance.json

 

📌 Elasticsearch에서 데이터 리밸런싱 활성화

curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d '{
  "transient": {
    "cluster.routing.allocation.enable": "all"
  }
}'

데이터 정합성이 유지되도록 모니터링 시스템을 활용하여 이상 징후를 감지해야 합니다.

 


7️⃣ StatefulSet 장애 복구를 위한 모니터링 전략

 

장애 발생을 사전에 감지하고 대응하려면 Prometheus, Grafana, Loki, EFK(Elasticsearch + Fluentd + Kibana) 등의 모니터링 시스템을 활용해야 합니다.

 

📌 StatefulSet Pod 상태 실시간 모니터링 (Prometheus 활용)

kubectl top pods

 

📌 로그 분석을 위한 Fluentd 설정 예제

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-config
data:
  fluent.conf: |
    <source>
      @type tail
      path /var/log/containers/*.log
      pos_file /var/log/fluentd-containers.log.pos
      tag kubernetes.*
      format json
    </source>

모니터링 시스템을 활용하면 장애 발생 전 징후를 감지하고, 빠르게 대응할 수 있습니다.

 


🔥 8️⃣ 결론

 

StatefulSet은 Pod가 재시작되더라도 PVC를 유지하면서 자동으로 복구됨

Persistent Volume 장애 발생 시 삭제 후 PVC를 재생성해야 함

노드 장애 발생 시 kubectl cordon과 kubectl drain을 활용하여 Pod를 다른 노드로 이동 가능

리더-팔로워 기반 데이터베이스는 리더 선출이 자동으로 이루어지는지 확인해야 함

Kafka, Elasticsearch 같은 분산 저장소는 리밸런싱 작업을 통해 데이터 정합성을 유지해야 함

Prometheus, Fluentd, Grafana 등을 활용하여 장애 모니터링을 수행해야 함

728x90