MySQL 이중화 하기(HA) 1편: Keepalived 설치하기

2021. 12. 20. 15:26Dev

이번 글에서는 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 를 통해서 설치한다.
 

GitHub - openark/orchestrator: MySQL replication topology management and HA

MySQL replication topology management and HA. Contribute to openark/orchestrator development by creating an account on GitHub.

github.com

 

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 로 구성하는 방식을 알아본다.

https://github.com/itspjc/orchestrator-mysql-docker