DevOps

다중화(Redundancy) - 2. 웹서버 다중화(LB 없이)

게임이 더 좋아 2023. 12. 20. 22:26
반응형
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는 이렇게 하나씩 문제를 해결하다보니 필요해졌다.

반응형
그리드형

'DevOps' 카테고리의 다른 글

다중화(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
SVN_Command  (0) 2023.01.21