[클러스터] Direct Routing 을 이용한 Load Balancing 서버 구성

##################################################

Direct Routing 을 이용한 Load Balancing 서버 구성

##################################################

작성 : 넷센터 홍석범

## 개요

가상 서버(Virtual Server)를 구성하는 방식은

1) NAT를 이용한 가상 서버

2) IP 터널링을 이용한 가상 서버

3) 다이렉트 라우팅(Direct Routing) 을 이용한 가상서버등이 있으나

이중 3)번 방식이 가장 성능적인 측면에서 효율적이므로 이 방식을 이용하

기로 한다.

0.필요한 서버 및 IP

L4 스위치 기능을 하는 Direct Routing 서버 1대, 2대면 더욱 좋다.

실제 서비스되는 리얼서버 2대 이상.

Direct Routing(이하 DR) 에서 사용하는 IP 1개

실제 서비스를 위한 VIP(Virtual IP-일종의 Floating IP) 1개

서버 갯수만큼의 실제 서버에서의 IP(Real IP 2개이상) 이하 총 4개. (모

두 공인IP)

1. 필요한 소프트웨어

DR : 커널 패치, eth0:0 으로 IP Aliasing 또는 eth1 로 별도 구성.

Real Server : 커널 패치, lo:0 으로 IP Aliasing

커널 패치는 아래와 같은 두가지 이유로 하게 된다.

(1) ARP Problem 을 해결하기 위해

(2) Director 에서 Round Robin등 스케쥴 방식을 설정하기 위해

2. 커널 패치 방법

http://www.linuxvirtualserver.org/software/index.html 에서

최신커널에 해당하는 패키지를 받는다.

현재의 경우 최신버전인 ipvs-0.8.1.tar.gz 를 다운로드하였다.

커널 소스 설치후 아래와 같이 패치한다.

# Director 에서 커널패치

cd /usr/src/linux

tar zxvfp ipvs-0.8.1.tar.gz

cat ipvs-0.8.1/linux_kernel_ksyms_c.diff | patch -p1

cat ipvs-0.8.1/linux_net_Makefile.diff | patch -p1

cat ipvs-0.8.1/linux_net_ipv4_Config_in.diff | patch -p1

cat ipvs-0.8.1/linux_ip_fw_compat_c.diff | patch -p1

cp -rp ipvs-0.8.1/ipvs net/ipv4

mv net/ipv4/ipvs/linux_net_ipv4_ipvs_Makefile net/ipv4/ipvs/Makefile

make menuconfig 로 커널 패치 설정

Networking options —> IP: Virtual Server Configuration —>

<*> virtual server support (EXPERIMENTAL)

[*] IP virtual server debugging

(12) IPVS connection table size (the Nth power of 2)

— IPVS scheduler

<*> round-robin scheduling

<*> weighted round-robin scheduling

<*> least-connection scheduling scheduling

<*> weighted least-connection scheduling

<*> locality-based least-connection scheduling

<*> locality-based least-connection with replication scheduling

<*> destination hashing scheduling

<*> source hashing scheduling

— IPVS application helper

<*> FTP protocol helper (NEW)

# Real Server 에서 커널패치

http://www.linuxvirtualserver.org/~julian/hidden-2.4.5-1.diff 에서 다



mv hidden-2.4.5-1.diff /usr/src/linux/

cd /usr/src/linux

patch -p1 < hidden-2.4.5-1.diff

## ipvsadm 설치 (Director에서만 설치한다.)

http://www.rpmfind.net/ 에서 ipvsadm 으로 검색하여 다운로드 후

설치

Virtual Server 커널 패치가 되어야만이 ipvsadm 이 정상적으로 작동하며

vs 패치 여부에 대한 확인은 sysctl -a|grep .vs. 로 확인 가능하다.

Director Server IP 211.47.65.1

Virtual IP 211.47.65.2

Real Server1 IP 211.47.65.3

Real Server2 IP 211.47.65.4

이중 실제 서비스되는 IP 는 VIP 인 211.47.65.2 이고 아래와 같이 IP 를

설정한다.

## DR 설치

ifconfig eth0 211.47.65.1 netmask 255.255.255.0

route add -net 211.47.65.0 netmask 255.255.255.0 dev eth0

ifconfig eth0:0 211.47.65.2 netmask 255.255.255.255 broadcast

211.47.65.2 up

route add -host 211.47.65.2 dev eth0:0

echo 1 > /proc/sys/net/ipvs/ip_forward

ipvsadm -A -t 211.47.65.2:80 -s wlc

ipvsadm -a -t 211.47.65.2:80 -r 211.47.65.3 -g

ipvsadm -a -t 211.47.65.2:80 -r 211.47.65.4 -g

위에서 ipvsadm에 대한 명령어에 대한 설명이다.

-A : 서비스를 추가 한다. (add-service로서 하나의 새로운 설정을 시작)

-s : 스케줄러 방식을 선택 (wlc : weight least connection scheduling)

-a : add server의 약자 ( -e : Edit , -d : Delete )

-t : TCP service를 추가( -u : UDP , -f : Firewall )

-r : 옵션 다음에 Real Server(실제로 서비스할 서버)의 IP를 적는다.

-g : Direct Routing 방식( -i : ip tunneling 방식 )

-g w 1 와 같이 가중치 설정이 가능하다.

ipvsadm -a -t 211.47.65.2:80 -r 211.47.65.3 -w 1 -g 나

ipvsadm -a -t 211.47.65.2:80 -r 211.47.65.3 -g 나 동일한 방법이다.

## 스케쥴러 방식에 대해 .

rr (round robin) 그냥 순서대로 돌린다.

wrr (weight round robin) 서버의 용량에 따라 가중치를 둔다.

연결된 커넥션 수는 신경쓰지 않는다.

lc (least connection) 현재 서버상태에서 가장 커넥션 수가 적은 것을 우

선 서비스 한다.

wlc ( weight least connection) 위에 이야기 한 대로 설정시 가중치를 부

여할 수 있다.

이 설정을 마치고 ipvsadm 명령을 실행하면 다음과 같이 나온다.

IP Virtual Server version 0.8.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 211.47.65.2:www wlc

-> 211.47.65.3:www Route 1 0 0

-> 211.47.65.4:www Route 1 0 0

## Real Server(1) 에서의 설정

ifconfig eth0 211.47.65.3 netmask 255.255.255.0

route add -net 211.47.65.0 dev eth0

ifconfig lo:0 211.47.65.2 netmask 255.255.255.255 broadcast

211.47.65.2 up

route add -host 211.47.65.2 dev lo:0

echo 1 > /proc/sys/net/ipv4/conf/all/hidden

echo 1 > /proc/sys/net/ipv4/conf/lo/hidden

## Real Server(2) 에서의 설정

ifconfig eth0 211.47.65.4 netmask 255.255.255.0

route add -net 211.47.65.0 dev eth0

ifconfig lo:0 211.47.65.2 netmask 255.255.255.255 broadcast

211.47.65.2 up

route add -host 211.47.65.2 dev lo:0

echo 1 > /proc/sys/net/ipv4/conf/all/hidden

echo 1 > /proc/sys/net/ipv4/conf/lo/hidden

## ARP Problem 에 대해

clinet

|

|

GateWay

|

|

Director –|

|

|

—————–

| |

| |

Real Server1 Real Server2

어디에서 ARP Problem 이 생기는가?

1) client 의 요청을 받은 GateWay가 request 를 처리하기 위해

arp broadcasting 시 Real Server는 응답하지 않고 DR만이 응답해야 한

다.

2) Real Server 가 포워딩받은 요청에 대해 응답시에는 Source IP 가 VIP

가 되는데,

VIP가 아닌 RIP 이어야 한다.

–> GW에서는 VIP 에 대한 MAC 주소를 DR에 대한 주소로 기억하여야 하는

데,

만약 RealServer 에서 소스 IP가 VIP 일 경우에는 문제가 생기게 된다.

Kernel 2.0.x 에서는 ifconfig eth0:0 192.168.1.2 -arp up 을 이용하여

apr 요청에

응답하지 않도록 할 수 있으나 2.2 나 2.4 에서는 이것이 없어져 결국 커

널패치를

하여야 한다.

이를 위해 라우터에서 Static 하게 VIP 의 MAC 주소를 설정해 줄 수 있

다.

예) arp -s 211.47.65.2 00:00:03:BF:ER:04

또는 Director 와 Real Server 모두 2개의 NIC 를 설치하여 다른 IP 대역

으로 설치해도 된다.

Real Server 에서 arp patch 를 위해

http://www.linuxvirtualserver.org/~julian/

에서 패치를 한다.

그리고

#!/usr/bin/perl

while (1){

sleep 600;

system “/root/clutser/arp/arp.sh”;

}

exit;

파일을 백그라운드로 실행하여 무한루프로 돌리고

/root/cluster/arp/arp.sh 에

/usr/sbin/send_arp -i eth0 211.47.65.2 00508B9A1B1B 211.47.65.255

ffffffffffff 를 설정하여 arp cache 를 refresh 할 수도 있다.

## DR 에서 자동 스크립트 설정하기.

(1) 부팅시 자동 실행 스크립트

Director 에서 lvs stop 을 하면 Load Balancing 설정이 멈추게 되고

lvs start 를 하면 Load Balancing 설정이 시작된다.

/etc/rc.d/rc3.d/S50lvs 를 생성후 /etc/rc.d/init.d/lvs 로 링크함.

/etc/rc.d/init.d/lvs 파일

#!/bin/sh

#

PATH=/bin:/usr/bin:/sbin:/usr/sbin

export PATH

IPVSADM=/sbin/ipvsadm

case “$1” in

start)

if [ -x $IPVSADM ]

then

ifconfig eth0:0 211.47.65.2 netmask 255.255.255.255 broadcast

211.47.65.2 up

route add -host 211.47.65.2 dev eth0:0

sysctl -w net.ipv4.ip_forward=1

$IPVSADM -A -t 211.47.65.2:80

$IPVSADM -a -t 211.47.65.2:80 -r 211.47.65.3 -w 1 -g

$IPVSADM -a -t 211.47.65.2:80 -r 211.47.65.4 -w 1 -g

fi

;;

stop)

if [ -x $IPVSADM ]

then

$IPVSADM -C

fi

;;

*)

echo “Usage: lvs {start|stop}”

exit 1

esac

exit 0

(2) lvs_check cgi 설정하기

/root/cluster/check.cgi & 를 실행하면 지속적으로 Real Server 에 대한

모니터링후 만약 특정 Real Server 가 다운을 발견하였을 때에는 다운된

서버는 자동으로 라우팅 테이블에서 제외하여 다운된 서버로는 접속이 가

지 않도록 한다.

## /root/cluster/lvs_check.cgi

#!/usr/bin/perl

#####################################################

# #

# Script for Load Balancing Server by Hong sukbum #

# antihong at tt.co.kr #

#####################################################

require “require.cgi”;

while(1){

$real_http1 = `./http.monitor -p 80 $real_server1 2>&1`;

$real_http2 = `./http.monitor -p 80 $real_server2 2>&1`;

if(($real_http1 =~ /OK/) && ($real_http2 =~ /OK/)) {

}

else{

$real_ping1 = `./ping.monitor $real_server1 2>&1`;

$real_ping2 = `./ping.monitor $real_server2 2>&1`;

if($real_ping1 !~ /alive/){

&real_server1_down;

}

if($real_ping2 !~ /alive/){

&real_server2_down;

}

else{

}

}

sub real_server1_down {

system “/sbin/ipvsadm -d -t $direct_server:80 -r $real_server1”;

open(MAIL, “|$MAIL_PROGRAM -t”);

print MAIL “To: $TO_MAIL \\n”;

print MAIL “Subject: $real_server1 is down!!! \\n”;

print MAIL “Content-type: text/html\\n\\n”;

print MAIL “<p><font face=\\”Times New Roman\\”>\\n”;

print MAIL “<b> $real_server1 에 ping 이 되지 않습니다.</b><p>\\n”;

print MAIL “<b>## $real_server1 Server의 다운여부를 확인하세

요.</b><p>\\n”;

print MAIL “<b>## $real_server1 이 Virtual Server 에서 제외되었습니

다.</b><br>\\n”;

close(MAIL);

}

sub real_server2_down {

system “/sbin/ipvsadm -d -t $direct_server:80 -r $real_server2”;

open(MAIL, “|$MAIL_PROGRAM -t”);

print MAIL “To: $TO_MAIL \\n”;

print MAIL “Subject: $real_server2 is down!!! \\n”;

print MAIL “Content-type: text/html\\n\\n”;

print MAIL “<p><font face=\\”Times New Roman\\”>\\n”;

print MAIL “<b> $real_server2 에 ping 이 되지 않습니다.</b><p>\\n”;

print MAIL “<b>## $real_server2 Server의 다운여부를 확인하세

요.</b><p>\\n”;

print MAIL “<b>## $real_server2 이 Virtual Server 에서 제외되었습니

다.</b><br>\\n”;

close(MAIL);

}

}

3) require.cgi 설정하기

## /root/cluster/require.cgi

#!/usr/bin/perl

$TO_MAIL = ‘antihong at tt.co.kr’;

# Real Server가 다운시 담당자에게 메일이 발송된다.

$MAIL_PROGRAM = “/usr/sbin/sendmail”;

# sendmail 의 경로

$direct_server =”211.47.65.2″;

# Real-Server1 Server 의 IP

$real_server1 =”211.47.65.3″;

# Real-Server1 Server 의 IP

$real_server2 =”211.47.65.4″;

# Real-Server2 Server 의 IP

#### 마치면서

(1) 만약 Director Server 가 다운된다면 어떻게 대처할 것인가?

해결책) Director 를 Mirroring 으로 설정하여 운영한다.

해결책) DR 의 역할을 Real_Server1 에서 받아오도록 하는 방법도 있다.

(2) 모든 Real Server 가 다운된다면 어떻게 대처할 것인가?

해결책) 모든 Real Server 가 다운된다면 Director 가 웹서비스도 대신하

도록

할 수 있지만 성능적인 측면에서 별로 효과적이지 않다.

(3) 현재는 웹에 대해서만 감시하도록 되어 있으나 다른 감시도 할 수 있

다.

(4) Director 에 또는 Real Server 에 이더넷 카드를 두장 설치하여 운영

하는 것이

더욱 효과적이다.

(5) 만약 Real_Sever 가 다운시 DR 에서 라우팅 테이블이 삭제된 후 추가



수작업으로 하여야 한다. 물론 자동으로 할 수도 있다.

(6) 만약 상품으로 한다면 몇 가지 부가 기능을 더 추가할 수 있으나

실용적인 면에서는 그리 필요하지 않다고 보아 추가하지 않았다.

주의] 만약 특정 Real Server가 다운된 후 복구하여 Load Balancing 에 추

가하려면 수작업으로 추가하여야 하며(lvs start만 하면 된다.) 아울러

Director 에서는 arp 를 Refresh 하여야 한다.(/root/cluster/arp/arp.sh

를 실행하면 된다.)

참고문서 : http://www.linuxvirtualserver.org/Joseph.Mack/HOWTO/LVS-

HOWTO.html

http://kldp.org/Translations/html/Virtual_Server-KLDP/index.htm

http://linux.clusterkorea.org/

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.