๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿฌ Day 12 - MySQL InnoDB Cluster ๊ตฌ์ถ• ๊ฐ€์ด๋“œ (Operator ๋ฐฉ์‹)

MySQL Operator for Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ ์ž๋™ํ™”๋œ InnoDB Cluster ๊ตฌ์ถ•


๋ชฉ์ฐจโ€‹

  1. ๐Ÿ“‹ ๊ฐœ์š”
  2. ๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜
  3. ๐Ÿš€ ๊ตฌ์ถ• ๊ฐ€์ด๋“œ
  4. โœ… ๊ฒ€์ฆ
  5. ๐Ÿ”ง ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
  6. ๐Ÿ“ ํŒŒ์ผ ๊ตฌ์กฐ
  7. ๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ

๐Ÿ“‹ ๊ฐœ์š”โ€‹

MySQL Operator for Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ InnoDB Cluster๋ฅผ ์ž๋™์œผ๋กœ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

์™œ Operator์ธ๊ฐ€?โ€‹

๊ตฌ๋ถ„StatefulSet (์ˆ˜๋™)MySQL Operator (์ž๋™)
ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑMySQL Shell ์ˆ˜๋™โœ… ์ž๋™
Failover์ˆ˜๋™ ๋ณต๊ตฌโœ… ์ž๋™
MySQL Router๋ณ„๋„ ๋ฐฐํฌโœ… ์ž๋™ ํฌํ•จ
๋ฐฑ์—…/๋ณต์›์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑโœ… CRD ์ œ๊ณต
์Šค์ผ€์ผ๋ง์ˆ˜๋™โœ… replicas ๋ณ€๊ฒฝ๋งŒ

์ƒ์„ธ ๋น„๊ต: ๊ธฐ์กด Docker MySQL + NFS vs InnoDB Cluster + Operatorโ€‹

๊ตฌ๋ถ„๊ธฐ์กด Docker MySQL + NFSInnoDB Cluster + Operator
MySQL ์‹คํ–‰ ๋ฐฉ์‹๋‹จ์ผ/์ˆ˜๋™ Replicationํด๋Ÿฌ์Šคํ„ฐ ๊ธฐ๋ฐ˜
Primary ์„ ์ •์‚ฌ๋žŒ์ด ์ง์ ‘ ์ง€์ •์ž๋™ ์„ ์ถœ (์ฟผ๋Ÿผ)
์žฅ์•  ๋Œ€์‘์ˆ˜๋™์ž๋™ Failover
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—ฐ๊ฒฐPrimary ์ง์ ‘ ์—ฐ๊ฒฐMySQL Router ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ
Primary ์žฅ์•  ์‹œ์„œ๋น„์Šค ์ค‘๋‹จ๋ฌด์ค‘๋‹จ ๋˜๋Š” ์ตœ์†Œ ์ค‘๋‹จ
๋ฐ์ดํ„ฐ ๋ณต์ œbinlog ๋น„๋™๊ธฐGroup Replication (๋™๊ธฐ/ํ•ฉ์˜)
Split-brain ๋ฐฉ์ง€์—†์Œ์žˆ์Œ
์Šคํ† ๋ฆฌ์ง€NFS (๊ณต์œ , SPOF)Block Storage (๊ฐœ๋ณ„ PV)
Kubernetes ์นœํ™”์„ฑ๋‚ฎ์Œ๋งค์šฐ ๋†’์Œ
์šด์˜ ๋‚œ์ด๋„๋‚ฎ์•„ ๋ณด์ด๋‚˜ ์œ„ํ—˜์ดˆ๊ธฐ ๋†’์Œ, ์šด์˜ ์•ˆ์ •
ํ”„๋กœ๋•์…˜ ์ ํ•ฉ์„ฑโŒโœ…

๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜โ€‹

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Kubernetes Cluster โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ MySQL Operator (Controller) โ”‚ โ”‚
โ”‚ โ”‚ ์ž๋™: ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ, Failover, Router ๊ด€๋ฆฌ โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚
โ”‚ โ–ผ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” ๊ฐ์‹œ/๊ด€๋ฆฌ โ”‚
โ”‚ โ”‚ MySQL Router โ”‚ โ† ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ผ์šฐํŒ… โ”‚
โ”‚ โ”‚ (2 replicas) โ”‚ :6446 (R/W), :6447 (R/O) โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ–ผ โ–ผ โ–ผ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚mysql โ”‚ โ”‚mysql โ”‚ โ”‚mysql โ”‚ โ”‚
โ”‚ โ”‚ -0 โ”‚ โ†โ”€โ”€โ”€โ†’ โ”‚ -1 โ”‚ โ†โ”€โ”€โ”€โ”€โ†’ โ”‚ -2 โ”‚ Group Replication โ”‚
โ”‚ โ”‚(R/W) โ”‚ โ”‚(R/O) โ”‚ โ”‚(R/O) โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ Persistent Volumes (๊ฐ ๋…ธ๋“œ๋ณ„) โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ํฌํŠธ ๊ตฌ์„ฑโ€‹

ํฌํŠธ์šฉ๋„
3306MySQL ํด๋ผ์ด์–ธํŠธ (์ง์ ‘ ์—ฐ๊ฒฐ)
6446MySQL Router (R/W)
6447MySQL Router (R/O)
6448MySQL Router (R/W X Protocol)
6449MySQL Router (R/O X Protocol)
33061Group Replication ํ†ต์‹ 

๐Ÿš€ ๊ตฌ์ถ• ๊ฐ€์ด๋“œโ€‹

Step 0: ๊ธฐ์กด MySQL ๋ฆฌ์†Œ์Šค ์‚ญ์ œ (๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ)โ€‹

โš ๏ธ ์ฃผ์˜: ๊ธฐ์กด Master-Slave ๊ตฌ์„ฑ์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ˆ˜ํ–‰

# ๊ธฐ์กด ๋ฆฌ์†Œ์Šค ์‚ญ์ œ
kubectl delete statefulset mysql-slave -n gition
kubectl delete svc mysql-read mysql-master -n gition
kubectl delete configmap mysql-slave-config -n gition
kubectl delete pvc -l app=mysql -n gition

Step 1: MySQL Operator ์„ค์น˜โ€‹

Helm ์‚ฌ์šฉ (๊ถŒ์žฅ)โ€‹

# Helm ์ €์žฅ์†Œ ์ถ”๊ฐ€
helm repo add mysql-operator https://mysql.github.io/mysql-operator/
helm repo update

# Operator ์„ค์น˜
helm install mysql-operator mysql-operator/mysql-operator \
--namespace mysql-operator \
--create-namespace

์„ค์น˜ ํ™•์ธโ€‹

kubectl get pods -n mysql-operator
# NAME READY STATUS RESTARTS AGE
# mysql-operator-xxxxxxxxxx-xxxxx 1/1 Running 0 1m

Step 2: Secret ์ƒ์„ฑโ€‹

# Namespace ์ƒ์„ฑ
# ์—†์„ ๊ฒฝ์šฐ
kubectl create namespace gition

# Secret ์ƒ์„ฑ (โš ๏ธ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ!)
kubectl create secret generic mysql-cluster-secret -n gition \
--from-literal=rootUser=root \
--from-literal=rootHost=% \
--from-literal=rootPassword='<STRONG_PASSWORD>'

๋˜๋Š” YAML ํŒŒ์ผ ์‚ฌ์šฉ:

kubectl apply -f k8s/mysql-cluster/02-mysql-secret.yaml

Step 3: Local PV ์ƒ์„ฑโ€‹

๊ฐ K8s Worker ๋…ธ๋“œ์—์„œ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ (k8s-m์—์„œ ์‹คํ–‰):

for node in k8s-n1 k8s-n2 k8s-n3; do
ssh $node "sudo mkdir -p /mnt/mysql-data && sudo chmod 777 /mnt/mysql-data"
done

StorageClass ๋ฐ PV ์ƒ์„ฑ:

kubectl apply -f k8s/mysql-cluster/03-local-storage.yaml

PV ์ƒํƒœ ํ™•์ธ:

kubectl get pv -l app=mysql-cluster

# NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
# mysql-pv-0 5Gi RWO Retain Available local-storage <unset> 3m34s
# mysql-pv-1 5Gi RWO Retain Available local-storage <unset> 3m34s
# mysql-pv-2 5Gi RWO Retain Available local-storage <unset> 3m34s

---

### Step 4: InnoDB Cluster ์ƒ์„ฑ

```bash
kubectl apply -f k8s/mysql-cluster/04-innodb-cluster.yaml

ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ ํ™•์ธโ€‹

## InnoDBCluster ๋ฆฌ์†Œ์Šค ํ™•์ธ
kubectl get innodbcluster -n gition

## Pod ์ƒํƒœ ํ™•์ธ (3๊ฐœ MySQL + 2๊ฐœ Router)
kubectl get pods -n gition -l mysql.oracle.com/cluster=mysql-cluster
## NAME READY STATUS RESTARTS AGE
## mysql-cluster-0 2/2 Running 0 3m
## mysql-cluster-1 2/2 Running 0 3m
## mysql-cluster-2 0/2 Init:0/3 0 3m

## ์ƒ์„ธ ์ƒํƒœ
kubectl describe innodbcluster mysql-cluster -n gition

โณ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์™„์ „ํžˆ ์ค€๋น„๋˜๋Š” ๋ฐ ์•ฝ 5-10๋ถ„ ์†Œ์š”


Step 5: DB ์Šคํ‚ค๋งˆ ์ดˆ๊ธฐํ™”โ€‹

ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ONLINE ์ƒํƒœ๊ฐ€ ๋˜๋ฉด:

kubectl apply -f k8s/mysql-cluster/05-app-user.yaml

Job ์ƒํƒœ ํ™•์ธ:

kubectl get jobs -n gition
kubectl logs job/mysql-init-schema -n gition

Step 6: ์ž๋™ ๋ฐฑ์—… ์„ค์ • (์„ ํƒ)โ€‹

NFS์— ๋งค์ผ 02:00 mysqldump ๋ฐฑ์—…:

kubectl apply -f k8s/mysql-cluster/06-mysql-backup.yaml

CronJob ํ™•์ธ:

kubectl get cronjob -n gition
## NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
## mysql-backup 0 17 * * * False 0 <none> 1m

Step 7: Backend ๋ฐฐํฌโ€‹

โš ๏ธ ์ฃผ์˜: ๊ธฐ์กด fastapi-deployment.yaml ์‚ญ์ œ ํ•„์š”

## ๊ธฐ์กด ๋ฐฐํฌ ์‚ญ์ œ
kubectl delete -f k8s/fastapi-deployment.yaml -n gition 2>/dev/null || true

## ์ƒˆ Backend ๋ฐฐํฌ (MySQL Cluster ์—ฐ๋™)
kubectl apply -f k8s/mysql-cluster/07-backend-deployment.yaml

Backend ์ƒํƒœ ํ™•์ธ:

kubectl get pods -n gition -l app=api
kubectl logs -n gition -l app=api --tail=20

Step 8: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—ฐ๊ฒฐ ์„ค์ •โ€‹

์—ฐ๊ฒฐ ์ •๋ณดโ€‹

์šฉ๋„ํ˜ธ์ŠคํŠธํฌํŠธ
R/W (์“ฐ๊ธฐ)mysql-cluster6446
R/O (์ฝ๊ธฐ)mysql-cluster6447

FastAPI ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์˜ˆ์‹œโ€‹

env:
- name: MYSQL_WRITE_HOST
value: "mysql-cluster"
- name: MYSQL_WRITE_PORT
value: "6446"
- name: MYSQL_READ_HOST
value: "mysql-cluster"
- name: MYSQL_READ_PORT
value: "6447"

โœ… ๊ฒ€์ฆโ€‹

ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ ํ™•์ธโ€‹

## InnoDBCluster ์ƒํƒœ
kubectl get innodbcluster -n gition -o wide

## ์ถœ๋ ฅ ์˜ˆ์‹œ:
## NAME STATUS ONLINE INSTANCES ROUTERS AGE
## mysql-cluster ONLINE 3 3 2 10m

Primary ๋…ธ๋“œ ํ™•์ธโ€‹

## Router๋ฅผ ํ†ตํ•ด Primary ํ™•์ธ (6446 = R/W = Primary)
kubectl exec -it mysql-cluster-0 -n gition -c mysql -- \
mysql -h mysql-cluster -P 6446 -uroot -p -e "SELECT @@hostname"

## ๋ชจ๋“  ๋ฉค๋ฒ„ ์—ญํ•  ํ™•์ธ
kubectl exec -it mysql-cluster-0 -n gition -c mysql -- \
mysql -uroot -p -e "SELECT member_host, member_role FROM performance_schema.replication_group_members"

## ์ถœ๋ ฅ ์˜ˆ์‹œ:
## +-----------------------------------------------+-------------+
## | member_host | member_role |
## +-----------------------------------------------+-------------+
## | mysql-cluster-0.mysql-cluster.gition.svc... | PRIMARY |
## | mysql-cluster-1.mysql-cluster.gition.svc... | SECONDARY |
## | mysql-cluster-2.mysql-cluster.gition.svc... | SECONDARY |
## +-----------------------------------------------+-------------+

MySQL ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธโ€‹

## R/W ์—ฐ๊ฒฐ (Primary)
kubectl exec -it mysql-cluster-0 -n gition -c mysql -- \
mysql -h mysql-cluster -P 6446 -uroot -p -e "SELECT @@hostname, @@read_only"

## R/O ์—ฐ๊ฒฐ (Secondary)
kubectl exec -it mysql-cluster-0 -n gition -c mysql -- \
mysql -h mysql-cluster -P 6447 -uroot -p -e "SELECT @@hostname, @@read_only"

์ž๋™ Failover ํ…Œ์ŠคํŠธโ€‹

1. ํ˜„์žฌ Primary ํ™•์ธโ€‹

ํ˜„์žฌ ์–ด๋–ค ๋…ธ๋“œ๊ฐ€ Primary์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

kubectl exec -it mysql-cluster-0 -n gition -c mysql -- \
mysql -uroot -p -e "SELECT member_host, member_role FROM performance_schema.replication_group_members"

2. Primary Pod ์‚ญ์ œโ€‹

Primary ๋…ธ๋“œ๋ฅผ ๊ฐ•์ œ ์‚ญ์ œํ•˜์—ฌ ์žฅ์•  ์ƒํ™ฉ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

## Primary๊ฐ€ mysql-cluster-2์ด๋ผ๊ณ  ๊ฐ€์ •
kubectl delete pod mysql-cluster-2 -n gition

3. Failover ๋ชจ๋‹ˆํ„ฐ๋ง (์•ฝ 30์ดˆ~1๋ถ„)โ€‹

MySQL Operator๊ฐ€ ์ž๋™์œผ๋กœ ์ƒˆ Primary๋ฅผ ์„ ์ถœํ•˜๋Š” ๊ณผ์ •์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

## Pod ์ƒํƒœ ์‹ค์‹œ๊ฐ„ ํ™•์ธ
kubectl get pods -n gition -l mysql.oracle.com/cluster=mysql-cluster -w

## ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ ํ™•์ธ
kubectl get innodbcluster -n gition

4. ์ƒˆ Primary ํ™•์ธโ€‹

Failover ์™„๋ฃŒ ํ›„ ์ƒˆ๋กœ์šด Primary๊ฐ€ ์„ ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

## mysql-cluster-1์—์„œ ํ™•์ธ (0์ด ์žฌ์‹œ์ž‘ ์ค‘์ด๋ฏ€๋กœ)
kubectl exec -it mysql-cluster-1 -n gition -c mysql -- \
mysql -uroot -p -e "SELECT member_host, member_role FROM performance_schema.replication_group_members"

์˜ˆ์ƒ ๊ฒฐ๊ณผโ€‹

Before:

mysql-cluster-0 โ†’ PRIMARY
mysql-cluster-1 โ†’ SECONDARY
mysql-cluster-2 โ†’ SECONDARY

After (mysql-cluster-0 ์‚ญ์ œ ํ›„):

mysql-cluster-1 โ†’ PRIMARY โ† ์ž๋™ ์Šน๊ฒฉ!
mysql-cluster-2 โ†’ SECONDARY
mysql-cluster-0 โ†’ (์žฌ์‹œ์ž‘ ํ›„) SECONDARY

โœ… ์ž๋™ Failover ์„ฑ๊ณต ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ MySQL Router๋ฅผ ํ†ตํ•ด ๋ฌด์ค‘๋‹จ์œผ๋กœ ์ƒˆ Primary์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ”ง ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…โ€‹

Operator๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์Œโ€‹

## CRD ํ™•์ธ
kubectl get crd innodbclusters.mysql.oracle.com

## ์—†์œผ๋ฉด ์žฌ์„ค์น˜
kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-operator/trunk/deploy/deploy-crds.yaml

ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ PENDING ์ƒํƒœโ€‹

## ์ด๋ฒคํŠธ ํ™•์ธ
kubectl describe innodbcluster mysql-cluster -n gition

## Pod ๋กœ๊ทธ ํ™•์ธ
kubectl logs mysql-cluster-0 -n gition -c mysql
kubectl logs mysql-cluster-0 -n gition -c sidecar

StorageClass ๋ฌธ์ œโ€‹

## StorageClass ํ™•์ธ
kubectl get sc

## PVC ์ƒํƒœ ํ™•์ธ
kubectl get pvc -n gition

Router ์—ฐ๊ฒฐ ์‹คํŒจโ€‹

## Router Pod ํ™•์ธ
kubectl get pods -n gition -l component=router

## Router ๋กœ๊ทธ
kubectl logs -l component=router -n gition

๐Ÿ“ ํŒŒ์ผ ๊ตฌ์กฐโ€‹

day12-0108/
โ”œโ”€โ”€ README.md # ์ด ๋ฌธ์„œ
โ””โ”€โ”€ k8s/
โ””โ”€โ”€ mysql-cluster/
โ”œโ”€โ”€ 01-mysql-operator.yaml # [Step 1] Operator ์„ค์น˜ ๊ฐ€์ด๋“œ
โ”œโ”€โ”€ 02-mysql-secret.yaml # [Step 2] Secret (๋น„๋ฐ€๋ฒˆํ˜ธ)
โ”œโ”€โ”€ 03-local-storage.yaml # [Step 3] Local PV StorageClass
โ”œโ”€โ”€ 04-innodb-cluster.yaml # [Step 4] InnoDBCluster CR
โ”œโ”€โ”€ 05-app-user.yaml # [Step 5] ์Šคํ‚ค๋งˆ ์ดˆ๊ธฐํ™” Job
โ”œโ”€โ”€ 06-mysql-backup.yaml # [Step 6] ์ž๋™ ๋ฐฑ์—… CronJob (NFS)
โ””โ”€โ”€ 07-backend-deployment.yaml # [Step 7] Backend API Deployment

๋ฐฐํฌ ์ˆœ์„œโ€‹

## 1. Operator ์„ค์น˜ (ํ•œ ๋ฒˆ๋งŒ)
helm install mysql-operator mysql-operator/mysql-operator -n mysql-operator --create-namespace

## 2. Secret
kubectl apply -f k8s/mysql-cluster/02-mysql-secret.yaml

## 3. Local PV
kubectl apply -f k8s/mysql-cluster/03-local-storage.yaml

## 4. InnoDB Cluster
kubectl apply -f k8s/mysql-cluster/04-innodb-cluster.yaml

## 5. ์Šคํ‚ค๋งˆ ์ดˆ๊ธฐํ™” (ํด๋Ÿฌ์Šคํ„ฐ ONLINE ํ›„)
kubectl apply -f k8s/mysql-cluster/05-app-user.yaml

## 6. ๋ฐฑ์—… CronJob (์„ ํƒ)
kubectl apply -f k8s/mysql-cluster/06-mysql-backup.yaml

## 7. Backend ๋ฐฐํฌ (๊ธฐ์กด fastapi-deployment.yaml ์‚ญ์ œ ํ•„์š”)
kubectl apply -f k8s/mysql-cluster/07-backend-deployment.yaml

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒโ€‹


๊ด€๋ จ ๋ฌธ์„œโ€‹

๊ทธ๋ž˜ํ”„ ๋ทฐ

โ€ฆ
๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์ค‘โ€ฆ
ํ˜„์žฌ: ๐Ÿฌ Day 12 - MySQL InnoDB Cluster ๊ตฌ์ถ• ๊ฐ€์ด๋“œ (Operator ๋ฐฉ์‹)
๋…ธ๋“œ ํด๋ฆญ โ†’ ์ด๋™ ยท ๋“œ๋ž˜๊ทธ โ†’ ์œ„์น˜ ์กฐ์ •