(기사등록일 : 2001-07-30 18:54:06)

클러스터 관리자는 클러스터 시스템에서 가장 중요한 역할을 하는 것이다. 실제로 여기서 다룰 클러스터링은 부하분산 즉 로드밸런싱에 관한 부분이다. 이것은 관리자의 부하 분산 방식에 따라 그 효과는 천차만별로 달라진다. 부하 분산 작동 방식에는 직접포워딩, IP터널링, NAT의 세가지 방식이 있다. 이 세가지에 대해서 자세히 알아보도록 하겠다.

    직접포워딩 (Direct Routing)

    1. 사용자가 서버 클러스터에서 제공하는 서비스에 접근할때, 가상 IP 주소(가상 서버의 IP 주소)로 향하는 요구 패킷이 부하분산서버로 간다.
    2. 부하분산서버(LinuxDirector)에서 패킷의 목적지 주소와 포트 번호를 검사한다.
    3. 내용이 가상 서버 서비스와 일치하면 스케쥴링 알고리즘에 따라 클러스터에서 실제 서버를 선택하고, 접속을 기록하는 해쉬 테이블에 새로운 접속을 추가한다.
    4. 부하분산서버에서 선택한 서버로 직접 패킷을 전송한다.
    5. 들어오는 패킷이 이러한 접속에 해당하고 해쉬 테이블에서 선택한 서버를 찾을 수 있으면 패킷은 다시 서버로 직접 전송된다.
    6. 서버에서 전송(포워딩)된 패킷을 받으면, 서버는 패킷에서 알리아스 인터페이스나 지역 소켓의 주소를 찾아서 요청을 처리한다.
    7. 결과를 사용자에게 직접 전송한다.
    8. 접속이 해제되거나 시간을 초과하면, 해쉬 테이블에서 연결 기록을 제거한다.
     

    부하분산 서버는 단순히 데이터 프레임의 MAC 주소만 선택한 서버로 바꾸며 이를 다시 LAN에 재전송한다. 이런 이유 때문에 부하분산 서버와 각 서버가 단일한 물리적 세그먼트안에서 연결되어야한다. 부하분산 서버를 통해 전달된 필요가 없기 때문에 빠르고 오버헤드가 적다.

    IP 터널링

    IP 터널링 (IP encapsulation)은 IP 데이터그램안에 IP 데이터그램을 넣는 기술로서, 어떤 IP 주소를 향하는 데이터그램을 감싸 다른 IP 주소로 재지향할 수 있다. IP encapsulation은 현재 엑스트라넷, 모빌-IP, IP-멀티캐스트, tunnled 호스트나 네트웍 등에 일반적으로 사용되고 있다.

    1. 사용자가 서버 클러스터에서 제공하는 서비스에 접근할때, 가상 IP 주소(가상 서버의 IP 주소)로 향하는 요구 패킷이 부하분산서버로 간다.
    2. 부하분산서버에서 패킷의 목적지 주소와 포트 번호를 검사한다.
    3. 내용이 가상 서버 서비스와 일치하면 스케쥴링 알고리즘에 따라 클러스터에서 실제 서버를 선택한다.
    4. 접속을 기록하는 해쉬 테이블에 새로운 접속을 추가한다.
    5. 부하분산서버에서 IP 데이터그램안에 패킷을 감싸 넣고(encapsulate) 실제 서버로 전송한다.
    6. 들어오는 패킷이 이러한 접속에 해당하고 해쉬 테이블에서 선택한 서버를 찾을 수 있으면 패킷을 감싸넣어 선택한 서버로 전송을 할 것이다.
    7. 서버에서 감싸넣어진 패킷을 받으면 패킷을 다시 풀고 요청을 처리한다음 최종적으로 실제 서버의 라우팅 테이블에 따라 사용자에게 직접 결과를 돌려준다.
    8. 접속이 해제되거나 시간을 초과하면, 해쉬 테이블에서 연결 기록을 제거한다.

    IP터널링을 이용하는 경우, 부하분산서버는 단지 들어오는 요청에 대하여 각기 다른 실제 서버로 할당만을 할 뿐이고 실제 서버가 사용자에게 직접 응답을 보낸다. 그래서 부하분산서버에서 더 많은 요청를 처리할 수 있으며 100개 이상의 실제 서버를 다를 수 있다. 또한 부하분산서버자체가 시스템의 병목지점이 되는 현상도 없앨 수 있다. 이렇게 IP 터널링을 이용하면 부하분산서버에서 사용할 수 있는 서버 노드의 수를 크게 늘릴 수 있다. 설사 부하분산서버가 100Mbps full-duplex(전복조) 네트웍 어댑터를 가졌어도 가상 서버의 최대 처리량은 1Gbps에 달할 수 있다.

    IP 터널링의 이러한 특성을 이용하면 아주 높은 성능의 가상 서버를 구축할 수 있으며, 특히 가상 프록시 서버에 적합하다. 프록시 서버에서 요청을 받는 경우, 인터넷에 직접 연결하여 개체를 가져오고 그것을 바로 사용자에게 보내줄 수 있다. 그러나, 모든 서버에서 "IP 터널링"(IP Encapsulation)을 지원해야한다.

    NAT (Network address translation)

    IPv4에서는 IP주소가 부족하고 보안상에 몇가지 문제가 있어서, 점점 더 많은 네트웍에서 인터넷에서 사용할 수 없는 사설 IP(10.0.0.0/255.0.0.0, 172.16.0.0/255.240.0.0 , 192.168.0.0/255.255.0.0)를 사용하고 있다. 사설망에 있는 호스트에서 인터넷에 접속을 하거나 인터넷망에서 사설망의 호스트에 접속하기 위해서 NAT(network address translation)기능이 필요하다.

    NAT는 특정한 IP 주소를 한 그룹에서 다른 그룹으로 매핑하는 기능이다. 주소를 N-to-N 형태로 매핑하는 경우를 정적 NAT라 하고 M-to-N(M>N)를 동적 NAT라고 한다. 네트웍 주소 포트 변환은 기본 NAT의 확장기능으로 여러 가지 네트웍 주소와 TCP/UDP 포트를 단일의 네트웍 주소와 TCP/UDP 포트로 변환한다. N-to-1 매핑이라고 하며 리눅스에서 IP 마스커레이딩도 이러한 방식을 이용한다.

    리눅스에서 NAT를 통한 가상 서버는 네트웍 주소 포트 변환을 통해 수행한다. 리눅스 IP 마스커레이딩 코드를 이용하며, 스티븐 클락(Steven Clarke)의 포트 포워딩 코드를 재사용하고 있다.

    1. 사용자가 서버 클러스터에서 제공하는 서비스에 접근할때, 가상 IP 주소(부하분산서버의 외부 IP 주소)로 향하는 요구 패킷이 부하분산서버로 간다.
    2. 부하분산서버에서 패킷의 목적지 주소와 포트 번호를 검사한다.
    3. 내용이 가상 서버 규칙 테이블에 따른 가상 서버 서비스와 일치하면 스케쥴링 알고리즘에 따라 클러스터에서 실제 서버를 선택한다.
    4. 접속이 이루어진 것을 기록하는 해쉬 테이블에 새로운 접속을 추가한다.
    5. 패킷의 목적지 주소와 포트가 선택한 서버에 맞게 변경되고 패킷을 해당 서버로 전송한다.
    6. 들어오는 패킷이 이러한 접속에 해당하고 해쉬 테이블에서 선택한 서버를 찾을 수 있으면 패킷을 재작성하여 선택한 서버로 전송을 할 것이다. 응답패킷이 돌아오면, 부하분산서버는 패킷의 출발 주소와 포트를 가상 서비스로 변경한다.
    7. 접속이 해제되거나 시간을 초과하면, 해쉬 테이블에서 연결 기록을 제거한다.

    NAT를 이용하면 실제서버가 TCP/IP를 지원만 하면 모두 가능하고, 실제서버를 완벽하게 숨길 수 있어 보안성을 향상 시킬 수 있으나, 확장성에 제한이 있다.일반적인 PC서버 기준으로 했을 때 서버노드가 20개 이상으로 증가할 경우 부하분산서버에서 병목이 생길 수 있다. 왜냐하면 패킷이 들어오고 나갈때마다 부하분산서버에서 패킷을 변경해야하기 때문이다. 다음과 같이 가정해보자. TCP 패킷의 평균 길이가 536Bytes 이다. 패킷 변경에 의한 지연시간은 60us(펜티엄 프로세서 기준이며 이보다 더 뛰어난 프로세서를 쓰면 지연시간이 감소될 것이다)이고 부하분한서버의 최대 처리량이 8.93MBytes/s이다. 실제 서버의 평균 처리량이 400Kbytes/s 일때 부하분산서버는 22개의 실제 서버를 스케쥴링할 수 있다.

꿔니(fuga@ggwuni.com)





Copyright(c) 2001, 수퍼유저코리아 All Rights Reserved.
서버구축(운용)상담 : e-mail : webmaster@superuser.co.kr