네트워크

로드 밸런서 2 - 구성 방식, 동작 방식 + DSR 모드 설정 방법

우잉~ 2024. 11. 28. 15:43

로드 밸런서의 구성 방식

로드 밸런서의 구성 위치에 따라 2가지로 구분할 수 있다.

 

1. 원암(One-Arm) 구성: 로드 밸런서를 중간 스위치 옆에 연결

2. 인라인(Inline) 구성: 로드 밸런서를 서버로 가는 경로 상에 연결

 

로드 밸런서의 구성 위치에 따른 구성 모습

 

원암 구성

스위치 옆에 있는 형태를 말하며, 마치 한쪽 팔을 벌린 모습과 같아 One-Arm 구성이라고 부른다.

하나의 로드 밸런서만 붙을 수 있는 게 아닌, LACP와 같은 다수의 인터페이스로 스위치와 연결된 경우에도 원암 구성이라고 말할 수 있다.

VLAN으로 한 스위치를 여러 네트워크로 로드 밸런서와 연결한 경우도 원암 구성이 될 수 있다! → 투암 구성이라고 하기도 함. 결론적으로 2개 이상이... 연결되었기 때문

 

원암 구성의 특징

인라인 구성과는 다르게 서버로 들어가는 방향으로 로드 밸런서가 배치되어 있지 않기 때문에, 굳이 로드 밸런서를 거치지 않고 트래픽을 서버로 보낼 수 있다.

즉, 로드 밸런서를 거치는 트래픽로드 밸런서를 거치지 않는 트래픽으로 나뉜다는 것이다. → 원암 구성은 이 두 개의 트래픽이 섞인 경우에 많이 사용됨

 

부하 분산을 해야 하는 트래픽의 경우, 서비스 IP 정보를 로드 밸런서가 가지고 있기 때문에 무조건 처음에는 로드 밸런서를 거치게 된다.

로드 밸런서는 트래픽을 분산한 뒤 서버에서 받은 응답 트래픽을 전달 받아 사용자에게 전달한다. 이때 서버의 응답은 사용자에게 바로 전달되는 것이 아니라, 로드 밸런서를 거치고 나서 사용자에게 전달된다.

 

[부하 분산을 이용할 경우의 트래픽 흐름]

사용자의 요청 → 로드 밸런서의 트래픽 분산 → 트래픽을 받은 서버에서의 응답 → 서버에게 받은 응답이 로드 밸런서를 거침 → 사용자에게 전달됨

 

부하 분산을 사용하지 않는 트래픽의 경우, 로드 밸런서를 거치지 않고도 서버와 통신할 수 있으므로 로드 밸런서의 부하가 줄어들게 된다.

 

 

인라인 구성

로드 밸런서가 스위치-서버 사이에 있는 형태로, 무조건 로드 밸런서를 통과하는 구성이다.

 

 

로드 밸런서의 동작 모드

로드 밸런서의 동작 방식은 3가지로 나뉠 수 있다.

1. 트랜스패런트(Transparent, TP) 또는 브릿지(Bridge)

2. 라우티드(Routed)

3. DSR(Direct Server Return)

 

1. 트랜스패런트 모드

로드 밸런서가 OSI 2계층 스위치처럼 동작하는 구성으로, VIP 주소와 실제 서버가 동일 네트워크를 사용한다.

신기한 건, 부하 분산 서비스를 받는 트래픽일 때만 로드 밸런서가 4계층 이상의 기능을 수행하게 되며, 아닐 경우에는 기존 L2 스위치와 동일하게 스위칭 기능만 수행한다. → L2 구조라고 부르기도 한다.

 

원암/인라인 구성에서 모두 사용할 수 있는 동작 모드

하지만 원암 구성에서는 응답 트래픽의 경로 부분에 문제가 생길 수 있기 때문에 Source NAT가 필요하다.

* 출발지 IP를 다른 IP로 변경하여 전송하는 것을 Source NAT라고 하고, 목적지 IP를 다른 IP로 변경하는 것은 Destination NAT라고 한다.

 

인라인 구성에서 패킷을 요청할 때의 트래픽은 

사용자 → 스위치 → 로드 밸런서 → 서버

로 흐르게 된다.

① 스위치에서 로드 밸런서로 먼저 전달되고, ② 로드 밸런서는 적절한 서버를 찾아 목적지의 IP 주소를 서버의 실제 주소로 변경하여 트래픽을 전달한다. → Destination NAT 되었다고 말한다.

트랜스패런트 모드에서 사용자의 트래픽이 서버에 전달되는 과정

 

 

서버의 응답을 사용자에게 전달할 때는 반대로

서버 → 로드 밸런서 → 스위치 → 사용자

가 된다.

여기서 로드 밸런서를 거쳐 지나가야 하기 때문에 출발지 IP가 로드 밸런서의 IP(10.10)으로 변경된다. 이를 Source NAT라고 한다.

* MAC 주소는 왜 그대로 서버의 MAC 주소인 A일까?? 현재 동일 네트워크 상이기 때문에 변경될 필요가 없다.

** 내부적으로 프록시 ARP를 이용한 트랜스패런트 모드에서는 MAC 주소를 변경하게 됨!!!

트랜스패런트 모드에서 서버의 응답이 사용자에게 전달되는 과정

 

 

2. 라우티드 모드

로드 밸런서가 라우팅 역할을 수행하는 모드

로드 밸런서 기준으로 사용자 방향(Client Side)/서버 방향(Server Side)이 서로 다른 네트워크로 분리된 구성으로, 원암/인라인 구성에서 모두 사용할 수 있는 모드이다.

 

라우티드 모드는 보안 강화 목적으로 사용되곤 한다.

서버 쪽 네트워크를 사설로 구성해버리는 것이다...

그래서 라우티드 모드에서는 3계층 장비인 게이트웨이가 사용되어야 한다. → 다른 네트워크와의 통신을 위해서 필요하다.

MAC 주소는 다른 네트워크 구간을 지날 때마다 매 홉에서 변경되므로 게이트웨이 → 서버로 가는 구간에서는 출발지 MAC 주소가 게이트웨이의 MAC 주소(D)로 변경되게 된다.

라우티드 모드에서 사용자의 요청이 서버로 전달되는 과정

 

 

목적지의 IP가 다른 네트워크에 존재하기 때문에 출발지/목적지 MAC 주소가 바뀌게 되며,

로드 밸런서를 거쳐서 가야하기 때문에 출발지 IP가 로드 밸런서의 IP(10.10)로 변경되는 Source NAT가 이루어지게 된다.

라우티드 모드에서 서버의 응답이 사용자에게 전달되는 과정

 

 

3. DSR 모드

Direct Server Return의 뜻에 걸맞게 사용자의 요청이 로드 밸런서를 통해 서버로 들어온 뒤 로드 밸런서를 통하지 않고 직접 응답하는 모드

원암 구성에서만 적용이 된다. → 인라인 구성에서는 무조건 로드 밸런서를 경유해야 하기 때문이다.

 

DSR 모드는 L2와 L3으로 구분된다.

L2 DSR은 로드 밸런서가 실제 서버와 같은 네트워크일 경우

L3 DSR은 로드 밸런서가 실제 서버와 다른 네트워크일 경우

 

결국 실제 서버까지의 통신이 L2 통신이냐, L3 통신이냐에 따라 L2 DSR, L3 DSR로 나눌 수 있다.

 

트랜스패런트 모드/라우티드 모드는 사용자 → 로드 밸런서 → 실제 서버를 거치면서 Destination NAT가 수행되고

응답할 때는 로드 밸런서를 거쳐야 하기 때문에 Source NAT가 이루어지지만 

DSR 모드는 서버 응답이 로드 밸런서를 거치지 않기 때문에 Source NAT가 수행되지 않는다.

 

결국 이 뜻은 사용자가 VIP로 서비스를 요청하지만, 응답은 실제 서버의 IP로 받게 된단 말인데, 패킷은 요청했던 IP ≠ 응답 IP이면 패킷을 처리하지 않는다는 특성을 가지고 있다.

이 문제를 해결하기 위해서 어떠한 설정을 해줘야 한다.

 

DSR 모드에서는 VIP는 그대로 유지하고 목적지의 MAC 주소만 실제 서버의 MAC 주소로 변경하여 서버에 전송한다.

하지만 IP는 여전히 요청 IP와 응답 IP가 다르기 때문에 폐기될 위험이 있다.

그래서 루프백 인터페이스를 생성하여 이 인터페이스에 VIP의 주소를 할당한다.

그리고 사용자의 요청이 루프백에 설정된 IP 주소일 때도 패킷을 수신할 수 있도록 따로 설정을 해준다.

마지막으로 루프백 IP가 VIP와 같아 중복 설정된 상태이므로 ARP로 인해서 중복된 IP에 대한 MAC 주소 갱신이 되지 않도록 설정한다.

 

DSR 모드에서 사용자의 요청이 서버에 전달되는 과정

 

DSR 모드에서 로드 밸런서를 거치지 않고 서버의 응답을 사용자에게 보내는 과정

 

DSR 모드 추가 설정 방법

[해야 할 일]

1. 루프백 인터페이스 설정

2. 리눅스 커널 파라미터 수정(리눅스)/네트워크 설정 변경(윈도우)

 

리눅스

루프백 인터페이스 설정 방법

# RHEL(CentOS) 계열
DEVICE=lo:0
IPADDR=10.10(VIP 주소)
NETMASK=255.255.255.255
ONBOOT=yes
NAME=lo0
# Debian(Ubuntu) 계열
auto lo lo:0
iface lo inet loopback
iface lo:0 inet static
  address 10.10(VIP)
  netmask 255.255.255.255

 

위와 같이 설정하면 현재 로드 밸런서에 설정된 IP와 루프백 인터페이스의 IP는 동일하기 때문에

루프백 인터페이스가 GARP를 보내거나 ARP 응답을 하지 않도록 따로 설정해줘야 한다.

설정은 /etc/sysctl.conf에서 할 수 있다.

# /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

 

설정 후 네트워크를 재시작한다.

RHEL > systemctl network restart

Debian > service networking restart

 

윈도우

하드웨어 추가 마법사를 실행한다

 

고급 선택

 

루프백 인터페이스도 일종의 네트워크 어댑터이므로 네트워크 어댑터 선택

네트워크 어댑터 선택

 

제조업체 Microsoft, 모델 Microsoft KM-TEST 루프백 어댑터 선택

제조업체, 모델 선택

 

다음을 눌러 하드웨어를 설치한다.

설치

 

[제어판 > 네트워크 및 인터넷 > 네트워크 연결]에 들어가면 새로운 이더넷이 생긴 것을 확인할 수 있다.

이제 터미널을 이용하여 서비스 인터페이스를 통해 루프백 인터페이스가 목적지인 패킷을 수신할 수 있도록 설정하는 작업이 필요하다.

루프백 인터페이스 생성

 

해당 인터페이스에 설정된 IP 주소가 아니더라도 패킷을 수신하거나 송신을 허용하는 설정을 한다.

서비스 인터페이스를 Ethernet이라고 할 경우, 터미널에서 아래의 명령어를 사용하면 된다.

C:\>netsh interface ipv4 set interface "Ethernet" weakhostreceive=enabled
Ok.

C:\>netsh interface ipv4 set interface "이더넷 3" weakhostreceive=enabled
Ok.

C:\>netsh interface ipv4 set interface "이더넷 3" weakhostsend=enabled
Ok.

 

이후 netsh interface ip dump 명령을 통해 아래와 같이 설정된 것을 확인할 수 있다.

 

 

생성한 루프백 어댑터 삭제 방법은 장치 관리자에서 디바이스 제거를 하면 된다!

 

 

 

추가++

HAProxy라는 소프트웨어를 이용하여 로드 밸런서를 설정하는 방법이 있다!

가상화나 클라우드 환경에서 로드 밸런서로 사용하기에 적합하며, 쿠버네티스의 인그레스 컨트롤러 역할도 한다.