2021. 12. 20. 15:26ㆍDev
이번 글에서는 MySQL의 이중화 (HA: High Availability) 를 구성해보도록 한다.
일반적인 어플리케이션은 DB Host 를 한가지만 지정해서 DB와 연결한다. 즉 DB를 이중화를 하든 삼중화를 하든 100중화를 하든 어플리케이션 단에서는 DB의 단일 IP로만 연결하는게 일반적이라는 것이다. (Laravel 등에서 Read / Write 를 나누어서 복수의 DB Host 를 연결할 수 있는 기능을 제공하기는 하는데, 일반적인 백엔드 어플리케이션은 단일 IP로 연결하는게 대부분이다) 어플리케이션 단에서 DB가 이중화가 되어있냐 등을 고려해서 코딩을 해야한다면, 어플리케이션 ~ DB 층이 커플링 되어버려 유연한 아키텍처를 구성하기가 힘들어진다.
DB 이중화는 생각만큼 간단하지 않다. VIP (Virtual IP) 등 준비해야 할 사항도 있으며, DB 설정 등 할게 많다. Public Cloud 의 DB SaaS 를 쓰면 끝나는 얘기지만, Private 등에서 환경을 구축해야 하는 상황이라면 직접 DB 이중화를 해야할 필요가 있다. 나도 Private 환경에서 직접 MySQL 이중화 환경을 구성해야 할 필요가 있어서 그 삽질했던 내용을 여기에 공유하며, 부디 여러분들은 이 글을 읽으시고 시간을 절약하시기 바란다.
준비사항
- VM 3대 (Ubuntu 20.04)
- VM1 (MySQL DB): 172.34.117.175
- VM2 (MySQL DB): 172.34.117.103
- VIP 1개 (floating IP)
- 172.34.117.241
구축해볼 내용
몇가지 중요한 포인트를 설명하자면,
- VM1과 VM2에 각각 MySQL Server 를 설치한다. 나같은 경우는 MySQL Server 를 직접설치하기 귀찮아서 Docker 를 통해서 설치했다. 여기서 VM1은 Master 노드로 쓸 것이고, VM2는 Slave 서버로 구성할 것이다.
- Keepalived 는 Virtual IP 를 사용하여 하나의 Master 노드를 모니터링 하다가 장애가 발생했을 경우, Slave 서버로 Fail Over 되도록 해주는 툴이다. 우리는 이것을 VM1, VM2 에 설치할 것이다.
- Orchestrator 는 MySQL HA 구성과 Replication 관리를 도와주는 툴이다. 이 툴을 통해 Master 노드에서 장애가 났을 경우에는 자동으로 Slave 를 승격시키도록 할 것이다. 이것 역시도 Docker 를 통해서 설치한다.
keepalived 설치
아래 과정을 VM1, VM2 동일하게 해준다.
keepalived 의 설정파일은 여러가지가 가능하겠지만 가장 기본적인 것만 설명하도록 하겠다.
Ubuntu 20.04 에서 설치를 시작한다.
sudo apt install keepalived
설정 파일 작성
여기서 172.34.117.241 은 VIP 이며, interface 는 ifconfig 등을 확인하여 넣어준다.
/etc/keepalived/keepalived.conf
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_mysql {
script "/etc/keepalived/mysqltest.sh"
interval 2
weight 0
}
vrrp_instance VI_1 {
state MASTER
interface ens3
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
172.34.117.241
}
track_script {
chk_mysql
}
}
(참고) ifconfig 를 통해 확인
chk_mysql 함수에는 아래와 같이 mysql docker 가 살아있는지를 확인하는 스크립트를 넣어줬다.
/etc/keepalived/mysqltest.sh
#!/bin/bash
docker ps | grep mysql
if [ $? -ne 0 ]; then
echo "bad"
exit 1
fi
echo "good"
exit 0
(참고) 만약 VM2를 BACKUP으로 쓰고 싶다면 priority 를 VM! 보다 낮게 지정해준다. (99라든가) 나는 VM하나가 죽었을 때, 다른 쪽이 Master 가 되므로, 어차피 동등한 입장이라 그냥 두개를 동일한 priority 로 보고 있어서 100으로 동일하게 지정했다.
서비스를 시작해보자.
service keepalived start
잘 적용되었는지 확인
VM1 에서 확인
ip addr show
VM2 에서 확인
만약 여기서 VM1 을 죽인다면? 한번 VM1을 셧다운 시켜보자.
VM2 로 확인해보면, VIP가 잘 넘어온 것을 아래와 같이 확인할 수 있다!
이제는 VM2를 죽이고, VM1을 다시 살려보면 아래와 같이 다시 VM1 으로 VIP가 이동하는 것을 볼 수 있다.
(혹시 VIP가 이동이 안된다면 MySQL Docker 가 죽어있지는 않은지 확인해보자. keepalived 에서 설정했던 것처럼 chk_mysql 함수에서 실패하면 아직 해당 서버가 정상적으로 살아있지 않다고 판단하기 때문이다)
이어서
2편에서는 MySQL Replication (Master - Slave) 방식을 Orchestrator 로 구성하는 방식을 알아본다.
'Dev' 카테고리의 다른 글
MySQL 용량정리 (Binary log 삭제) (0) | 2022.03.09 |
---|---|
Kubernetes Ingress SSL 인증서 적용 (한국전자인증) (2) | 2021.12.20 |
CKA 시험후기 (Certified Kubernetes Administrator) (0) | 2021.10.31 |
Fast API 는 더 깔끔한 API UI도 제공합니다 ( ReDoc ) (0) | 2021.10.29 |
Fast API 에서 .env 파일로 환경변수 관리하기 (python-dotenv) (0) | 2021.10.29 |