π Day 7: DB Replication (Master-Slave)
π Day 7: DB Replication (Master-Slave)
Kubernetes νκ²½μμ MySQL Master-Slave 볡μ ꡬ쑰 ꡬμ±
λͺ©μ°¨β
ποΈ κ°μβ
Kubernetes νκ²½μμ MySQL Master-Slave 볡μ ꡬ쑰λ₯Ό ꡬμ±ν©λλ€.
| μν | νκ²½ | μ€λͺ |
|---|---|---|
| Master | Docker Compose (VM) | λ°μ΄ν° μ°κΈ°(Write) λ° λ°μ΄λ리 λ‘κ·Έ μμ± |
| Slave | Kubernetes StatefulSet | λ°μ΄ν° μ½κΈ°(Read) λ° μλ λκΈ°ν |
ποΈ κ΅¬μ±β
| κ΅¬μ± μμ | κ²½λ‘ |
|---|---|
| Master | on-premise-ict/day7-1221/mysql/docker-compose.yml |
| Slave | on-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"