강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

DNS로 구현하는 서버 부하분산기능 설정법(Round-Robin Load Sharing Through DNS)

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

DNS로 구현하는 서버 부하분산기능 설정법(Round-Robin Load Sharing Through DNS)

 

 

 

 

 

이번에는 DNS를 이용한 부하 분산기능에 대해서 알아보도록 하겠다.

 

 

 

 

 이 설정 또한 특정도메인의 zone파일을 이용하여 설정한다.

 

 

 

 

 BIND에서 제공하는 조금은 특별한 기능이라고 할 수 있으며 이 기능의 정식이름은 “Round-Robin Load Sharing Through DNS”라고 하는 것으로 DNS서버를 이용한 Load balancing 구현하는 방법이며 BIND매뉴얼에는 “Round Robin Domain Name Service”라는 이름으로 소개되어있다.

 

 

 

 

 

 

그럼 우선 작업하기 전에 부하분산의 필요성과 설정상황을 정리해보도록 하겠다.

 

 

 

 

 한마디로 이 방식은 하나의 도메인에 대하여 여러개의 IP주소들이 교대로 응답하도록하는 방식이다.

 

 

 

 

 즉 하나의 도메인에 대한 다중 IP주소할당방식이다.

 

 

 

 

 여기서 우리는 특정도메인의 zone파일내에서 하나의 도메인에 여러개의 IP주소가 매핑되도록 설정하는 것이다.

 

 

 

 

  DNS는 단지 여러 주소간에 순차적으로 응답하도록 순환할 뿐이다.

 

 

 

 

 물론 각각의 IP주소들은 각각 다른 서버에 독립적으로 할당된다.

 

 

 

 

 

 

따라서 할당된 여러개의 IP주소들 가운데 하나의 IP주소를 가진 서버가 다운되거나 장애가 발생하더라도 다른 IP주소들이 차례대로 응답하므로 전체적인 서비스는 유지되게 된다.

 

 

 

 

  하지만 이경우 DNS는 어떤 서버에서 장애가 발생하였는가를 알지못하기 때문에  간혹 여러명의 접속자들 가운데 한명의 접속자는 접속이 안되는 경우가 발생할 수도 있지만 다시 접속하면 정상적인 접속이 이루어진다.

 

 

 

 

 DNS가 지능적으로 움직이는 것이아니라 정적으로 지정되어있는IP주소들을 차례대로 매핑시키는 역할만을 할 뿐이다.

 

 

 

 

 

참고로 하드웨어(Hardware)적으로 부하분산 기능을 위한 지능적인 장비들은 다음과 같은 것들이 있다.

 

 

 

 

 

   - Web Director(redware.com)
   - Ace Director(alteon.com)
   - Local Director(cisco.com)

 

 

 

, 그럼 DNS를 이용한 “Round Robin Domain Name Service”기능을 구현해보도록 하겠다.

 

 

 

 

 한대의 서버만으로 웹사이트를 운영하고있을 경우에 방문자수가 폭발적으로 증가하면 한대의 서버만으로는 도저히 그 부하를 견디기 어려울 경우가 있다.

 

 

 

 

 이런 경우에 이 기능을 이용하여 여러대의 서버에서 동일한서비스를 하도록 설정하여 부하를 분산할 수 있다.

 

 

 

 

 이 작업을 위하여 다음과 같은 상황을 가정하도록 하겠다.

 

 

 

 

 

 

① 서버 1대로 운영하던 웹사이트를 5대의 서버로 나누어 운영하려 한다.

 

 

 

 

 

5대의 서버는 모두 동일한 컨텐츠를 보유하고 있다.

 

 

 

 

  5대중 어떤 서버로 방문을 하더라도 동일한 내용이 로딩되어야 한다.

 

 

 

 

 

③ 방문자들이 웹사이트로 방문했을 경우에는 5대의 서버가 순차적으로 응답을 하도록 설정해야 한다.

 

 

 

 

 

④ 설정하려고하는 웹사이트의 도메인 주소가 www.owner.co.kr이라고 가정하겠다.

 

 

 

 

 

 

현재 설정하려고하는 환경들이 이해가 되었는가?  이해 안되었다면 다음을 보자.

 

887a749963dafa6fbcb8db481434443d_1689041723_012.jpg
 

 

위의 그림과 같이 분산시스템을 설정하기 위하여 다음과 같은 시스템정보를 참고하여 부하분산을 설정할 것이다.

 

 

 

 

 

 

서버명

IP주소

도메인명

웹서버1

192.168.0.231

www.owner.co.kr

웹서버2

192.168.0.232

www.owner.co.kr

웹서버3

192.168.0.233

www.owner.co.kr

웹서버4

192.168.0.234

www.owner.co.kr

웹서버5

192.168.0.235

www.owner.co.kr

 

 

 

 

위의 그림에서 보면 www.owner.co.kr을 방문하는 방문자들은 동일한 서버 5대가 차례로 응답한다는 사실을 전혀 알 수가 없다.

 

 

 

 

 즉 서버5대가 차례대로 돌아가면서 응답하게된다는 의미이다.

 

 

 

 

 이런 설정을 Round Robin방식이라고 한다.

 

 

 

 

 

 

사실 너무 간단한 상황 설정이지만 이해도를 높이기 위하여 장황하게 설명한 것 같다.

 

 

 

 

 하지만 이제 상황설정과 목적하는 바를 정했으므로 DNS설정을 해보도록하겠다.

 

 

 

 

 

 

owner.co.kr의 네임서비스를 해주는 네임서버에는 /var/named/owner.co.kr.zone파일이 다음과 같이 생성되어야 한다.

 

 

 

 

 

 

[root@sulinux ~]#cat /var/named/owner.co.kr.zone

$TTL 86400

@       IN      SOA     localhost root.localhost (

                        2019041201      ; Serial

                        3H              ; Refresh

                        15M             ; Retry

                        1W              ; Expire

                        86400)            ; Minimum

;

        IN      NS      ns.linux.co.kr.         ;

        IN      NS      ns2.linux.co.kr.        ;

        IN      MX      10 mail.owner.co.kr.    ;

        IN      MX      20 mail2.owner.co.kr.   ;

        IN      A       192.168.0.231           ;

www     IN      A       192.168.0.231           ; 첫번째 웹서버 (서버1)

www     IN      A       192.168.0.232           ; 두번째 웹서버 (서버2)

www     IN      A       192.168.0.233           ; 세번째 웹서버 (서버3)

www     IN      A       192.168.0.234           ; 네번째 웹서버 (서버4)

www     IN      A       192.168.0.235           ; 다섯번째 웹서버 (서버5)

[root@sulinux ~]#

 

 

 

 

위의 설정을 보면 알겠지만 하나의 도메인에 A 레코드는 여러 개를 사용하였다.

 

 

 

 

  즉 위의 설정은 굉장히 단순하다.

 

 

 

 

 www.owner.co.kr IP주소 5개를 A레코드를 이용하여 차례대로 설정한 것이다.

 

 

 

 

 이렇게 설정한 후에는 이를 적용하기 위하여 다음과 같이 named를 재시작해주기 바란다.

 

 

 

 

 

 

[root@sulinux ~]#/etc/rc.d/init.d/named restart

named를 정지 중: [  OK  ]

named를 시작 중: [  OK  ]

[root@sulinux ~]#

 

 

 

이제 순차대로 응답하는지 확인해보도록 하겠다.

 

 

 

 

 제대로 응답을 한다면 www.owner.co.kr이라는 도메인으로 접속했을 때에 IP주소가 차례대로 응답을 해야할 것이다.

 

 

 

 

 이를 확인하는 방법은 여러가지가 있겠지만 그중 에서 “ping 도메인명과 같이 “ping www.owner.co.kr”을 실행하여 5대의 서버가 순차대로 응답하는가를 확인하면 될 것이다.

 

 

 

 

 그럼 확인해보도록 하겠다.

 

 

 

 

 

먼저, 첫번째 www.owner.co.kr ping테스트한 것이다.

 

 

 

 

 그 결과 192.168.0.231 서버가 응답하였다는 것을 확인하였다.

 

 

 

 

 

 

[root@sulinux named]#ping www.owner.co.kr

PING 192.168.0.231 (192.168.0.231) 56(84) bytes of data.

64 bytes from 192.168.0.231: icmp_seq=1 ttl=64 time=0.033 ms

64 bytes from 192.168.0.231: icmp_seq=2 ttl=64 time=0.062 ms

 

--- 192.168.0.231 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1000ms

rtt min/avg/max/mdev = 0.033/0.047/0.062/0.016 ms

[root@sulinux named]#

 

 

 

 

두번째 www.owner.co.kr ping테스트한 것이다.

 

 

 

 

 그 결과 192.168.0.232 서버가 응답하였다는 것을 확인하였다.

 

 

 

 

 

 

[root@sulinux named]# ping www.owner.co.kr

PING 192.168.0.232 (192.168.0.232) 56(84) bytes of data.

64 bytes from 192.168.0.232: icmp_seq=1 ttl=64 time=0.053 ms

64 bytes from 192.168.0.232: icmp_seq=2 ttl=64 time=0.046 ms

64 bytes from 192.168.0.232: icmp_seq=3 ttl=64 time=0.032 ms

 

--- 192.168.0.232 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 1999ms

rtt min/avg/max/mdev = 0.032/0.043/0.053/0.011 ms

[root@sulinux named]#

 

 

 

 

세번째 www.owner.co.kr ping테스트한 것이다.

 

 

 

 

 그 결과 192.168.0.233 서버가 응답하였다는 것을 확인하였다.

 

 

 

 

 

 

[root@sulinux named]# ping www.owner.co.kr

PING 192.168.0.233 (192.168.0.233) 56(84) bytes of data.

64 bytes from 192.168.0.233: icmp_seq=1 ttl=64 time=0.049 ms

64 bytes from 192.168.0.233: icmp_seq=2 ttl=64 time=0.035 ms

64 bytes from 192.168.0.233: icmp_seq=3 ttl=64 time=0.028 ms

 

--- 192.168.0.233 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2001ms

rtt min/avg/max/mdev = 0.028/0.037/0.049/0.010 ms

[root@sulinux named]#

 

 

 

 

네번째 www.owner.co.kr ping테스트한 것이다.

 

 

 

 

 그 결과 192.168.0.234 서버가 응답하였다는 것을 확인하였다.

 

 

 

 

 

 

[root@sulinux named]# ping www.owner.co.kr

PING 192.168.0.234 (192.168.0.234) 56(84) bytes of data.

64 bytes from 192.168.0.234: icmp_seq=1 ttl=64 time=0.023 ms

64 bytes from 192.168.0.234: icmp_seq=2 ttl=64 time=0.036 ms

 

--- 192.168.0.234 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1000ms

rtt min/avg/max/mdev = 0.023/0.029/0.036/0.008 ms

[root@sulinux named]#

 

 

 

 

다섯번째 www.owner.co.kr ping테스트한 것이다.

 

 

 

 

 그 결과 192.168.0.235 서버가 응답하였다는 것을 확인하였다.

 

 

 

 

 

 

[root@sulinux named]# ping www.owner.co.kr

PING 192.168.0.235 (192.168.0.235) 56(84) bytes of data.

64 bytes from 192.168.0.235: icmp_seq=1 ttl=64 time=0.021 ms

64 bytes from 192.168.0.235: icmp_seq=2 ttl=64 time=0.047 ms

 

--- 192.168.0.235 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 999ms

rtt min/avg/max/mdev = 0.021/0.034/0.047/0.013 ms

[root@sulinux named]#

 

 

 

 

이번 테스트의 결과로 www.owner.co.kr도메인을 누군가가 요청하였을 때에 5대의 서버가 차례대로 응답하게 된다는 것을 알 수 있다.

 

 

 

 

 이를 좀 더 명확하게 확인해보기 위하여 다음과 같이 nslookup을 이용하여 www.owner.co.kr도메인에 대한 정보를 조회해보도록 하겠다.

 

 

 

 

  

 

[root@sulinux ~]#nslookup

>

> www.owner.co.kr

Server:         192.168.0.250

Address:        192.168.0.250#53

 

Name:   www.owner.co.kr

Address: 192.168.0.234

Name:   www.owner.co.kr

Address: 192.168.0.235

Name:   www.owner.co.kr

Address: 192.168.0.231

Name:   www.owner.co.kr

Address: 192.168.0.232

Name:   www.owner.co.kr

Address: 192.168.0.233

>

> exit

 

[root@sulinux ~]#

 

 

 

 

위의 결과를 보면 nslookup을 실행한 후에 “server ns.bible.co.kr”로 대상 네임서버를 지정하였다.

 

 

 

 

 그리고 www.owner.co.kr에 대한 네임서비스를 요청한 결과 모두 5개의 IP주소가 응답한다는 것을 알 수 있다.

 

 

 

 

 

 

이제 모든 설정이 끝났다.

 

 

 

 

 5대의 서버들이 모두 정상적으로 작동하고있을 것이다.

 

 

 

 

  그리고 다음은 이번 절에서 설명한 DNS를 이용한 부하분산시스템을 구축할 때에 참고하면 도움이 되는 두가지를 언급한 것이다.

 

 

 

 

 자세히 읽어보기 바란다.

 

 

 

 

 


첫번째 참고사항 : NFS를 이용한 데이터공유


이번에 설명한 DNS의 부하분산기능에서 서버1번부터 5번까지의 모든 서버들에는 모두 APACHE가 설치되어 있어야 한다.

 

 

 

 

 그리고 5대 모두 동일한 홈페이지 데이터를 공유해야한다.

 

 

 

 

 이를 구현하려면 파일서버를 별도로 구축하고 1번부터 5번까지의 5대의 서버들이 파일서버와 NFS로 연결되어 있어야 한다.

 

 

 

 

 그리고 1번부터 5번까지의 서버내의 APACHE에서 홈페이지의 위치를 모두 동일하게 설정(:/home/owner)하고 파일서버의 특정위치에 모두 NFS로 마운트시켜주면 된다.

 

 

 

 

 


두번째 참고사항 : zone파일내의 개별 A레코드 캐싱값

다음은 이번에 생성한 /var/named/owner.co.kr.zone파일내에서 설정한 A레코드들의 캐싱값문제이다.

 

 

 

 

 위의 예에서는 SOA절에서 설정한 Minimum값에 따라서 캐싱데이터를 86400초만큼 보관하지만 사실 이는 그다지 좋은 방법은 아니다.

 

 

 

 

 즉 다음과 같이 각각의 A레코드들에 대한 개별 캐싱값을 0으로 설정할 수 있다.

 

 

 

 

 

 

[root@sulinux named]#cat /var/named/owner.co.kr.zone

$TTL 86400

@       IN      SOA     localhost root.localhost (

                        2019041201      ; Serial

                        3H              ; Refresh

                        15M             ; Retry

                        1W              ; Expire

                        86400)          ; Minimum

;

        IN      NS      ns.linux.co.kr.         ;

        IN      NS      ns2.linux.co.kr.        ;

        IN      MX      10 mail.owner.co.kr.    ;

        IN      MX      20 mail2.owner.co.kr.   ;

        IN      A       192.168.0.231           ;

www     0       IN      A       192.168.0.231           ; 첫번째 서버

www     0       IN      A       192.168.0.232           ; 두번째 서버

www     0       IN      A       192.168.0.233           ; 세번째 서버

www     0       IN      A       192.168.0.234           ; 네번째 서버

www     0       IN      A       192.168.0.235           ; 다섯번째 서버

[root@sulinux named]#

 

 

 

 

위의 예를보면 5개의 www행의 캐싱값이 모두 0이다.

 

 

 

 

 이것은 캐싱을 하지 말라는 의미로서 DNS Round-Robin기능을 이용할 때에 가능한 개별 레코드의 값은 0으로 설정하여 캐싱되지 않도록하는 것이 좋다.

 

 

 

 

 그러면 www.owner.co.kr로 접속할 때마다 DNS에 질의하게 될 것이며 이때마다 순차대로 응답하게 될 것이다.

 

 

 


관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,037 명
  • 현재 강좌수 :  35,810 개
  • 현재 접속자 :  106 명