본문으둜 κ±΄λ„ˆλ›°κΈ°

πŸ“… Day 7: DB Replication (Master-Slave)

πŸ“… Day 7: DB Replication (Master-Slave)

Kubernetes ν™˜κ²½μ—μ„œ MySQL Master-Slave 볡제 ꡬ쑰 ꡬ성


λͺ©μ°¨β€‹

  1. πŸ—„οΈ κ°œμš”
  2. πŸ—οΈ ꡬ성
  3. πŸš€ λΉ λ₯Έ μ‹œμž‘
  4. πŸ”§ νŠΈλŸ¬λΈ”μŠˆνŒ…

πŸ—„οΈ κ°œμš”β€‹

Kubernetes ν™˜κ²½μ—μ„œ MySQL Master-Slave 볡제 ꡬ쑰λ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.

μ—­ν• ν™˜κ²½μ„€λͺ…
MasterDocker Compose (VM)데이터 μ“°κΈ°(Write) 및 λ°”μ΄λ„ˆλ¦¬ 둜그 생성
SlaveKubernetes StatefulSet데이터 읽기(Read) 및 μžλ™ 동기화

πŸ—οΈ ꡬ성​

ꡬ성 μš”μ†Œκ²½λ‘œ
Masteron-premise-ict/day7-1221/mysql/docker-compose.yml
Slaveon-premise-ict/day7-1221/mysql/mysql-slave-statefullset.yaml

πŸš€ λΉ λ₯Έ μ‹œμž‘β€‹

0️⃣ 사전 μ€€λΉ„ (Pre-requisites)​

StatefulSetμ—μ„œ μ‚¬μš©ν•  hostPath 디렉토리λ₯Ό λͺ¨λ“  μΏ λ²„λ„€ν‹°μŠ€ λ…Έλ“œμ—μ„œ 생성:

# λͺ¨λ“  λ…Έλ“œμ—μ„œ μ‹€ν–‰
for node in k8s-n1 k8s-n2 k8s-n3; do
ssh $node "sudo mkdir -p /mnt/mysql-data-0 /mnt/mysql-data-1 && sudo chmod -R 777 /mnt/mysql-data-0 /mnt/mysql-data-1"
done

1️⃣ Master μ„€μ • (VM - Docker Compose)​

1-1. 디렉토리 생성​

mkdir -p ~/mysql/config ~/mysql/data ~/mysql/initdb.d ~/mysql/logs
sudo chown -R 999:999 ~/mysql/data ~/mysql/logs

1-2. μ„€μ • 파일 볡사​

cp on-premise-ict/day7-1221/mysql/my.cnf ~/mysql/config/
cp on-premise-ict/day7-1221/mysql/docker-compose.yml ~/mysql/

1-3. μ΄ˆκΈ°ν™” SQL 생성​

cd ~/mysql/initdb.d
cp on-premise-ict/day7-1221/mysql/.env ~/mysql/
export $(grep -v '^#' ~/mysql/.env | xargs)

cat <<EOF > setup.sql
CREATE USER '${USER_NAME}'@'%' IDENTIFIED WITH mysql_native_password BY '${USER_PASSWORD}';
GRANT ALL PRIVILEGES ON *.* TO '${USER_NAME}'@'%' WITH GRANT OPTION;
CREATE USER '${REPL_NAME}'@'%' IDENTIFIED WITH mysql_native_password BY '${REPL_PASSWORD}';
GRANT REPLICATION SLAVE ON *.* TO '${REPL_NAME}'@'%';
FLUSH PRIVILEGES;
EOF

1-4. μ»¨ν…Œμ΄λ„ˆ 싀행​

cd ~/mysql
docker compose up -d

2️⃣ Slave 배포 (Kubernetes - StatefulSet)​

cd ~/mysql
export $(grep -v '^#' .env | xargs)
envsubst < mysql-slave-statefullset.yaml | kubectl apply -f -

[!NOTE] GTID λ³΅μ œλŠ” Master에 μ΅œμ†Œ ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄ μžˆμ–΄μ•Ό 정상 λ™μž‘ν•©λ‹ˆλ‹€.

-- Masterμ—μ„œ ν…ŒμŠ€νŠΈ DB 생성
CREATE DATABASE test_db;

3️⃣ 볡제 확인​

# Slave νŒŒλ“œ 접속
kubectl exec -it mysql-slave-0 -- mysql -u root -p${ROOT_PASSWORD}

# MySQL λ‚΄λΆ€μ—μ„œ 확인
SHOW SLAVE STATUS\G

4️⃣ Slave-1 server-id λ³€κ²½ (Replicas > 1)​

StatefulSet의 Replicasκ°€ 2 이상인 경우:

kubectl exec -it mysql-slave-1 -- mysql -u root -p${ROOT_PASSWORD}
SET GLOBAL server_id = 3;
STOP SLAVE;
START SLAVE;
SHOW SLAVE STATUS\G

πŸ”§ νŠΈλŸ¬λΈ”μŠˆνŒ…β€‹

Slave μ‚­μ œ ν›„ μž¬λ°°ν¬β€‹

1. κΈ°μ‘΄ λ¦¬μ†ŒμŠ€ μ‚­μ œ

kubectl delete pv mysql-pv-0 mysql-pv-1
kubectl delete statefulset mysql-slave
kubectl delete svc mysql-slave-svc mysql-master-svc
kubectl delete configmap mysql-slave-config
kubectl delete pvc --all # ⚠️ 주의: 데이터 μ‚­μ œλ¨

# 호슀트 데이터 μ‚­μ œ
for node in k8s-n1 k8s-n2 k8s-n3; do
ssh $node "sudo rm -rf /mnt/mysql-data-0/* /mnt/mysql-data-1/*"
done

2. .env μˆ˜μ • ν›„ 재배포

cd ~/mysql
vim .env # MASTER_IP λ“± μˆ˜μ •
export $(grep -v '^#' .env | xargs)
envsubst < mysql-slave-statefullset.yaml | kubectl apply -f -
kubectl get all

3. 볡제 μƒνƒœ 확인

kubectl exec -it mysql-slave-0 -- mysql -u root -p${ROOT_PASSWORD} -e "SHOW SLAVE STATUS\G"
# λ˜λŠ”
kubectl exec -it mysql-slave-0 -- mysql -u root -p${ROOT_PASSWORD} -e "STOP SLAVE; START SLAVE; SHOW SLAVE STATUS\G"

κ΄€λ ¨ λ¬Έμ„œβ€‹

κ·Έλž˜ν”„ λ·°

…
κ·Έλž˜ν”„ 데이터 λ‘œλ”© 쀑…
ν˜„μž¬: πŸ“… Day 7: DB Replication (Master-Slave)
λ…Έλ“œ 클릭 β†’ 이동 Β· λ“œλž˜κ·Έ β†’ μœ„μΉ˜ μ‘°μ •