본문으로 건너뛰기

Day 10 - MySQL Read/Write 분리 시도 및 임시 조치 (01/06)

Slave DB 연결 완료, 복제 지연 문제로 임시로 Master 사용

목차

  1. 📋 개요
  2. 🔧 해결한 문제들
  3. ⚠️ 발생한 문제
  4. ⚙️ 최종 설정
  5. 📝 다음 단계

📋 개요

배경

Day 9에서 DNS 문제로 모든 DB 연결을 Master IP로 직접 설정했습니다. 오늘은 K8s 서비스를 통해 정상적으로 DB에 연결하도록 복구했습니다.

오늘 작업 내용

작업상태
mysql-read 서비스 Headless → ClusterIP
mysql-master 서비스 ExternalName → ClusterIP+Endpoints
pista 사용자 mysql_native_password 인증
Master → Slave 스키마 동기화 자동화
Read/Write 분리 테스트⚠️ 복제 지연 문제
임시 조치: Read도 Master 사용

🔧 해결한 문제들

1. 서비스 타입 변경

서비스변경 전변경 후
mysql-masterExternalNameClusterIP + Endpoints
mysql-readHeadlessClusterIP
kubectl delete svc mysql-master mysql-read -n gition
kubectl apply -f mysql-master-svc.yaml
kubectl apply -f mysql-slave.yaml

2. MySQL 인증 방식

Slave의 pista 사용자 → mysql_native_password로 변경 (자동화 적용)

3. 초기 스키마 동기화

GTID 복제는 연결 후 변경만 동기화 → mysqldump로 초기 스키마 복사 (자동화 적용)


⚠️ 발생한 문제

복제 지연으로 인한 Duplicate Key 에러

IntegrityError: Duplicate entry for key 'branch_pages.unique_user_repo_branch'

원인:

  1. Master에 데이터 생성 (Write)
  2. 즉시 Slave에서 읽기 시도 (Read)
  3. 아직 복제 안 됨 → 없다고 판단 → 다시 생성 시도 → 중복 에러

임시 조치: Read도 Master로 전환


⚙️ 최종 설정

fastapi-deployment.yaml

- name: MYSQL_READ_HOST
value: "mysql-master" # 임시: 복제 지연 문제로 Master 사용
- name: MYSQL_WRITE_HOST
value: "mysql-master"

현재 아키텍처

┌─────────────┐
│ FastAPI │
│ Backend │
└──────┬──────┘

┌───────────┴───────────┐
│ │
READ (SELECT) WRITE (INSERT/UPDATE)
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│mysql-master │ │mysql-master │ ← 둘 다 Master로 연결
│ ClusterIP │ │ ClusterIP │
└──────┬──────┘ └──────┬──────┘
│ │
└───────────┬───────────┘

┌─────────────┐
│ Master │
│172.100.100.11│
└──────┬──────┘
│ Replication (유지)
┌───────────┴───────────┐
▼ ▼
┌─────────────┐ ┌─────────────┐
│ slave-0 │ │ slave-1 │ ← 대기 (향후 사용)
└─────────────┘ └─────────────┘

📝 다음 단계

코드 수정 필요 (향후)

  1. await 누락 수정

    RuntimeWarning: coroutine 'ensure_branch_page_by_login' was never awaited
  2. Read-Your-Own-Writes 패턴 적용

    • 생성/수정 직후 읽기는 use_write_pool=True 사용
  3. Read를 Slave로 복원

    - name: MYSQL_READ_HOST
    value: "mysql-read" # 코드 수정 후 복원

📚 참고


관련 문서

그래프 뷰

그래프 데이터 로딩 중…
현재: Day 10 - MySQL Read/Write 분리 시도 및 임시 조치 (01/06)
노드 클릭 → 이동 · 드래그 → 위치 조정