태그 보관물: Load Balancing

HA-LVS 구축하기 – Ubuntu 14.04 + Ipvsadm + Heartbeat

이 글에서는 우분투 14.04에서 Ipvsadm으로 LVS(Linux Virtual Server)를 구축하여 웹 서버 로드밸런싱을 구현하고 Heartbeat로 고가용성(HA, High Availability)을 유지하는 방법을 소개한다. LVS 구축 완료 후 HA를 적용할 것이므로 HA를 제외한 LVS만 구축하고 싶은 사람까지 고려되었다.

이 예제에서 사용되는 서버와 사용되는 IP는 아래와 같다.

[서버 종류: Hostname, IP]

  • LVS 서버 1: lvs1, 192.168.56.3
  • LVS 서버 2: lvs2, 192.168.56.4
  • (LVS 가상 IP: 192.168.56.10)
  • 웹 서버 1: web1, 192.168.56.11
  • 웹 서버 2: web2, 192.168.56.12

HA를 적용하지 않는다면 lvs2는 무시한다.

web1, web2 서버에는 Aapache, Nginx 같은 웹 서버 프로그램이 설치되어 있다.

LVS 서버(192.168.56.10)에 접속하면 web1(192.168.56.11), web2(192.168.56.12) 서버중 하나에 연결이 되도록 할 것이다.

LVS로 로드밸런싱 환경 구축하기

lvs1, lvs2 서버에 LVS 구축

# ipvsadm 설치
$ sudo apt-get install ipvsadm
# ipvsadm 설정 파일 수정
$ sudo vi /etc/default/ipvsadm
# if you want to start ipvsadm on boot set this to true
AUTO="true"

# daemon method (none|master|backup)
DAEMON="master"

# use interface (eth0,eth1...)
IFACE="eth0"

# syncid to use
SYNCID="1"
# IP 포워드 허용
$ sudo vi /etc/sysctl.conf
...
net.ipv4.ip_forward=1
...
# ipvsadm 설정 - 서비스 추가
$ sudo ipvsadm -A -t 192.168.56.10:80 -s rr

-s 옵션은 스케쥴링 방식으로 4개의 방식이 있다.

  • rr: 라운드로빈
  • wrr: 가중치 라운드로빈
  • lc: 최소연결
  • wlc: 가중치 최소연결
# ipvsadm 설정 - 서버 추가
$ sudo ipvsadm -a -t 192.168.56.10:80 -r 192.168.56.11:80 -g -w 1
$ sudo ipvsadm -a -t 192.168.56.10:80 -r 192.168.56.12:80 -g -w 1

-g 옵션은 패킷 포워딩 방식으로 다이렉트 라우팅(Direct Routing)을 뜻하며 -i(Tunneling), -m(NAT) 를 사용할 수도 있다. 하지만 각 상황에 따라 web1, web2에 요구되는 네트워크 설정이 달라지므로 이 예제에서는 -g(Direct Routing)를 사용한다.

패킷 포워딩 방식별 네트워크 설정 참고 자료: http://yoonperl.tistory.com/18

-w 옵션은 가중치로 서버별로 가중치를 다르게 하고 싶을때 사용하면 된다. 당연히 스케쥴링 방식중 wrr(가중치 라운드로빈), wlc(가중치 최소연결)에서 유효하다.

# ipvsadm 설정 상태 확인
$ sudo 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.56.10:80 rr
  -> 192.168.56.11:80             Route   1      0          0
  -> 192.168.56.12:80             Route   1      0          0

하지만 위 설정은 재부팅 하면 사라진다. ipvsadm-save 명령으로 출력되는 내용을 /etc/ipvsadm.rules 에 추가해야 한다.

# ipvsadm 설정 유지
$ sudo sh -c 'ipvsadm-save | tee /etc/ipvsadm.rules'
-A -t 192.168.56.10:http -s rr
-a -t 192.168.56.10:http -r 192.168.56.11:http -g -w 1
-a -t 192.168.56.10:http -r 192.168.56.12:http -g -w 1
# LVS 서버에 가상 IP 추가(재부팅시 설정 사라짐.)
$ sudo ifconfig eth0:0 192.168.56.10 netmask 255.255.255.0 up

위의 가상 IP 설정은 재부팅 하면 사라진다. /etc/network/interfaces 파일을 직접 수정하면 재부팅을 해도 설정이 유지된다.

# LVS 서버에 가상 IP 추가(재부팅시 설정 유지됨.)
$ sudo vi /etc/network/interfaces
...
auto eth0
iface eth0 inet static
address 192.168.56.XX  # 각 서버에 맞는 IP 부여
netmask 255.255.255.0
gateway 192.168.56.1
network 192.168.56.1
broadcast 192.168.56.255

auto eth0:0
iface eth0:0 inet static
address 192.168.56.10
netmask 255.255.255.0

 

web1, web2 서버 네트워크 설정

웹 서버도 LVS 서버와 마찬가지로 동일한 가상 IP를 추가해야 한다.

# 웹 서버에 가상 IP 추가(재부팅시 설정 사라짐.)
$ ifconfig eth0:0 192.168.56.10 netmask 255.255.255.0 up

가상 IP를 추가하는 방법은 LVS 서버와 다르지 않다.

ARP(Address Resolution Protocol, 주소 결정 프로토콜) 기능을 끄는 설정을 반드시 추가해야 한다. 외부에서 가상 IP(192.168.56.10)로 접속시 ARP가 캐쉬 되면 로드밸런싱이 되지 않고 캐쉬된 맥주소의 장비로 바로 연결이 되버린다.

# 실서버에 ARP 문제 해결을위해 ARP에 대한 응답없음 설정 추가
$ sudo vi /etc/sysctl.conf
...
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

LVS 테스트 하기

lvs2 서버는 아직 사용하지 않으므로 전원을 꺼둔다.

외부 장비에서 가상 IP(192.168.56.10)로 웹 페이지(http://192.168.56.10) 접속을 시도한다. web1과 web2의 내용을 다르게 해서 web1과 web2가 번갈아가며 나오는지 확인한다. 단, web1과 web2가 정확하게 한번씩 번갈아가며 나오지는 않으므로 같은 페이지만 여러번 나온다고 해서 섣불리 오류라고 판단하지 말자.

여러번 접속과 시도를 한 후에 lvs1 서버에서 아래와 같이 상태를 확인하자.

# ipvsadm 상태 확인
$ sudo ipvsadm -ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  192.168.56.10:80                    0        0        0        0        0
  -> 192.168.56.11:80                    0        0        0        0        0
  -> 192.168.56.12:80                    0        0        0        0        0

CPS, InPPS 등의 숫자가 계속 오르고 내리며 변화하면 LVS 설정은 정상이다. 만약 숫자는 변하는데 웹 페이지가 뜨지 않는다면 웹 서버의 네트워크 설정을 다시 한번 확인해보자.

숫자가 변하지 않고 한쪽 웹서버의 웹 페이지만 뜬다면 LVS 설정이 잘못되었거나 외부 접속 테스트를 하는 컴퓨터의 ARP가 캐쉬되었을 수 있다. 만약 ARP 캐쉬가 되어버린 것 같다면 아래의 명령어로 캐쉬를 지울 수 있다.

# ARP 캐쉬 삭제
$ sudo arp -d 192.168.56.10

여기까지 LVS를 이용한 로드밸런싱 환경 구축이 완료되었다.

 

Heartbeat로 LVS 서버에 고가용성(HA, High Availability) 유지하기

이제 lvs1 서버에 장애가 생기더라도 lvs2가 이어서 동작하는 고가용성을 적용해보자. lvs2는 lvs1과 LVS가 동일하게 구축되어 있어야 한다.

lvs1, lvs2 서버에 Heartbeat 설치하기

# heartbeat 설치
$ sudo apt-get install heartbeat

설치가 되었으면 /etc/ha.d/ 디렉토리 아래에 설정파일을 추가해야 한다. /usr/share/doc/heartbeat/ 디렉토리에 기본 설정파일이 준비되어 있다.

# Heartbeat 기본 설정파일 복사하기
$ sudo cp /usr/share/doc/heartbeat/authkeys /etc/ha.d/
$ sudo cp /usr/share/doc/heartbeat/ha.cf.gz /etc/ha.d/
$ sudo cp /usr/share/doc/heartbeat/haresources.gz /etc/ha.d/
$ sudo gunzip /etc/ha.d/ha.cf.gz
$ sudo gunzip /etc/ha.d/haresources.gz

authkeys 파일의 권한은 반드시 600 이어야 오류가 발생하지 않는다.

# authkeys 권한 변경
$ sudo chmod 600 /etc/ha.d/authkeys

authkeys 파일에서 설정들의 주석을 제거한다.

# authkeys 파일 편집
$ sudo vi /etc/ha.d/authkeys
...
auth 1
1 crc
...

ha.cf 파일에서 아래 설정들의 주석을 제거한다.

# ha.cf 파일 편집
$ sudo vi /etc/ha.d/ha.cf
...
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
initdead 120
udpport 694
bcast eth0
auto_failback on
node lvs1
node lvs2
...

lvs1, lvs2 서로가 IP를 알 수 있도록 hosts 파일에 추가한다.

# lvs1, lvs2의 IP 추가
$ sudo /etc/hosts
...
192.168.56.3 lvs1
192.168.56.4 lvs2
...

우리의 목적은 lvs1 서버에 장애가 발생시 lvs2가 LVS 가상 IP를 이어 받아서 동작하게 만드는 것이다. 아래와 같이 haresources 파일을 편집한다.

# haresources 파일 편집
$ sudo vi /etc/ha.d/haresources
...
# lvs1, lvs2 둘다 똑같이 lvs1으로 적는다.
lvs1 192.168.56.10

여기서 한가지 중요한 것이 있는데 위에서 LVS를 구축하느라 추가한 가상 IP(192.168.56.10)를 LVS 서버에서는 제거해야 한다.

# 가상 IP 제거
$ sudo ifconfig eth0:0 down

위의 LVS 구축 과정중 /etc/network/interfaces 파일에 가상 IP를 직접 추가했다면 파일을 열고 제거한다.

이제 설치 및 설정이 끝났다. Heartbeat를 실행해보자.

# Heartbeat 실행
$ sudo service heartbeat start
Starting High-Availability services: INFO:  Resource is stopped
Done

‘Bad nodename’이라는 오류가 발생하면 lvs1, lvs2 서버의 hostname이 각각 lvs1, lvs2가 맞는지 확인한다.

만약 hostname이 잘못되어서 변경해야 한다면 아래의 링크를 참고하여 hostname을 바꾼다.

http://www.subvs.co.uk/ubuntu_change_hostname_computer_name

Heartbeat 동작여부 확인하기

lvs1, lvs2 서버 각각 ifconfig를 입력한다. lvs1에는 eth0:0 장치가 있지만 lvs2에는 없다.

$ ifconfig
...
eth0:0    Link encap:Ethernet  HWaddr 08:00:27:d6:41:62  
          inet addr:192.168.56.10  Bcast:192.168.56.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
...

이때 lvs1을 종료시킨 후 lvs2에서 ifconfig를 입력하면 lvs2에 eth0:0이 생성되어 있을 것이다.

과정이 무척 길고 어려워 보이지만 네트워크 설정과 hostname만 실수하지 않으면 어렵지 않게 구축할 수 있을 것이다.