Day 10 - MySQL Read/Write 분리 시도 및 임시 조치 (01/06)
Slave DB 연결 완료, 복제 지연 문제로 임시로 Master 사용
목차
📋 개요
배경
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-master | ExternalName | ClusterIP + Endpoints |
mysql-read | Headless | ClusterIP |
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'
원인:
- Master에 데이터 생성 (Write)
- 즉시 Slave에서 읽기 시도 (Read)
- 아직 복제 안 됨 → 없다고 판단 → 다시 생성 시도 → 중복 에러
임시 조치: 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 │ ← 대기 (향후 사용)
└─────────────┘ └─────────────┘
📝 다음 단계
코드 수정 필요 (향후)
-
await누락 수정RuntimeWarning: coroutine 'ensure_branch_page_by_login' was never awaited -
Read-Your-Own-Writes 패턴 적용
- 생성/수정 직후 읽기는
use_write_pool=True사용
- 생성/수정 직후 읽기는
-
Read를 Slave로 복원
- name: MYSQL_READ_HOSTvalue: "mysql-read" # 코드 수정 후 복원