본문 바로가기

Linux/일반

로드밸런서 이해하기 ( #1. 개념 및 이해 )

로드밸런서란 ?

여러대의 서버를 서비스 하는 경우, 서버에 가해지는 부하를 분산하기 위해 외부로부터의 요청을 서버가 직접 받지 않고, 서버와 클라이언트 사이에 부하 분산 장치 (Network Switch)를 두어 서버로 들어오는 요청들을 적절하게 나누어주는것입니다.

부하분산에 사용되는 Network Switch는 L4 로드밸런서와 L7 로드밸런서가 있습니다.

 

이 둘의 차이를 알기 위해서는 OSI 7 계층 개념을 알아야합니다.

4 Layer ( 전송 계층 ) 송수신자간에 신뢰성 있는 데이터 통신을 보장하며, 흐름제어, 오류제어, 혼잡제어 등 기능 담당.
데이터 전송을 위해 port 번호를 사용함 ( TCP/IP )
7 Layer ( 응용 계층 ) OSI 최상위 계증으로 사용자를 위한 인터페이스를 지원하는 계층 ( HTTP, FTP, SMTP ) 

 

- L4 로드밸런서

4 layer 이하의 계층에서 동작하는 장비로 네트워크 계층(IP), 전송 계층 (TCP/UDP) 정보를 바탕으로 트래픽을 나누어 부하분산이 가능합니다.

- L7 로드밸런서

7 layer (HTTP,FTP,SMTP) 에서 동작하는 장비로 TCP/UDP 포트 정보 뿐만 아니라 http header, url cookie 정보 등 사용자 요청을 기준으로 트래픽을 분산하는것이 가능합니다.

L4와 다르게 패킷의 내용을 확인하고 해당 패킷의 내용에 따라 특정 서버에 클라이언트 요청을 분산하여 전송하는것이 가능합니다.

즉, L4와 비교했을때 상위 계층에서 동작하기 때문에 더욱 세분화하여 요청을 전달할 수 있어 DDos 방어 및 패킷 필터링이 가능합니다.

L4와 비교했을때 상위 계층이기 때문에 비용이 더 비싸다.

동작 원리

​- NAT (Network Address Translation)

사설 IP 주소와 공인 IP 주소를 변환해주는 기능

-SNAT (Source Network Address Translation)

내부 사설 IP주소를 외부 공인 IP 주소로 변환해주는 기능

-DNAT (Destination Network Address Translation)

외부 공인 IP주소를 내부 사설 IP주소로 변환해주는 기능

여러명의 유저가 하나의 공인 IP 주소를 통해 내부 서버들로 접속할 수 있도록 하기 위해서 NAT 기능이 사용됩니다.

유저들의 모든 요청들은 L4를 지나서 서버와 통신이 되기 때문에 L4 스위치만 공인 IP를 가지고 통신하고, L4 스위치와 하단의 서버들은 사설 IP를 통해 통신을 주고받게 됩니다.

 

- DSR (Dynamic Source Routing protocol)

서버에서 클라이언트로 트래픽이 나가는 경우 로드밸런서를 거쳐 클라이언트로 나가지 않고, 서버에서 바로 클라이언트로 나가는 기능입니다.

이를 통해 로드밸런서의 부하가 줄어들게 됩니다.

 

- 터널링 (Tunneling)

인터넷상에서 눈에 보이지 않는 통로를 만들어 통신할 수 있게 하는 기법

클라이언트와 서버 중간에서 터널링 기법을 사용하여 데이터를 캡슐화하여 연결된 서버와 클라이언트에서만 캡슐화된 패킷을 해제할 수 있습니다.

 

 

- Health Check

로드밸런서가 주기적으로 연결된 서버들을 체크하여 해당 서버(연결된 포트)에 문제 또는 장애 발생 시 분배를 중단하고 정상적으로 체크 된 서버에만 분배해주는 기능입니다.

만약 문제 발생한 서버가 정상적으로 체크가 된다면 다시 처음과 동일하게 해당 서버에도 분배를 해주게 됩니다.

※ 로드밸런서의 경우에도 장애가 발생할 가능성이 있기 때문에 로드밸런서 또한 이중화하여 장애에 대비할 필요성이 있습니다.

 

※추가적으로 부하 분산의 방법으로 조치할 수 있는 방법

- Scale-up

서버에 부하 발생 시 현재 생성되어 있는 서버 자체의 성능을 향상시키는 방법 (기존 서버의 처리 능력 향상, CPU를 현재 동작하는것보다 더 높은 성능의 CPU로 변경)

- Scale-out (iwinv 서비스 중 오토스케일링 방법)

서버에 부하 발생 시 현재 서버와 동일한 성능의 서버의 대수를 늘리는 방법

-> 이 방법 사용 시 로드밸런서와 같이 사용하면 서버 부하 분배를 더 적절하게 할 수 있음.

 

 

 

알고리즘 

※ 제공하는 알고리즘 기법은 사용하는 로드벨린서 벤더 사 마다 다를 수 있습니다. 저는 iwinv L4 및 L7에서 제공하는 알고리즘을 기준으로 작성하였습니다.

로드밸런서 사용 시 서비스 방식에 따라 적절하게 부하를 분산하기 위해서 여러가지 부하 분산 방법들이 있습니다.

- Round Robin

로드밸런서에서 들어온 요청을 1:1로 순서대로 분배하여 나눠주는 방식입니다.

클라이언트 1 요청 -> 서버 A

클라이언트 2 요청 -> 서버 B

클라이언트 3 요청 -> 서버 C

서버 내 connection(접속자 수)과 상관없이 순서대로 트래픽을 분배하기 때문에 로드밸런서와 연결된 서버들이 모두 비슷한 스펙을 가지고 있고, 세션이 오래 연결되지 않는 경우에 사용하기 좋은 방식입니다.

- Least Connection

서버에 연결된 connection(접속자 수)을 체크하여 connection이 가장 적게 연결되어 있는 서버로 요청을 분배하여 나눠주는 방식입니다.

서버에 분배되는 트래픽 양이 일정하지 않은 경우 사용하면 좋은 방식이며, 연결 처리가 빠른 서버에서 더 많은 트래픽을 처리할 수 있습니다.

- Source Hashing

클라이언트 IP를 동일한 서버에 매핑하여 추후에 재연결시에도 세션이 끊기지 않고 연결하여 사용할 수 있는 방식입니다.

사용자의 IP를 hashing 하여 트래픽을 분배하기 때문에 클라이언트가 항상 동일한 서버로 매핑되게 됩니다.

웹을 구동하는 경우 선호되는 방식입니다.

* 해싱(Hashing)이란 ?

임의의 길이를 지닌 데이터를 고정된 길이의 데이터로 매핑하는것