MySQL MHA Failover 시 문제 원인과 해결법 | GARP(ARPING) 이슈
MHA
- MHA는 MySQL Master-Slave 환경에서 장애 발생 시 자동으로 Master를 Failover 하는 오픈소스 툴이다. VIP(Virtual IP)는 클라이언트의 트래픽을 Master 서버로 라우팅하기 위해 사용된다.
GARP(Gratuitous ARP)
- GARP는 네트워크 스위치나 ARP 테이블에 VIP와 관련된 MAC 주소 정보를 갱신해주는 역할을 한다.
이슈 발생 상황
MHA manager 를 이용해서 서버1번이 기존 MASTER였다면 MASTER를 서버 2번으로 옮기는 작업을 진행했다.
MHA manager 서버에서는 별다른 로그가 없었고, VIP도 모두 제대로 떠있는데
실제 트래픽 유입은 기존 MASTER 서버였던 1번으로 지속적으로 유입되는 것을 발견했다.
우선 다시 failback작업을 통해 MASTER서버를 다시 1번으로 옮겼다. → 이때는 트래픽이 제대로 유입 되었다. 이를 통해 스위치에서 신규로 MASTER가 된 서버에게 트래픽을 보내지 않는다는 것을 알게 되었다.
이슈 발생 원인
NW담당자분과 OS 담당자분께 문의드린 결과 (구글링해도 도저히 뭐가 문제인지 모르겠어서 문의드렸다... 감사합니다..)
원래는 VIP가 기존 MASTER 서버에서 내려가고 신규 MASTER가 된 서버에서 VIP가 올라갈때 GARP를 날려주어서 스위치쪽에 학습을 시켜야하는게 맞다. 근데 소프트웨어적 문제인지 VIP설정 문제인지... 해당 서버는 GARP를 날리는 작업을 자동으로 하지 않는 듯 하다고 하셨다. OS담당자분께서는 VIP 점검을 해주셨는데 VIP설정관련해서 문제는 따로 없었다. 그리고 기존에는 GARP를 날려주지 않아도 서버가 FAILOVER가 정상적으로 진행되었고, 트래픽유입에서도 문제가 없었다....(서버를 구축할때 FAILOVER 테스트를 했기 때문에 정상적으로 이동하는게 당연하다) 그 사이에 어떤 문제가 생긴건지..
→ GARP가 문제라는건 확인했지만 정확히 어떤 이슈로 인해서 GARP를 자동으로 날려주지 못하는건지는 알아내지 못했다. (이건 너무 광범위할수도..)
추가로 나는 이때 신규 MASTER가 UP될 때 학습하는게 기존 서버의 MAC주소인 줄 알았는데.. 알고보니까 VIP를 띄우면 VMAC이라는 가상의 MAC 주소를 사용하고 같은 VIP일 경우 같은 VMAC을 사용하기 때문에 한쪽에서 VIP가 내려가고 다른쪽에서 VIP가 올라가도 동일한 VMAC이라는 사실을 알게되었다.
해결방안
결론적으로 FAILOVER 시 ARP도 함께 학습시켜주기 위해 아래 구문을 수동으로 날려주어야 한다는 의미.
/usr/sbin/arping -c $ARPING_COUNT -I $INTERFACE -s $VIP $BROADCAST
그래서 만약 MASTER서버에 문제가 있을 경우 해당 스크립트를 날려주어야 하기때문에.. 자동 failover를 담당하는 mha서버내에 스크립트에 위 구문을 추가해주었다.
아래는 임시로 생성한 예시 스크립트이다.
#!/bin/bash
# 환경 설정
VIP=""
NETMASK=""
INTERFACE="eth0"
BROADCAST=""
ARPING_COUNT=3
# 인자로 상태를 받음 (old_master, new_master)
ACTION=$1
case $ACTION in
"old_master")
echo "[INFO] Shutting down VIP on the old master..."
/sbin/ifconfig $INTERFACE:0 down
if [ $? -eq 0 ]; then
echo "[SUCCESS] VIP $VIP has been disabled on old master."
else
echo "[ERROR] Failed to disable VIP $VIP on old master."
exit 1
fi
;;
"new_master")
echo "[INFO] Bringing up VIP on the new master..."
/sbin/ifconfig $INTERFACE:0 $VIP netmask $NETMASK broadcast $BROADCAST up
if [ $? -eq 0 ]; then
echo "[SUCCESS] VIP $VIP has been enabled on new master."
else
echo "[ERROR] Failed to enable VIP $VIP on new master."
exit 1
fi
echo "[INFO] Sending gratuitous ARP to update ARP table..."
/usr/sbin/arping -c $ARPING_COUNT -I $INTERFACE -s $VIP $BROADCAST
if [ $? -eq 0 ]; then
echo "[SUCCESS] ARP table updated successfully."
else
echo "[ERROR] Failed to update ARP table."
exit 1
fi
;;
*)
echo "[ERROR] Invalid action specified. Use 'old_master' or 'new_master'."
exit 1
;;
esac
※ 추가로 확인되는 부분있으면 업데이트 예정