반응형
728x170
다중화 방법 중 DNS query를 이용한 다중화에 대해서 알아보자
DNS 라운드로빈의 단점
- 서버의 수만큼 글로벌 주소가 필요(Domain Name)
- IP 주소가 많이 필요함
- 균등하게 분산되는 것은 아님
- 예를 들어 모바일에서는 캐리어 게이트웨이라고 하는 프록시 서버를 경유함
- 프록시 서버에서는 일정시간 동안 캐싱되어 프록시 서버를 통한 접속은 항상 같은 서버로 접속됨
- PC 브라우저에서도 DNS query 결과를 캐싱해서 균등하게 부하 분산이 된다고 보기 어려움
- DNS TTL을 짧게 설정함으로 어느정도 개선할 수 있지만 클라이언트의 캐싱을 해제하는 것은 아니므로 근본적인 해결책은 아님
- 서버가 다운되어도 감지하지 못함
- 부하나 접속 수로 제어하는 것이 아님
- 즉, 다운된 서버로도 계속 부하 분산을 하는 문제가 생길 수 있음
케이스로 알아보자
- 두 대의 웹 서버 양 쪽에 VIP 부여
- 하나의 웹서버 이상 시, 해당 VIP를 다른 웹서버에 인계
DNS 라운드로빈 다중화를 위한 스크립트
#!/bin/sh
VIP="10.0.0.1 10.0.0.2"
DEV="eth0"
# 장애 검출 - (장비 장애)
healthcheck(){
for i in $VIP; do
if [-z "`ip addr show $DEV | grep $i`"]; then
if ["200" -ne "`curl -s -I <http://$i/>' | head -n 1 | cut -f 2 -d ' '`"]; then
CIP="$i"
return 1
fi
fi
done
return 0
}
# 장애 극복
ip_takeover(){
MAC=`ip link show $DEV | egrep -o '([0-9a-f]{2}:){5}{0-9a-f}{2}' | head -n 1 | tr -d :`
ip addr add $VIP/24 dev $DEV
send_arp $VIP $MAC 255.255.255.255 ffffffffffff
}
while healthcheck; do
echo "health ok"
sleep 1
done
echo "fail over"
ip_takeover
L3 (ICMP) → L7 (curl)
ping이 아닌 curl을 통해 헬스체크함으로써 웹서비스 정지 검출 가능
- 하지만 웹서비스가 정지해도 VIP를 해제하지 않으므로 IP 주소가 중복
- 장애가 극복되면 스크립트가 멈춰버림
이를 극복하기 위한 스크립트 수정
#!/bin/sh
VIP="10.0.0.1 10.0.0.2"
DEV="eth0"
ip_add() {
MAC=`ip link show $DEV | egrep -o '([0-9a-f]{2}:){5}{0-9a-f}{2}' | head -n 1 | tr -d :`
ip addr add $VIP/24 dev $DEV
send_arp $VIP $MAC 255.255.255.255 ffffffffffff
}
ip_del() {
ip addr add $1/24 dev $DEV
}
#
healthcheck(){
for i in $VIP;do
if ["200" -ne "`curl -s -I <http://$i/>' | head -n 1 | cut -f 2 -d ' '`"]; then
if [-z "`ip addr show $DEV | grep $i`"]; then
ip_add $i
else
ip_del $i
fi
fi
done
}
while true; do
healthcheck
sleep 1
done
VIP에 대해 헬스체크를 진행
실패할 경우 해당 VIP를 해제함
자신에게 할당되어 있지 않은 주소라면 다른 웹서버의 VIP를 자신에게 인계시킴
VIP가 변경되어도 스크립트는 정지 하지 않음
하지만 수가 늘어서 웹 서버가 3대가 된다면 다른 문제가 발생함
- 한 서버가 다운되었을 때, 어떤 서버가 VIP를 인계받을지 결정할 수 없음
- 장애극복하는 타이밍에 따라 2대의 서버가 같은 IP 주소를 가질 가능성이 있음
- 정지한 서버를 복귀시키는 것이 어려움
LoadBalancer로 위와 같은 문제를 해결할 수 있음
즉, 우리가 많이 쓰는 LB는 이렇게 하나씩 문제를 해결하다보니 필요해졌다.
728x90
반응형
그리드형
'DevOps' 카테고리의 다른 글
elastalert2 적용하기 (0) | 2024.08.26 |
---|---|
다중화(Redundancy) - 3 웹 서버의 다중화 (IPVS를 이용한 LB) (1) | 2023.12.21 |
다중화(Redundancy) - 1. 다중화 개념 (1) | 2023.12.20 |
Redis 백업 (1) | 2023.07.08 |
Logging Application 비교 (0) | 2023.01.21 |