Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #17] StatefulSet에서 Read Replica(읽기 전용 복제본) 구성하기

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

 

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가 정상적으로 동작하는지 지속적으로 모니터링해야 함

728x90