서버 설정 · 5 min read · Oct 08, 2025

완벽한 로드 밸런싱 및 고가용성 웹 클러스터: 우분투 8.04 하디 헤론에서 Xen을 실행하는 2대 서버 - 페이지 6

12. 로드 밸런서 설정 (lb1, lb2)

12.1 로드 밸런서에서 IPVS 활성화

먼저 로드 밸런서에서 IPVS를 활성화해야 합니다. IPVS (IP Virtual Server)는 리눅스 커널 내에서 전송 계층 로드 밸런싱을 구현하며, 이를 Layer-4 스위칭이라고 합니다.

echo ip_vs_dh >> /etc/modules
echo ip_vs_ftp >> /etc/modules
echo ip_vs >> /etc/modules
echo ip_vs_lblc >> /etc/modules
echo ip_vs_lblcr >> /etc/modules
echo ip_vs_lc >> /etc/modules
echo ip_vs_nq >> /etc/modules
echo ip_vs_rr >> /etc/modules
echo ip_vs_sed >> /etc/modules
echo ip_vs_sh >> /etc/modules
echo ip_vs_wlc >> /etc/modules
echo ip_vs_wrr >> /etc/modules

그런 다음 다음을 수행합니다:

modprobe ip_vs_dh
modprobe ip_vs_ftp
modprobe ip_vs
modprobe ip_vs_lblc
modprobe ip_vs_lblcr
modprobe ip_vs_lc
modprobe ip_vs_nq
modprobe ip_vs_rr
modprobe ip_vs_sed
modprobe ip_vs_sh
modprobe ip_vs_wlc
modprobe ip_vs_wrr

12.2 로드 밸런서에 Ultra Monkey (패키지) 설치

다음과 같이 로드 밸런서에 Ultra Monkey (패키지)를 설치합니다:

apt-get install ipvsadm ldirectord heartbeat

12.3 로드 밸런서에서 패킷 포워딩 활성화

로드 밸런서는 Apache 노드로 트래픽을 라우팅할 수 있어야 합니다. 따라서 로드 밸런서에서 패킷 포워딩을 활성화해야 합니다. /etc/sysctl.conf에 다음 줄을 추가합니다:

vi /etc/sysctl.conf

# 패킷 포워딩 활성화
net.ipv4.ip_forward = 1

그런 다음 다음을 수행합니다:

sysctl -p

12.4 heartbeat 및 ldirectord 구성

이제 heartbeat를 위한 세 개의 구성 파일을 만들어야 합니다 (어떤 텍스트 편집기에서 편집하든 공백과 탭에 주의하세요, ldirectord는 매우 까다롭습니다!):

lb1 및 lb2에서

vi /etc/ha.d/ha.cf

logfacility local0
bcast eth0 # 리눅스
mcast eth0 225.0.0.1 694 1 0
auto_failback on
node lb1.example.com
node lb2.example.com
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

중요: 노드 이름으로는 두 개의 출력 결과를 사용해야 합니다:

uname -n

vi /etc/ha.d/haresources

lb1.example.com \
 ldirectord::ldirectord.cf \
 LVSSyncDaemonSwap::master \
 IPaddr2::192.168.1.106/24/eth0/192.168.1.255 \
 IPaddr2::192.168.1.107/24/eth0/192.168.1.255

IP 192.168.1.106 및 107은 나중에 웹사이트 (example.com 및 yoursite.com)에 사용됩니다.

이 파일은 lb1 또는 lb2에서 파일을 생성하든 두 노드에서 동일해야 합니다!

vi /etc/ha.d/authkeys

auth 3 3 md5 somerandomstring 

somerandomstring은 lb1 및 lb2에서 서로 인증하는 데 사용하는 두 개의 heartbeat 데몬의 비밀번호입니다. 여기에서 자신의 문자열을 사용하세요. 세 가지 인증 메커니즘 중에서 선택할 수 있습니다. 저는 md5가 가장 안전하다고 생각합니다.

/etc/ha.d/authkeys는 root만 읽을 수 있어야 하므로 다음을 수행합니다:

chmod 600 /etc/ha.d/authkeys

ldirectord는 실제 로드 밸런서입니다. 우리는 lb1.example.com과 lb2.example.com의 두 로드 밸런서를 활성/대기 설정으로 구성할 것입니다. 즉, 하나의 활성 로드 밸런서가 있고 다른 하나는 핫 스탠바이이며 활성 로드 밸런서가 실패하면 활성화됩니다. 이를 작동시키기 위해 /etc/ha.d/ldirectord.cf라는 ldirectord 구성 파일을 만들어야 하며, 이 파일은 lb1과 lb2에서 동일해야 합니다.

vi /etc/ha.d/ldirectord.cf

checktimeout=5
checkinterval=5
autoreload=no
logfile="/var/log/ldirectord.log"
quiescent=no
#fork=yes

#SMTP용
virtual=192.168.1.106:25
        real=192.168.1.104:25 gate
        fallback=192.168.1.105:25 gate
        service=none
        scheduler=wlc
        protocol=tcp
        checktype=connect
virtual=192.168.1.107:25
        real=192.168.1.104:25 gate
        fallback=192.168.1.105:25 gate
        service=none
        scheduler=wlc
        protocol=tcp
        checktype=connect

#DNS용 - CONNECT는 작동하지 않음, 패치해야 하지만 PING은 괜찮음
virtual=192.168.1.106:53
        real=192.168.1.104:53 gate
        fallback=192.168.1.105:53 gate
        service=none
        scheduler=wlc
        checktype=ping
        protocol=udp
virtual=192.168.1.106:53
        real=192.168.1.104:53 gate
        fallback=192.168.1.105:53 gate
        service=dns
        scheduler=wlc
        checktype=ping
        protocol=tcp
#HTTP용
virtual=192.168.1.106:80
        real=192.168.1.104:80 gate
        real=192.168.1.105:80 gate
        service=http
        request="ldirectord.php"
        receive="MySQL에 연결됨"
        scheduler=wlc
        protocol=tcp
        checktype=negotiate
        persistent=28800
virtual=192.168.1.107:80
        real=192.168.1.104:80 gate
        real=192.168.1.105:80 gate
        service=http
        request="ldirectord.php"
        receive="MySQL에 연결됨"
        scheduler=wlc
        protocol=tcp
        checktype=negotiate
        persistent=28800

#웹메일용
virtual=192.168.1.106:81
        real=192.168.1.104:81 gate
        fallback=192.168.1.105:81 gate
        service=http
        request="ldirectord.php"
        receive="MySQL에 연결됨"
        scheduler=wlc
        protocol=tcp
        checktype=negotiate
virtual=192.168.1.107:81
        real=192.168.1.104:81 gate
        fallback=192.168.1.105:81 gate
        service=http
        request="ldirectord.php"
        receive="MySQL에 연결됨"
        scheduler=wlc
        protocol=tcp
        checktype=negotiate
#POP3용
virtual=192.168.1.106:110
        real=192.168.1.104:110 gate
        fallback=192.168.1.105:110 gate
        service=pop
        checktype = connect
        scheduler=wlc
        protocol=tcp
#IMAP용
virtual=192.168.1.106:143
        real=192.168.1.104:143 gate
        fallback=192.168.1.105:143 gate
        service=imap
        scheduler=wlc
        protocol=tcp
#HTTPS용
### HTTPS를 사용할 경우 이 부분의 주석을 제거하세요
#virtual=192.168.1.106:443
#        real=192.168.1.104:443 gate
#        real=192.168.1.105:443 gate 2
#        service=http
#        request="ldirectord.php"
#        receive="MySQL에 연결됨"
#        scheduler=wlc
#        protocol=tcp
#        checktype=negotiate
#        persistent=28800
#
#virtual=192.168.1.107:443
#        real=192.168.1.104:443 gate
#        real=192.168.1.105:443 gate 2
#        service=http
#        request="ldirector.html"
#        receive="테스트 페이지"
#        scheduler=wlc
#        protocol=tcp
#        checktype=negotiate
#        persistent=28800
#IMAP SSL용
virtual=192.168.1.106:993
        real=192.168.1.104:993 gate
        fallback=192.168.1.105:993 gate
        service=imaps
        scheduler=wlc
        protocol=tcp
#POP3 SSL용
virtual=192.168.1.106:995
        real=192.168.1.104:995 gate
        fallback=192.168.1.105:995 gate
        service=pops
        checktype = ping
        scheduler=wlc
        protocol=tcp
#MONIT 모니터링 #1
virtual=192.168.1.106:10001
        real=192.168.1.104:10001 gate
        checktype = on
#MONIT 모니터링 #2
virtual=192.168.1.106:20001
        real=192.168.1.105:20001 gate
        checktype = on

virtual은 서비스의 가상 IP입니다 (예: 192.168.1.106 및 107)

real은 클러스터 내의 실제 서버 IP입니다 (192.168.1.104 및 105)

fallback은 백업 서버입니다. 실제 IP가 실패하면 요청이 fallback IP로 전달되지만 로드 밸런싱되지 않습니다.

이 구성은 제 개인적인 경험을 기반으로 합니다. 일부 서비스는 로드 밸런싱되고, 다른 서비스는 그렇지 않습니다. 메일과 관련된 모든 것은 로드 밸런싱되지 않습니다. 첫 번째 서버에 하나의 메시지가 도착하고 두 번째 서버에 다른 메시지가 도착하는 것을 원하지 않습니다 (공유 스토리지가 없는 한). 메일의 트래픽이 매우 높지 않다면 메일을 로드 밸런싱할 필요가 없습니다 (하지만 여전히 고가용성입니다), DNS도 마찬가지입니다. 나중에 두 번째 서버에서 메시지를 rsync하여 첫 번째 서버가 실패할 경우 백업을 확보할 것입니다.

포트 81에 대해. 우리는 웹메일에 사용할 것입니다. 또한 이미지 업로드 때문에 전자상거래 웹사이트 관리에 사용합니다. 나중에 web1.example.com에서 web2.example.com으로 rsync를 설정할 것이지만 그 반대는 아닙니다. 기본적으로 web2.example.com에 파일을 업로드하고 싶지 않습니다 (공유 스토리지를 사용하지 않는 한).

이 주제에 대한 더 많은 정보를 원하시면 “ldirectord man”을 검색하세요.

그 후에 우리는 heartbeat의 시스템 시작 링크를 생성하고 ldirectord의 링크를 제거합니다. ldirectord는 heartbeat 데몬에 의해 시작될 것이기 때문입니다:

update-rc.d -f ldirectord remove

마지막으로 heartbeat (그리고 ldirectord)를 시작합니다:

/etc/init.d/ldirectord stop
/etc/init.d/heartbeat start

12.5 로드 밸런서 테스트

두 로드 밸런서가 예상대로 작동하는지 확인해 봅시다:

ip addr sh eth0

활성 로드 밸런서 lb1.example.com은 가상 IP 주소 (192.168.1.106 및 192.168.1.107)를 나열해야 합니다:

2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.102/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.106/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.107/24 brd 192.168.1.255 scope global secondary eth0

핫 스탠바이 (lb2.example.com)는 다음과 같은 내용을 보여야 합니다:

2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:34:d7:7e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.103/24 brd 192.168.1.255 scope global eth0

이제 시도해 보세요:

ldirectord ldirectord.cf status

활성 로드 밸런서 (lb1)의 출력:

ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 5321

핫 스탠바이 로드 밸런서 (lb2)의 출력:

ldirectord is stopped for /etc/ha.d/ldirectord.cf

이제 포트가 올바르게 포워딩되는지 확인해 보겠습니다:

ipvsadm -L -n | grep :80

lb1.example.com에서 다음과 같은 내용을 볼 수 있어야 합니다:

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.106:80 wlc
  -> 192.168.1.104:80               Route   1      0          0         
  -> 192.168.1.105:80               Route   0      0          0
TCP  192.168.1.107:80 wlc
  -> 192.168.1.104:80               Route   1      0          0         
  -> 192.168.1.105:80               Route   0      0          0

그리고 lb2.example.com에서는 아무것도 보이지 않아야 합니다.

마지막 테스트:

/etc/ha.d/resource.d/LVSSyncDaemonSwap master status

활성 로드 밸런서의 출력:

master running (ipvs_syncmaster pid: 5470)

핫 스탠바이의 출력:

master stopped

12.6 로드 밸런서 장애 조치 테스트

lb1.example.com

/etc/init.d/heartbeat stop

ipvsadm 명령:

ipvsadm -L -n | grep :80

아무것도 출력되지 않아야 합니다.

lb2.example.com에서

ipvsadm -L -n | grep :80

다음과 같은 내용을 볼 수 있어야 합니다:

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.106:80 wlc
  -> 192.168.1.104:80               Route   1      0          0         
  -> 192.168.1.105:80               Route   0      0          0
TCP  192.168.1.107:80 wlc
  -> 192.168.1.104:80               Route   1      0          0         
  -> 192.168.1.105:80               Route   0      0          0

lb1.example.com에서 heartbeat 서비스를 다시 시작합니다:

/etc/init.d/heartbeat start

두 곳에서 ipvsadm 명령을 다시 시도하면 lb1.example.com이 이제 활성 상태가 되고 lb2.example.com은 다시 대기 상태로 돌아갑니다.

테스트가 잘 진행되었다면 계속 진행할 수 있습니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.