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만 실수하지 않으면 어렵지 않게 구축할 수 있을 것이다.

HA-LVS 구축하기 – Ubuntu 14.04 + Ipvsadm + Heartbeat”에 대한 16개의 생각

  1. 김일환

    안녕하세요 위에 글을보고 lvs를 라즈베리파이에 구현해보는 중인 학생입니다. 하는 중에 궁금한 점이있어서요 질문좀 해도될까요?? ㅜㅜ

    하나는 맨위에 lvs 서버랑 웹서버 사설아이피 적어놓으신게 먼저 사설아이피를 고정해놓고 진행해야하는 거죠??

    그리고 또 하나는요 로드벨런싱 lvs 서버부분에서요 제가 2개의 web 서버를 놓고 192.168.10.20 하고 192.168.10.30으로 했는데요 20은 나오는데 30이 나오질 않아서 혹시 아시는게 있으시면 조언좀 주시면 정말정말 감사하겠습니다. ㅜㅜ 감사합니다.

    응답
    1. A2 글쓴이

      네 사설IP는 고정되어 있어야 합니다.

      어디에 20이 나오는데 30이 나오지 않는다는 것 인가요?

      아래 명령어를 입력했을때 30이 나오지 않나요?
      $ sudo ipvsadm -ln –rate
      그렇다면 설정 파일을 확인후 ipvsadm 을 재시작 하세요.

      아니면 웹브라우저상에서 20만 나온다는 뜻인가요?
      그렇다면 sysctl의 ARP 설정을 확인하시고 ARP 캐쉬도 삭제해보세요.

      저도 제가 쓴 글의 내용대로 여러번 서버에 설치해 봤기 때문에 차근차근 따라 해보시면 문제없이 동작할 겁니다.
      보통 무슨 문제가 있다면 작은 실수거나 또는 캐쉬 때문 입니다.

      응답
      1. 김일환

        알려주시는데 늦게 댓글을 달아서 죄송합니다. ㅜㅜ

        글이 장황해질것 같지만 자세히 말씀드리겠습니다.
        일단은 제가 구현하는 것은 웹서버에 로드벨런서가 작업을 나눠줄때(?) 인터넷을 통해서가 아니라 스위치를 통해서 로드밸런서와 각 노드들이 연결되어 있고 무선랜카드에서 뿌려주는 와이파이를 이용해 핸드폰이나 컴퓨터로 접속할 계획입니다.

        그래서 일단 로드밸런서에 usb ethernet을 꽂았구요
        eth0 은 192.168.10.11 (기존) <- 위에서 말씀하신 가상ip (?)
        eth1 은 192.168.10.10 (usb eth) 192.168.10.20:80 Route 1 0 0

        이렇게 나오고 192.168.10.30 에 대한게 안나와서 질문을 드린 것입니다. ㅠㅠ
        연결상태는 지금 192.168.10.10에 인터넷을 연결해 놓았구요
        192.168.10.11 에는 스위치로 이더넷케이블을 연결해놓았습니다.
        다른 worker 노드1,2는 아직 연결을 안해도 상관이 없을것 같아서 연결은 해놓지 않은 상태에서 위의 과정을 실행했습니다. ㅜㅜ 왜그런지 혹시 아시면 답변해주시면 정말정말 감사하겠습니다.

        긴글을 읽어주셔서 감사하고 답장해주셔서 감사합니다. 늦게 답글을 올려서 죄송합니다.

        응답
        1. 김일환

          (수정이 없어서 다시 올립니다.ㅜㅜ;;) 알려주시는데 늦게 댓글을 달아서 죄송합니다. ㅜㅜ

          글이 장황해질것 같지만 자세히 말씀드리겠습니다.
          일단은 제가 구현하는 것은 웹서버에 로드벨런서가 작업을 나눠줄때(?) 인터넷을 통해서가 아니라 스위치를 통해서 로드밸런서와 각 노드들이 연결되어 있고 무선랜카드에서 뿌려주는 와이파이를 이용해 핸드폰이나 컴퓨터로 접속할 계획입니다.

          그래서 일단 로드밸런서에 usb ethernet을 꽂았구요
          eth0 은 192.168.10.11 (기존) <- 위에서 말씀하신 가상ip (?)
          eth1 은 192.168.10.10 (usb eth) ipvsadm -Ln 을 입력했을때

          (생략) Forward Weight ActiveConn InActConn
          TCP 192.168.10.11:80 rr
          -> 192.168.10.20:80 Route 1 0 0

          이렇게 나오고 192.168.10.30 에 대한게 나오질 않아서 질문을 드린 것입니다. ㅠㅠ
          연결상태는 지금 192.168.10.10에 인터넷을 연결해 놓았구요
          192.168.10.11 에는 스위치로 이더넷케이블을 연결해놓았습니다.
          다른 worker 노드1,2는 아직 연결을 안해도 상관이 없을것 같아서 연결은 해놓지 않은 상태에서 위의 과정을 실행했습니다. ㅜㅜ 왜그런지 혹시 아시면 답변해주시면 정말정말 감사하겠습니다.

          긴글을 읽어주셔서 감사하고 답장해주셔서 감사합니다. 늦게 답글을 올려서 죄송합니다.

          응답
          1. A2 글쓴이

            죄송하지만 댓글만으로는 네트워크가 어떻게 구성되어 있는지 알기가 어렵네요.
            무선랜카드가 와이파이 역할을 하려면 AP모드가 되야하지 않나요? 그렇게 되면 스위치와 서로 다른 네트워크가 구성되어 있을텐데 동일한 네트워크 IP 대역이면 문제가 있지 않나요?
            이 부분은 LVS 설정을 떠나서 네트워크 구성부터 살펴봐야 하지 않을까 싶습니다.

  2. 김일환

    답변달아주셔서 감사합니다.

    일단 네트워크 구성은 위에 링크걸어주신 “패킷 포워딩 방식별 네트워크 설정 참고 자료” 에서 B.NAT 방식과 똑같은 방법으로 연결을 할 것입니다. ㅠ 그리고 참고자료에 NAT방식일 경우에 ipvsadm 설정하는 방식으로도 해보았지만 역시나 ipvsadm -Ln을 입력하였을때 192.168.10.30이 나오지 않았습니다.

    네트워크 구성에서는 참고자료에 있는 것과 정말 똑같이 하는 거여서.. ㅜㅜ 다시 네트워크 구성을 잘 해보겠습니다. ㅜ
    혹시 제가 작업을 할때는 로드밸런서만 인터넷과 스위치에 연결되어있고 스위치에는 아직 웹서버 노드 1, 2를 연결하지 않은상황에서 작업을 했는데 혹시 그게 문제가 되는건가요?

    귀찮은 질문을 계속드려서 죄송합니다. ㅜ

    응답
    1. A2 글쓴이

      제가 쓴 글은 DR 방식에 최적화 되었고 DR에서만 테스트 한 것이라서 NAT일 경우 어떤 문제가 있을지 잘 모르겠습니다.
      저는 실제 서버에 적용하기 이전에 VirtualBox로 가상머신 4대를 이용하여 테스트 했습니다.
      가상머신을 통해서 연습을 하신후 실제 서버에 적용해보시는 것도 고려해보세요.

      응답
      1. 김일환

        감사합니다 .마지막으로 한가지만 더 질문드려도될까요?

        혹시 커널은 새로 다운받으셔서 네트워크 세팅을 하셨는지 궁금합니다.

        http://www.linuxvirtualserver.org 에 있는 글을 읽어봤는데 커널 옵션을 세팅을 하더라구요

        혹시 그 부분을 수정하신뒤에 위의 내용을 하신건가요??

        답변해주셔서 감사합니다.

        응답
        1. A2 글쓴이

          커널은 건드리지 않았습니다.
          순수한 우분투 14.04 서버에서 작업한 것으로 이 글에서 빠진 내용은 없습니다.
          VirtualBox를 이용해서 이 글과 똑같이 해보시면 동작을 확인하실 수 있으실 겁니다.

          응답
  3. 손무열

    지나가다가 궁금한 점이 있어서 질문 좀 드리겠습니다.

    LVS 가상 IP: 192.168.56.10 가상IP를 설정하고 web1, web2번에도 똑같이 가상 IP: 192.168.56.10 을 지정을 해 주면 외부에서 클라이언트가 어떻게 192.168.56.10을 찾아 오죠?? 같은 아이피가 3개인데??
    죄송하지만 답변 좀 주시면 감사하겠습니다. 제가 아직 초보라서 이해가 잘 되질 않네요..

    응답
    1. 손무열

      질문이 난해한거 같아서 보충 질문좀 하겠습니다.
      192.168.56.10의 아이피가 3개인데 LVS에만 계속 아이피가 붙는다는 보장이 있나요?? web1, web2번도 192.168.56.10번의 아이피를 가지고 있는데..여기로 붙어버리면 어떻게 하죠??

      응답
      1. A2 글쓴이

        이 글을 잘 읽어보시면 web1, web2 설정시 ARP를 끄는 것을 확인하실 수 있습니다.

        응답
  4. anonymous

    질문하나 드리겠습니다.

    구성을 달리해서 앞단에 LVS 없이 웹서버 2대로 LVS를 구성하려고 합니다.
    그러니까 웹 서버1이 LVS 1 역할도 같이 하고 웹 서버 2도 LVS 2 역할을 하도록 하는 것이죠.

    구성을 해 보았는데 2대로도 정상적으로 동작이 되는 것 같습니다.
    또한, 2대로 구성하였을 경우 heartbeat 설정 없이 1대가 down 되도 다른 쪽으로 통신이 됩니다.

    실제적으로도 이런 식으로 구성하여 사용에 문제가 없는지요?
    또한, 이렇게도 많이 사용하는지 궁금하네요.

    응답
    1. A2 글쓴이

      LVS랑 웹서버를 하나로 묶어서 구성하는 방식은 좋은 방법이 아닙니다.
      단편적인 테스트를 해보셨을때 문제가 없어 보이시겠지만 매우 위험한 구성 입니다.

      LVS를 별도로 앞에 두는건 뒤에 웹서버를 여러개 구성하여 LVS를 통해 웹서버 로드밸런싱을 하기 위함입니다. 그런데 이 둘을 합치면 웹서버에 부하가 발생시 LVS도 서비스를 제대로 할 수 없습니다.

      또한 heartbeat를 통해서 LVS1이 죽으면 LVS2가 동작하다가 다시 LVS1이 살아나면 LVS2는 대기상태로 돌아가는 그런 구성을 해야 하는데 heartbeat를 사용하지 않고 LVS만으로는 이런 동작을 할 수가 없습니다.

      이 글은 예제라서 웹서버가 2대지만 실무에서 10대라고 한다면 10대 모두 LVS를 설치 할 수는 없겠죠?

      서버 대수가 부족해서 그러신다면 차라리 LVS1, WEB1(+LVS2), WEB2 방식으로 운영하시길 권장해드립니다. LVS1이 죽어서 살리는 동안 WEB1이 LVS2 역할을 하면서 잠시 버텨주는 것이죠. 또는 메일서버 등 웹 서버가 아닌 서버를 LVS2 겸용으로 쓰시면 좋습니다. LVS는 컴퓨터 사양이 낮아도 잘 동작하므로 되도록 별도의 서버로 구축하시기를 권장해드립니다.

      응답
  5. anonymous

    답변 감사드립니다.

    좀 덧붙이자면 웹 서버가 2대로 고정이 된 상태에서 앞단에 LVS 서버 1대를 두자니
    LVS 서버가 장애가 날 경우 웹서버 2대가 먹통이 될 수 있으니

    차라리 LVS 1대를 없애고 웹서버 2대로 LVS 까지 겸하면 서버대수도 아끼고
    안정성 면에서도 좋을 것 같아 질문을 드렸습니다.

    제한적인 환경이긴 한데 고려해 볼만하다 싶어 질문을 드렸었는데 이 역시 만만치 않군요…
    블로그 잘 보고 갑니다~

    응답
  6. 무무스

    안녕하세요 제가 질문이 있어서 이렇게 질문을 드리게 되었습니다.
    HA를 구성하는데 꼭 LVS 그러니까 가상 server를 만들어서 해야 되는 건가요??
    두대의 고정 ip를 가진 컴퓨터로도 가능한가요?

    응답

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다