티스토리 뷰
[네트워크] 로드밸런싱(Load Balancing) / 로드밸런서(Load Balancer)
Greyfolk99 2023. 3. 26. 23:011. 로드밸런싱이란?
로드밸런싱은 서버의 부하를 여러 대의 서버에 균등하게 분산시켜서, 단일 서버가 감당할 수 없는 과부하를 방지하고, 서버의 가용성과 성능을 향상시키는 기술이다. 이를 통해 서버의 안정성과 가용성을 보장하면서 사용자들에게 더욱 빠른 서비스를 제공할 수 있다. 로드 밸런싱 기술을 제공하는 서비스 또는 장치(로드밸런서)는 클라이언트와 서버들 또는 네트워크 허브 사이에 위치한다.
로드 밸런싱의 목표
네트워크 뿐만 아니라 OS, 쿠버네티스와 같은 컨테이너 오케스트레이터 등에서 다음과 같은 공통적인 목표를 가지고 활용되고 있다.
- 자원 사용 최적화
- throughput(처리 용량) 증가
- 응답 속도 감소
- 특정 서버의 과부하 방지
- 안정성, 가용성 제고
2. 로드 밸런서란?
로드 밸런싱 기술을 제공하는 서비스 또는 장치를 로드 밸런서(LB, Load Balancer)라고 부른다. 로드 밸런서를 활용하면 실제로는 여러 대의 백엔드 서버가 동작하더라도, 사용자에게는 하나의 서비스처럼 보이게 할 수 있다.
방법은 로드밸런서가 서비스에서 사용되는 대표 IP 주소를 갖고 클라이언트의 요청을 받되, 자신과 연결된 백엔드 서버의 실제 IP로 요청을 보내는 것이다. 로드 밸런서는 이와 같이 동작하기 위해 다음과 같은 중요한 업무를 수행한다.
▶ Health Checking
- 로드 밸런서는 서버들에 대한 주기적인 상태 확인(Health Check)을 통해 서버들의 장애 여부를 판단할 수 있다.
- healthy = 클라이언트의 요청을 처리할 수 있는 상태를 의미
▶ Service Discovery
- 현재 available한 서버의 목록을 유지하고, 그들의 IP 주소를 관리한다.
▶ Load Balancing
- 각 사용자의 요청을 특정 알고리즘을 활용하여 healthy한 백엔드 서버들에게 네트워크 부하를 분산한다.
로드 밸런서의 기본 기능
▶ Health Check
- L3 : ICMP 를 이용하여 서버의 IP 주소가 통신 가능한 상태인지를 확인한다.
- L4 : TCP 는 3 Way-Handshaking (전송 -> 확인/전송 -> 확인) 를 기반으로 통신합니다. 이러한 TCP 의 특성을 바탕으로 각 포트 상태를 체크하는 방식이다. 예를 들어, 보통 HTTP 웹 서버의 경우 80 포트를 사용하므로 TCP 80 포트에 대한 체크를 통해 서버가 살아 있는 상태인지 확인한다.
- L7 : 어플리케이션 계층에서 체크를 한다. 즉, 어플리케이션의 리소스 경로 (예> …/index.html) 에 통신을 시도하여 이상 유무를 파악한다.
▶ Tunneling
- 인터넷 상에서 눈에 보이지 않는 통로를 만들어 통신할 수 있게 하는 개념이다.
- 데이터를 캡슐화하여, 연결된 상호 간에만 캡슐화된 패킷을 구별하여 캡슐화를 해제할 수 있다.
▶ NAT (Network Address Translation)
- IP 주소를 변환해주는 기능이다. 여러개의 호스트가 하나의 공인 IP 주소 (VIP) 를 통해 접속하는 것이 주 목적.
- SNAT (Source Network Address Translation) :
내부에서 외부로 트래픽이 나가는 경우, 내부 사설 IP 주소를 외부의 공인 IP 주소로 변환하는 방식이다. 집에서 사용하는 공유기가 대표적인 예 - DNAT (Destination Network Address Translation) :
외부에서 내부로 트래픽이 들어오는 경우, 외부 공인 IP 주소를 내부의 사설 IP 주소로 변환하는 방식이다. Nginx의 리버스 프록시나 Docker의 호스트 IP와 컨테이너 IP 주소를 포트로 매핑 시켜주는 것을 예시로 들 수 있다.
▶ DSR (Direct Server Routing)
- 서버에서 클라이언트로 되돌아가는 경우, 목적지를 클라이언트로 설정한 다음, 네트워크 장비나 로드 밸런서를 거치지 않고 클라이언트로 찾아가는 방식이다.
- 이 경우, 로드 밸런서의 부하를 줄여줄 수 있다는 장점이 있다.
3. 로드밸런싱 종류와 방법 그리고 선택 지표
로드 밸런서는 여러 대의 서버를 관리하면서 클라이언트들의 요청을 각 서버로 분산시켜주는 역할을 한다. 이때, 클라이언트로부터의 요청을 어떤 방식으로 분배할지에 따라 다양한 방법이 있다.
로드밸런싱에는 L4 로드밸런서와 L7 로드밸런서가 가장 많이 활용되는데, 그 이유는 L4 로드밸런서부터 포트 정보를 바탕으로 로드를 분산 가능하기 때문이다. 한 대의 서버에 각기 다른 포트 번호를 부여하여 다수의 서버 프로그램을 운영하는 경우라면 최소 L4 로드밸런서 이상을 사용해야만 하는 것이다.
특정 기능이 필요한 것이 아니라면, 초당 연결수(Connections Per Sec), 동시 연결수(Concurrent Connections), 처리용량(Throughput)을 성능 지표로 하여 L4 로드밸런서와 L7 로드밸런서 중 적절히 선택하는 것이 바람직할 것이다.
로드 밸런싱 종류 / 알고리즘
▶ 라운드 로빈 방식(Round Robin Method)
- 라운드 로빈 DNS는 별도의 소프트웨어 혹은 하드웨어 로드밸런싱 장비를 사용하지 않고, DNS만을 이용하여 도메인 레코드 정보를 조회하는 시점에서 트래픽을 분산하는 기법이다. 웹뿐만 아니라, 도메인을 사용하는 모든 서비스 - FTP, SMTP, TURN 등 - 에서 사용이 가능하다.
- 웹 서버로 예를 들자면, 웹 서비스를 담당할 여러 대의 웹 서버는 자신의 공인 IP를 각각 가지고 있다. 웹 사이트에 접속을 원하는 사용자가 해당 도메인 주소를 브라우저에 입력하면, DNS는 도메인의 정보를 조회하는 데, 이때 IP 주소를 여러 대의 서버 IP 리스트 중에서 라운드 로빈 형태로 랜덤하게 하나 혹은 여러개를 선택하여 다시 사용자에게 알려준다.
- 라운드 로빈 DNS는 지리적으로 복수의 웹 서버가 멀리 떨어져 있어서 실시간으로 헬스 체크가 어려울 때 사용한다. (혹은 적은 비용으로 구현이 필요할때)
- 일반적인 로드밸런싱(load balancing)은 뒤 단에 있는 백 엔드 서버들의 헬스 체크(health check) 정보를 수반하지만, 라운드 로빈 DNS는 로드밸런싱 기능이 없기에 별도의 헬스 체크가 없다. 따라서 특정 웹 서버에 문제가 생겨 서비스가 불가한 상태라 하더라도, DNS는 이를 알 방법이 없고, 해당 서버의 공인 IP를 도메인 조회 결과에 포함시키기 때문에 HA(High Availability) 용도로는 적합하지 않다. 이것이 라운드 로빈 DNS의 최대 단점이다.
▶ 가중 라운드로빈 방식 (Weighted Round Robin Method)
- 각각의 서버에 가중치(Weight)를 매기고 가중치가 높은 서버에 클라이언트 요청을 우선적으로 배분.
- 주로 서버의 트래픽 처리 능력이 다른 경우 사용되는 로드밸런싱 방식.
▶ 최소 연결 기반 (Least Connection Method)
- Request가 들어온 시점에 가장 적은 연결(세션) 상태를 보이는 서버에 우선적으로 트래픽을 할당.
- 자주 세션이 길어지거나, 서버에 분배된 트래픽들이 일정하지 않은 경우에 적합.
▶ 최소 응답 시간 기반 (Least Response Time Method)
- 서버들의 응답 시간을 측정하여 가장 빠른 응답 시간을 보인 서버에 할당하는 방식이다.
▶ IP 해시 기반 (IP Hash Method)
- 특정 클라이언트에 대해 항상 특정 서버로 세션을 할당하는 방식이다.
▶ 대역폭 기반 (Bandwidth Method)
- 서버들의 대역폭을 고려하여 트래픽을 분산하는 방식이다.
L4, L7 로드밸런서 비교
4 계층
네트워크 계층(IP, IPX)이나 3 계층 - 전송 계층(TCP, UDP) 의 정보를 바탕으로 로드를 분산.
즉, IP 주소, 포트번호, MAC 주소, 전송 프로토콜 등에 따라 트래픽을 분산하는 것이 가능.
장점)
☞ 패킷의 내용을 확인하지 않고 로드를 분산하므로 속도가 빠르고 효율이 높음.
☞ 데이터의 내용을 복호화할 필요가 없기에 안전.
☞ L7 로드밸런서보다 가격이 저렴.
- 단점)
☞ 패킷의 내용을 살펴볼 수 없으므로, 섬세한 라우팅 불가.
☞ 사용자의 IP가 수시로 바뀌는 경우라면, 연속적인 서비스를 제공하기 어려움.
7 계층
어플리케이션 계층(HTTP, FTP, SMTP 등)에서 로드를 분산하기 때문에, HTTP 헤더, 쿠키 등과 같은 사용자 요청을 기준으로 특정 서버에 트래픽을 분산하는 것이 가능.
- L4 로드밸런서의 기능에 더하여, 패킷의 내용을 확인하고 그 내용에 따라 로드를 특정 서버에 분배하는 것이 가능.
- 특정한 패턴을 지닌 바이러스를 감지해 네트워크 보호 가능.
- Dos/DDos 와 같은 비정상적인 트래픽 필터링 가능.
- 방식)
▶ URL 스위칭(URL Switching) 방식 : 특정 하위 URL들은 특정 서버로 처리하는 방식.
ex) '.../item/image' => 이미지 처리 서버 / '.../item/video' => 동영상 처리 서버
▶ 컨텍스트 스위칭(Context Switching) 방식 : 클라이언트가 요청한 특정 리소스에 대해 특정 서버로 연결 가능.
ex) 이미지 파일에 대해서는 확장자를 참조하여, 별도로 구성된 이미지 파일이 있는 서버 or 스토리지로 직접 연결.
▶ 쿠키 지속성(Persistence with Cookies) : 쿠키 정보를 바탕으로 클라이언트가 연결했었던 동일한 서버에 계속 할당해 주는 방식. 특히, 사설 네트워크에 있던 클라이언트의 IP 주소가 공인 IP 주소로 치환되어 전송하는 방식을 지원.
ex) X-Forwarded-For 헤더에 클라이언트 IP 주소를 별도로 기입
- 장점)
☞ 상위 계층에서 로드를 분산하기 때문에 훨씬 더 섬세한 라우팅 가능.
☞ 캐싱(Cashing) 기능을 제공.
☞ 비정상적인 트래픽을 사전에 필터링할 수 있어 서비스 안정성 높음.
- 단점)
☞ L4 로드밸런서에 비해 비쌈.
☞ 패킷의 내용을 복호화하여야 하므로 더 높은 비용을 지불해야 함.
☞ 클라이언트가 로드밸런서와 인증서를 공유해야 하기 때문에, 공격자가 로드밸런서를 통해 클라이언트의 데이터에 접근할 수 있는 보안상의 위험성 존재.
L4/L7 로드밸런서의 주요 성능 지표
▶ 초당 연결수(Connections per second)
- 하나의 TCP 연결은 클라이언트와 서버간의 쓰리-웨이 핸드쉐이크(three-way handshake) 동작(하나의 SYN과 두 개의 ACK 패킷)으로 정의됩니다. 하나의 SYN + 두개의 패킷 = 3가지가 핸드쉐이크(악수, 같이동작한다)라는 의미입니다.
- TCP 세션을 열고(opening) 닫는(closing) 작업은 L4 레벨의 기본 세션 관리의 가장 핵심적인 동작입니다. L4의 포워딩 엔진 부분에 가장 많은 작업량을 요구하는 작업이므로, 이 지표는 L4의 네트워크 기계나 커널의 성능에 따라 좌우됩니다. 초당 얼마나 많은 패킷이 연결이 되나~ 하는 기준 지표라고 생각해주세요
▶ 동시 연결수(Concurrent connections)
- TCP 세션을 유지 할 수 있는 수치입니다. 초당연결수와 다른점은 "일시적동작"이 아닌, "연결 유지" 입니다.
- TCP 세션이 열리면 바로 닫히는 것이 아니라 사용자는 세션을 유지합니다.
- 많은 세션을 관리해야되므로 메모리에 의해 결정되는 경우가 많습니다.
▶ 처리용량(Throughput)
- 위치 자체가 처리할 수 잇는 처리 용량을 의미합니다. L4 스위치에 병목 현상이 걸리지 않도록 방화벽 보다 높은 성능으로 선정되어야 합니다.
- Total
- Today
- Yesterday
- 소프트웨어 방법론
- Hypernetwork
- Multirepo
- spring boot
- Polyrepo
- monorepo
- 모노레포
- Kubernetes
- Textual Inversion
- Spring Security
- 형상 관리
- Spring cloud
- Microservice
- 회원 테이블
- Embedding
- springboot
- vae
- tauri
- load balancing
- 멀티레포
- discord bot
- MLOps
- load balance
- oauth2
- 로드밸런서
- 디스코드 봇
- 토이 프로젝트
- spring cloud config
- 분산 처리
- stable diffusion
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |