5.3. 미러링 서버간의 부하 공유

서버가 히트수를 감당하지 못할 경우, 그 해결책으로써 다수의 미러링 서버를 운영하여, 부하를 분담시키는 방법을 생각할 수 있다. 하지만, 이러한 방법은 미러링 서버를 사용자에게 홍보하여 서버의 부하가 이동하는데 실질적으로 많은 시간이 소요되고, 적절한 부하 분배를 기대하기가 힘이든 문제가 있다. 그래서 전화국의 대표 번호 서비스와 같이, 사용자의 요청을 각각의 미러링 서버로 연결해주는 대표 도메인을 생각할 수 있는데, 여기에서 그 방법을 소개한다. Shuffle Addresses이라 불리는 이 특별한 기법은 BIND 4.9 부터 지원된다.

www             180     IN      A       210.105.79.101
                180     IN      A       210.105.79.102
                180     IN      A       210.105.79.103

하나의 호스트명에 여러개의 IP주소를 주었을 경우, 네임서버는 해당 도메인에 대해 다음과 같이 라운드 로빈 방식으로 응답 한다.

$ nslookup www.nobreak.com
Name:    www.nobreak.com
Addresses:  210.105.79.101, 210.105.79.102, 210.105.79.103

$ nslookup www.nobreak.com
Name:    www.nobreak.com
Addresses:  210.105.79.102, 210.105.79.103, 210.105.79.101

$ nslookup www.nobreak.com
Name:    www.nobreak.com
Addresses:  210.105.79.103, 210.105.79.101, 210.105.79.102

이것이 로드 발랜싱(Load Balancing)은 아니지만, 클라이언트는 3대의 서버에 어느정도 공평하게 접속되므로, 부하를 공유하는 효과를 얻을 수 있고, 또한 외부로는 대표 도메인만을 알리면 되므로, 서버의 확장 및 축소에 유연하다. 본 기법을 적용할 때에는 라운드 로빈이 지원되지 않는 네임서버를 고려하여 TTL을 낮게 책정(TTL이 만기하여 다시 요청이 들어오도록)하는 것도 좋다.

또하나의 방법으로는 다수의 CNAME을 연결하는 방법이다. 원칙적으로 다수의 CNAME은 거부되기 때문에, 반드시 다음과 같이 부트 파일에 별도의 옵션을 주어야 한다.

options {
        multiple-cnames yes;
};

이것은 BIND-8 에서만 가능하며, 대표적으로 YAHOO!(www.yahoo.com)가 이러한 방법으로 운영된다.

www             180     IN      CNAME   www1.nobreak.com.
                180     IN      CNAME   www2.nobreak.com.
                180     IN      CNAME   www3.nobreak.com.
www1            180     IN      A       210.105.79.101
www2            180     IN      A       210.105.79.102
www3            180     IN      A       210.105.79.103
		180	IN	A	210.105.79.104
		180	IN	A	210.105.79.105

다수의 A 레코드 방식은 Resolver의 로컬 NS가 Authority NS에서 다수의 IP(라운드 로빈된)를 넘겨받아 캐쉬에 저장해 둔 후 자체적으로도 라운드 로빈처리를 해주지만, 다수의 CNAME 방식은 로컬 NS가 한 개의 주소만을 넘겨받기 때문에 자체 라운드 로빈이 불가능하며, TTL이 만기될 때까지 해당 Resolver들은 하나의 주소를 사용하게 된다.

* Authority NS에 직접 질의하였을 경우
$ nslookup  www.nobreak.com  ns.nobreak.com
Name:    www1.nobreak.com
Address:  210.105.79.101
Aliases:  www.nobreak.com

$ nslookup  www.nobreak.com  ns.nobreak.com
Name:    www2.nobreak.com
Address:  210.105.79.102
Aliases:  www.nobreak.com

$ nslookup  www.nobreak.com  ns.nobreak.com
Name:    www3.nobreak.com
Address:  210.105.79.103, 210.105.79.104, 210.105.79.105
Aliases:  www.nobreak.com
* 네임서버의 캐쉬(Third Party Name Server)에서 받아올 경우
$ nslookup  www.nobreak.com  ns.kornet.ne.kr
Name:    www2.nobreak.com
Address:  210.105.79.102
Aliases:  www.nobreak.com

$ nslookup  www.nobreak.com  ns.kornet.ne.kr
Non-authoritative answer:
Name:    www2.nobreak.com
Address:  210.105.79.102
Aliases:  www.nobreak.com

$ sleep 180  (TTL이 만기될 때 까지 기다린 후)

$ nslookup  www.nobreak.com  ns.kornet.ne.kr
Non-authoritative answer:
Name:    www3.nobreak.com
Address:  210.105.79.103, 210.105.79.104, 210.105.79.105
Aliases:  www.nobreak.com

$ nslookup  www.nobreak.com  ns.kornet.ne.kr
Non-authoritative answer:
Name:    www3.nobreak.com
Address:  210.105.79.104, 210.105.79.105, 210.105.79.103
Aliases:  www.nobreak.com

$ nslookup  www.nobreak.com  ns.kornet.ne.kr
Non-authoritative answer:
Name:    www3.nobreak.com
Address:  210.105.79.105, 210.105.79.103, 210.105.79.104
Aliases:  www.nobreak.com

참고로, 로드 밸런싱을 구현하기 위해서는 시스템의 부하에 따라 라우팅을 조정하는 스위치나 클러스터링(Clustering) 솔루션을 통하여야 한다.