지난주 express에서 multer
모듈을 활용해 프론트에서 보내준 사진을 내 로컬 데이터베이스 공간에 저장하고, 해당 사진을 다시 프론트엔드에 보내는 작업을 수행했다.
하지만 이러한 단일 서버로 운영하는 방식은 당연히 여러 문제가 있다.
서비스를 사용하는 사용자가 셀 수 없이 많아진다면, 점차 받는 데이터 양이 광범위해질 것이고 그러면 비효율적인 요청과 응답, 취약한 보안 등 여러 문제에 직면할 것이다.
게다가, 서버의 갯수를 여러 개로 늘리는 scale-out
방식으로 전환되려면 많은 복제 작업이 진행될 것이고, 그 사이 서버의 문제가 생길 수도 있다. 설령 내 서버의 하드웨어 성능을 높이는 scale-up
방식을 활용하더라도 말이다..
그리고 데이터베이스와 백엔드 어플리케이션 서버를 분리하더라도 단일 서버의 문제를 완벽히 해결할 수 없고, 여전히 하나의 서버만 있기 때문에 scale-out으로 전환이 어렵다.
로드벨런싱은 백엔드 서버 그룹에 들어오는 네트워크 트래픽을 효율적으로 분산하는 것이다.
브라우저를 통해 에플리케이션 서버에 접근한 사용자의 데이터 요청이 서버에 바로 오지 않게 하는 방식이 바로 로드밸런싱이다.
즉, 로드밸런서가 하는 일은
1. 수많은 요청을 먼저 받은 로드밸런서는 서버에 최대한 부담이 가지 않도록 여러 서버에 요청을 나눠준다.
2. 요청 수행이 불가한 서버에는 전송하지 않음으로써 여러 서버들을 효율적으로 활용한다.
3. scale-out 방식을 접목해 수요에 따라 서버를 추가하거나 제거할 수 있는 유연성을 제공한다.
로드밸런싱은 여러 알고리즘을 통해 다양한 방식으로 서버에 요청을 제공한다.
Round Robin
Least Connections
Least Time
Hash
Random with Two Choices
로드밸런서는 OSI 7계층
을 기준으로 분산하는지에 따라 종류가 나뉜다. L 뒤에 숫자가 붙고 그 숫자에 해당하는 계층이 이름 붙여지는 방식으로 분류할 수 있다. 그리고 상위 계층으로 갈수록 섬세한 부하 분산이 가능하지만 가격이 비싸다.
L2
Data link 계층을 사용, Mac주소 기반 부하 분산 L3
Network 계층을 사용, IP주소 기반 부하 분산 L4
Transport 계층을 사용, Port 기반 부하 분산 TCP, UDPL7
Application 계층을 사용, 요청(URL) 기반 부하 분산 HTTP, HTTPS 등HTTP
X-Forwarded-For
X-Forwarded-Proto
X-Forwarded-Port
NAT(Network Address Translation)
Tunneling
DSR(Dynamic Source Routing protocol)