다중화
장애 발생 시에도 예비 운용 장비로 시스템 기능을 계속할 수 있도록 하는 것
장애 시 대응 방법
- Cold Standby
예비 운용 장비는 평소에는 사용하지 않고 장애 발생 시에만 수동으로 예비 장비를 연결한다.
하지만 현재 운용장치와 예비 운용장치 설정은 동일하게 설정하는 것이 중요하다
→ 라우터 장애 등에 대비하여 예비 라우터를 준비할 때 - Hot Standby
예비 장비의 전원을 항상 켜두고 네트워크에 연결된 상태로 유지. 두 대의 서버를 항상 가동하는 구조
→ 웹 서버처럼 실시간 데이터 갱신이 필요한 서비스에서 사용
장애 극복 (Failover)
현재 운용장비에 장애 발생 시 자동적으로 예비 운용장치로 처리를 인계한다,
가상 IP주소 (VIP)를 이용한다. 장애 발생 시 다른 서버가 가져가도록 설정한다.
장애 검출 (HealthCheck)
현재 운용장비에서 장애발생을 검출하는 방법
Health Check시에는 "무엇을 확인하고자 하는지"가 중요하다
- ICMP 감시 (Layer3)
echo 요청보내서 응답 돌아오는지 체크
서버 응답 가능한지(Reachable) 확인해서 서버 장비가 동작 중인지 확인한다.
서버는 살아있지만 서비스가 죽은 경우 확인이 불가능하다.
→ ping 192.168.1.1 - 포트 감시 (Layer 4)
특정 IP와 포트번호로 접속 가능한지 확인한다.
TCP/UDP 포트에 대한 접근여부로 서비스가 열려있는지 확인 가능하다.
→ telnet 192.168.1.1 80 (혹은 nc -nz) - 서비스 감시 (Layer 7)
실제 서비스나 애플리케이션 동작을 체크한다.
단순히 포트 체크를 넘어서 HTTP 응답코드, DB 질의 결과 등으로 서비스가 정상 작동중인지를 확인한다.
→ curl -I http://도메인
VIP 기반 이중화 구성하기
웹 서버 이중화 환경에서 Web1이 죽었을 때, Web2가 가상 IP(VIP)를 인계받아 서비스가 중단되지 않도록 구성
동작 흐름
1. Web2는 Web1의 VIP에 ping을 보내면서 상태 감시
2. Web1 응답이 없으면 (장애 발생)
3. Web2가 VIP를 자신의 인터페이스에 할당
4. ARP 브로드캐스트를 통해 "VIP는 이제 나다!"라고 알림
스크립트 코드 (Web2)
#!/bin/sh
VIP="10.0.0.1"
DEV="eth0"
healthcheck() {
ping -c 1 -w 1 $VIP > /dev/null
return $?
}
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 "healthcheck ok!"
sleep 1
done
echo "fail over!"
ip_takeover
send_arp는 iputils 또는 net-tools에 포함된 도구
[Web1(VIP가 있는 쪽)이 살아 있는지 확인]
healthcheck() {
ping -c 1 -w 1 $VIP > /dev/null
return $?
}
- ping -c 1 -w 1 $VIP > /dev/null
: VIP로 ping을 1번 보내고, 1초 안에 응답 오면 성공, 출력은 버린다(> /dev/null) - return $?
: ping 명령어의 성공 여부를 그대로 반환
성공(응답 있음) → return 0
실패(응답 없음) → return 1
[Web1이 죽었을 때, Web2가 VIP를 인계받는 작업 수행]
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
echo "[*] VIP가 Web2에 할당 완료"
}
- MAC=`ip link show $DEV | egrep -o '([0-9a-f]{2}:){5}[0-9a-f]{2}' | head -n 1 | tr -d :`
- ip link show: NIC 정보 출력
- egrep, tr -d :: 형식을 MAC 전송용으로 정리
- ip addr add $VIP/24 dev $DEV
Web2에 VIP를 직접 추가 - send_arp ...
ARP 브로드캐스트 전송
[healthcheck를 반복 수행]
while healthcheck; do
echo "healthcheck ok!"
sleep 1
done