본문 바로가기

사는 이야기/펌킨도서관

DSR(Direct Server Return)이란?

DSR ‘Direct Server Return’ 약자로 한국말로 풀어 보자면 로드밸런서를 거치지 않고 서버에서 클라이언트로 직접 뭔가를 전달하는 것입니다. 여기서 말하는 뭔가는 바로 응답 패킷이죠. 


DSR 기능이 등장한 이유는 사실 기능의 이름에 나와 있습니다. DSR 로드밸런서와 ADC(Application Delivery Controllers) 기능입니다. DSR 로드밸런서의 약점(?) 메웁니다. 로드밸런서의 기본 개념은 트래픽을 분산하는 것이죠. 이를 통해 서비스 지연 현상을 최소화합니다. 로드밸런서는 들어오는 접속 요청을 사전에 할당한 가상 IP(VIP) 받은 다음 이를 적절한 서버로 보냅니다. 이를 받은 서버는 응답을 로드밸런서를 통해 클라이언트로 전달하죠. 이런 동작 원리에 허점이 있습니다. 


예를 들어 보죠. 들어오는 요청의 크기는 10MB 정도인데, 서버의 응답으로 보내는 패킷 크기가 100MB라면? 요청보다 10 패킷을 응답으로 전달하려면? 당연한 병목 현상이 생기겠죠. 이때 로드밸런서가 병목 구간이 있는 아이러니한 현상이 생깁니다. 그래서 나온 기능이 DSR입니다. 트래픽 흐름을 조종해서 사이즈의 응답 패킷이 나갈 로드밸런서를 거치지 않고 바로 서버가 클라이언트로 보내게 하는 기능이 바로 DSR입니다. 


DSR 장점은 영상이나 음성 데이터를 스트리밍하는 경우 응답 속도 이점이 크다는 것입니다. 이외에도 실시간 응답이 중요한 애플리케이션의 경우도 어울립니다. 줄여 말하자면 DSR 애플리케이션과 서비스 유형에 따라 어울리는 것과 그렇지 않은 것이 나뉜다고 보면 됩니다. 어울리는 것은? 예를 들어 ADC 통한 애플리케이션 가속이 필요한 경우 DSR 적용하면 됩니다. 아웃바운드 트래픽이 ADC 거치지 않고 나가니 당연하죠. 


다음 그림은 DSR 구성 예입니다. 




DSR 기능을 이용하려면 서버가 ARP 요청에 대한 응답(Reply) 하지 않게 설정을 해야 합니다. 로드밸런서와 서버가 같은 IP 대역에 위치해야 하는 점을 주의 바랍니다


먼저 리눅스 서버 설정을 살펴보겠습니다. 서버에 VIP 할당합니다. 루프백(loopback) 인터페이스의 VIP 설정합니다. 


vi /etc/sysconfig/network-scripts/ifcfg-lo:0

TYPE=Ethernet

DEVICE=lo:0

BOOTPROTO=none

ONBOOT=yes

IPADDR=10.10.10.100

NETMASK=255.255.255.255

IPV6INIT=no

USERCTL=no


linux>ifconfig

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

  ……

          RX bytes:912 (912.0 b)  TX bytes:912 (912.0 b)

lo:0      Link encap:Local Loopback 

          inet addr:10.10.10.100  Mask:255.255.255.255

          UP LOOPBACK RUNNING  MTU:16436  Metric:1


그러고 나서 ARP 요청에 응답하지 않도록 sysctl.conf 파일을 수정합니다. 추가할 내용은 다음과 같습니다. 


net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2


추가 후 다음 명령으로 변경 사항을 적용합니다. 


>ifup lo:0

>sysctl –p


다음으로 윈도우 서버 설정 예를 알아보겠습니다. 과정은 똑같습니다. 먼저 VIP 설정합니다. 하드웨어 추가 메뉴에서 네트워크 어댑터를 선택합니다. 



그러고 나서 IP를 설정합니다. 



다음으로 루프백 인터페이스가 응답하지 않게 다음 명령어를 실행합니다. 


>netsh interface ipv4 set interface "loopback" metric=254


그러고 나서 루프백 인터페이스에서 패킷을 받을 있도록 다음 명령어를 실행합니다. 다음 예는 서버의 기존 IP 어댑터 이름을 '이더넷'으로, 루프백 어댑터 이름을 'loopback'으로 가정한 것입니다. 


   >netsh interface ipv4 set interface 이더넷" weakhostreceive=enabled
>
netsh interface ipv4 set interface "loopback" weakhostreceive=enabled
>
netsh interface ipv4 set interface "loopback" weakhostsend=enabled