달력

5

« 2025/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'서버 인프라를 지탱하는 기술'에 해당되는 글 3

  1. 2011.02.25 IPVS 이용한 Load Balancer
  2. 2011.02.21 웹 서버의 다중화 - DNS 라운드 로빈
  3. 2011.02.15 Active/Backup 구성 만들기

IPVS 기능은 ipvsadm, keepalived 를 사용하여 구축한다.
전체적인 구성은 다음 그림과 같다.


1. Load Balancer 서버에 설치 하는 내역은 다음과 같다.
    ipvsadm, keepalived 설치이다. 설치 진행 내역은 다음과 같다. 참고로 현재 keepalived 최신 버전은 1.2.2 이나 
    설치시 버그가 나는 관계로 1.2.1 버전을 사용하였다.

[root@Keep-LB keepalived]# yum -y install ipvsadm

[root@Keep-LB keepalived]# yum -y install kernel-headers kernel-devel

[root@Keep-LB keepalived]# wget http://www.keepalived.org/software/keepalived-1.2.1.tar.gz

[root@Keep-LB keepalived]# ./configure --with-kernel-dir=/lib/modules/$(uname -r)/build

[root@Keep-LB keepalived]# make && make install

[root@Keep-LB keepalived]# cd /etc/sysconfig
[root@Keep-LB keepalived]# ln -s /usr/local/etc/sysconfig/keepalived .
[root@Keep-LB keepalived]# cd /etc/rc3.d/
[root@Keep-LB keepalived]# ln -s /usr/local/etc/rc.d/init.d/keepalived S100keepalived
[root@Keep-LB keepalived]# cd /etc/init.d/
[root@Keep-LB keepalived]# ln -s /usr/local/etc/rc.d/init.d/keepalived .
[root@Keep-LB keepalived]# cd /usr/local/etc/keepalived
[root@Keep-LB keepalived]# cp keepalived.conf keepalived.conf.bak


[root@Keep-LB keepalived]# cat keepalived.conf
virtual_server_group example {
 192.168.25.9 80
 }

virtual_server group example {
 lvs_sched      rr
 lvs_method     NAT
 protocol       TCP
 virtualhost    health

 real_server 10.0.0.249 80 {
  weight 1
  HTTP_GET {
   url {
    path /health.html
    status_code 200
   }
   connect_prot 80
   connect_timeout 5
  }
 }

 real_server 10.0.0.248 80 {
  weight 1
  HTTP_GET {
   url {
    path /health.html
    status_code 200
   }
   connect_prot 80
   connect_timeout 5
  }
 }
}

[root@Keep-LB keepalived]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 0
아래줄과 같이 변경
net.ipv4.ip_forward = 1
[root@Keep-LB keepalived]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

keepalived 실행시 다음과 같은 error가 발생 한다.
Starting keepalived: /bin/bash: keepalived: command not found

에러 메시지 처리는 다음과 같이 하였다.
keepalived 실행 파일의 명령어 라인을 다음과 같이 바꾸었다.

start() {
echo -n $”Starting $prog: ”
daemon /usr/local/sbin/keepalived ${KEEPALIVED_OPTIONS}

그리고 생성 되지 않은 /etc/keepalived 또한 링크로 생성하였다.
[root@Keep-LB keepalived]# ln -s /usr/local/etc/keepalived/ /etc/keepalived

[root@Keep-LB keepalived]# service keepalived start



2. WEB 서버 2대에 대하여 다음과 같은 설정을 진행한다.
    서버의 기본 GateWay를 10.0.0.251로 변경한다.
    헬스 체크 페이지를 만든다. -> path /health.html 라고 설정되어 있으므로 health.html 이라는 페이지를 만들어 준다.
    작동 확인용 기본 페이지를 만든다. -> index.html 페이지를 생성하여 각 각의 서버를 구분할수 있게 한다.
    마지막으로 /etc/sysctl.conf 파일의 내용 중 net.ipv4.ip_forward = 0 찾아서 net.ipv4.ip_forward = 1 로 변경 해준다.
    그리고 변경 값의 적용을 위하여 sysctl -p 명령을 사용하여 적용 한다.
    물론 두대의 웹서버에는 기보적으로 웹서버가 설치되어 구동되어야 한다.

이제 전체 구성이 완료 되었다. Load Balancer 서버에서 전체 구성의 확인을 하고 실제 동작 여부를 테스트 하면 된다.

ipvsadm 을 이용해 구성을 확인 한 것이다.

 [root@Keep-LB ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.25.9:80 rr
  -> 10.0.0.248:80                Masq    1      0          0
  -> 10.0.0.249:80                Masq    1      0          0



로그 파일을 확인 하여 keepalived 정상 작동을 확인 한다.

[root@Keep-LB ~]# tailf /var/log/messages | grep Keepalived_healthcheckers
Feb 24 15:39:13 Keep-LB Keepalived_healthcheckers: Netlink reflector reports IP 192.168.25.9 added
Feb 25 07:31:27 Keep-LB Keepalived_healthcheckers: Terminating Healthchecker child process on signal
Feb 25 07:31:27 Keep-LB Keepalived_healthcheckers: Terminating Healthchecker child process on signal
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Netlink reflector reports IP 192.168.25.9 added
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Netlink reflector reports IP 10.0.0.251 added
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Netlink reflector reports IP 10.0.0.251 added
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Registering Kernel netlink reflector
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Registering Kernel netlink command channel
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Opening file '/etc/keepalived/keepalived.conf'.
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Configuration is using : 14268 Bytes
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Using LinkWatch kernel netlink reflector...
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Activating healtchecker for service [10.0.0.249:80]
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Activating healtchecker for service [10.0.0.248:80]
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Opening file '/etc/keepalived/keepalived.conf'.
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Configuration is using : 14268 Bytes
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Using LinkWatch kernel netlink reflector...
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Activating healtchecker for service [10.0.0.249:80]
Feb 25 07:31:28 Keep-LB Keepalived_healthcheckers: Activating healtchecker for service [10.0.0.248:80]



:
Posted by Se Story
아래 구성은 두 대의 웹 서버의 양쪽에 VIP 부여해서 다중화한 그림이다.
WEB1이 정지시 VIP(10.0.0.1)가 WEB2로 인계 되어 모든 접속을 처리하게 된다.
반대로 WEB2가 정지시 WEB1이 처리 하게 된다.

DNS 라운드 로빈 부하 분산은 다음과 같다.
www.test.com IN A 10.0.0.1
www.test.com IN A 10.0.0.2






상기 구성의 failover를 구현하기 위하여 여기서도 스크립트를 작성한다.
젠장... 서버 인프라를 지탱하는 기술 잊지 않겠다... 오타 그리고 미완의 스크립트 ㅜㅜ
다음은 failover3.sh 스크립트 내용이다.

 [root@WEB2 send_arp]# cat failover3.sh
#!/bin/sh -x
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 $i/24 dev $DEV
 /root/fake-1.1.11/send_arp/send_arp $i $MAC 255.255.255.255 ffffffffffff
}

ip_del() {
 ip addr del $i/24 dev $DEV
}

healthcheck() {
 for i in $VIP;do
 OK=`curl -s -I http://$i/ | head -n 1 | cut -f 2 -d  '' | awk '{print $2}'`
 echo $OK
 if [ "$OK" = "" ];then
   OK="404"
   echo $OK
 fi
  if [ 200 -ne "$OK" ];then
   if [ -z "`ip addr show $DEV | grep $i/24`" ]; then
      ip_add $i
    else
      ip_del $i
   fi
  fi
 done
}

while true; do healthcheck;sleep 1;done



:
Posted by Se Story

아래 그림은 Active 서버의 장애시에 Backup 서버가 VIP를 가져와 서비스를 계속 하는 구조이다.
failover.sh 스크립트는 양 서버에 존재 하여야 하며 VIP를 향해 Ping 테스트를 하며
healthcheck를 하다 fail 시 VIP를 할당하여 서비스를 유지하는 구조이다.



구성에 필요한 것은 서버 두 대 그리고 스위치 한 대이다.
리눅스 설치에 추가로 설치할 것은 다음과 send_arp 명령이 기본에는 없는 관계로 소스로 설치 하였다.

# wget http://horms.net/projects/fake/download/1.1.11/fake-1.1.11.tar.gz
# tar xfz fake-1.1.11.tar.gz
# cd fake-1.1.11
# make patch && make

make 까지만 진행 한다. 설치를 하지 않아도 fake-1.1.11 디렉토리 아래 send_arp 디렉토리에
send_arp 명령어가 생성되어 사용가능 하다.
Active&Backup 양쪽 서버에 send_arp 명령어를 생성한 후 failover.sh 스크립트를 생성 및 구동한다.
failover.sh 스크립트 내용 중 send_arp 명령을 실행하는 라인에서는 send_arp 명령어의 위치까지의
절대 경로를 입력 하여야 한다.

failover.sh

#!/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 "health ok!"

 sleep 1

done

echo "fail over!"

ip_takeover


양서버에 failover.sh 스크립트를 생성한 후 send_arp 명령어 위치도 Path 추가하여 놓은 후

Active 서버에서 failover.sh 스크립트를 구동하면
fail over! 라고 출력 한 후 스크립트가 종료된다.

Backup 서버에서 failover.sh 스크립트를 구동하면
health ok! 라는 문자열을 1초마다 출력한다.

Active 서버에서 아래 명령어 실행하여 VIP가 Active 할당되어 있음 을 알수 있다.
 # ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:36:14:b4 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.102/24 brd 10.0.0.255 scope global eth0
    inet 10.0.0.1/24 scope global secondary eth0
    inet6 fe80::20c:29ff:fe36:14b4/64 scope link
       valid_lft forever preferred_lft forever

이 상태에서 Active 서버의 네트워크장애가 발생시 Backup 서버의 failover.sh 스크립트의
health ok! 문자열이 중단 되고 fail over! 라고 출력 후 VIP 를 Backup 서버에 설정 후
서비스를 계속 이어서 해준다.
VIP 할당여부 확인하는 명령어는
# ip addr show eth0 이다.



:
Posted by Se Story