로드 밸런싱(Load Balancing)
로드 밸런싱이란?
말 그대로 서버가 처리할 일이나 요청(Load)을 여러 대의 서버로 분산(Balancing) 처리하는 것을 의미한다. 사전적인 정의로는 둘 이상의 중앙처리장치 또는 저장장치와 같은 컴퓨터 자원들에게 작업을 나누는 것을 의미한다. 한 대의 서버로 모든 부하가 집중되지 않도록 트래픽을 적절히 관리해서 각각의 서버가 최적의 퍼포먼스를 낼 수 있도록 하는 것이 목적이다.
서비스 규모가 커지고 사용자 수가 늘어날수록 트래픽이 증가하기 때문에 기존의 서버로는 원활한 서비스 운영이 불가능하게 된다. 이에 대처하는 방식이 크게 두 가지가 있다.
- 기존의 서버 성능을 확장하는 Scale-up 방식
- 서버의 개수를 늘리는 Scale-out 방식
Scale-up의 경우 i3인 CPU를 i7로 업그레이드하는 그런 방식이고 Scale-out은 기존 서버와 동일하거나 낮은 성능의 서버를 추가하여 운영하는 것으로 기존 i3 CPU를 가진 컴퓨터를 추가 구입하여 여러 대의 컴퓨터로 서버를 운영하는 것이다. Scale-out의 경우 한 대에서 여러 대로 서버를 늘렸기 때문에 이를 균등하게 분산해 주는 로드밸런싱이 필요하다.
로드 밸런싱 기법
여러 가지 기법이 있는데 그중 서버의 상황에 맞춰서 적절한 방법을 선택하는 것이 좋다.
- 라운드로빈 방식 (Round Robin Method)
서버에 들어온 요청을 순서대로 돌아가며 배정하는 방식이다. 클라이언트의 요청을 순서대로 분배하기 때문에 서버들이 동일한 스펙을 가지고 있다. 서버의 세션을 오래 유지할 필요가 없는 경우에 활용하기 좋다. - 가중 라운드 로빈 방식 (Weighted Round Robin Method)
각 서버마다 가중치를 매기고 가중치가 높은 서버에 클라이언트 요청을 우선적으로 분배한다. 주로 서버의 트래픽 처리 능력 차이가 나는 경우 사용되는 부하 분산 방식이다. - IP 해시 방식 (IP Hash Method)
클라이언트의 IP 주소를 특정 서버로 매핑하여 처리하는 방식이다. 요청이 들어온 사용자의 IP를 해싱(Hashing : 임의 길이의 데이터를 고정 길이 데이터로 매핑하는 것)하여 분배하므로 사용자가 항상 동일한 서버로 연결되는 것을 보장한다. - 최소 연결 방식 (Least Connection Method)
요청이 들어온 시점에 가장 연결 상태가 적은 서버에 우선적으로 분배하는 방식이다. 서버에 분배된 트래픽이 일정하지 않은 경우에 적합하다. - 최소 응답 시간 방식 (Least Response Time Method)
서버의 현재 연결 상태와 응답 시간을 모두 고려하여 트래픽을 분배하는 방식. 가장 적은 연결 상태와 짧은 응답 시간을 보이는 서버에 우선적으로 분배한다.
L4 로드 밸런싱, L7 로드 밸런싱
로드 밸런싱에는 L4, L7 로드 밸런싱이 가장 많이 사용된다. 여기서 L4와 L7이 의미하는 것은 OSI 모델에서의 계층을 의미하는 것이다. 즉 L4는 전송 계층, L7는 응용 계층을 의미하고 이 프로토콜의 헤더를 부하 분산에 이용하기 때문에 이렇게 부른다.
L4 로드 밸런서는 전송 계층이므로 전송 계층(TCP, UDP)의 정보(IP, PORT, MAC 주소 등)를 바탕으로 트래픽을 나누어 분산 처리를 한다. CLB(Connection Load Balancer) 또는 SLB(Session Load Balancer)라고 부르기도 한다.
L7 로드 밸런서는 애플리케이션 계층에서 트래픽을 나누어 분산 처리를 한다. 애플리케이션 계층에 해당하는 HTTP, FTP, SMTP 등의 프로토콜을 바탕으로 트래픽을 분산하기 때문에 HTTP 헤더, 쿠키 등과 같은 사용자의 요청을 기준으로 특정 서버에 트래픽을 분산하는 것이 가능하다. 즉 패킷의 내용을 확인 후 그 내용에 따라 분배가 가능한 것이다. URL, 헤더 등을 확인하고 더욱 세분화하여 분산할 수 있는 장점이 있다.
L7 로드 밸런서의 경우 특정 패턴을 지닌 바이러스를 감지해서 네트워크를 보호할 수 있으며 DoS와 같은 비정상적 트래픽도 걸러낼 수 있다는 장점이 있다.
Nginx 로드 밸런싱
트래픽이 많은 웹 상태를 위해 네트워크 확장성을 주목적으로 설계한 경량 HTTP서버이다. 리버시 프록시로도 활용이 가능하여 로드밸런서로 사용이 가능하다. 동시 접속자가 약 700명 이상이라면 서버를 증설하거나 Nginx 환경을 권장한다고 한다.
하지만 위에서 설명한 것과는 달리 소프트웨어 로드 밸런서이고 로드밸런싱만을 위해 개발된 프로그램이 아니라서 기본적인 로드밸런싱 기능만 있다. 대신 그만큼 비용이 저렴하고 쉽게 구축할 수 있는 장점이 있다.
소프트웨어 로드 밸런싱은 수요에 따라 가상 서버를 추가하거나 삭제할 수 있어서 확장성이 좋고 여러 환경과 호환이 되어 유연성이 좋고 비용이 싸고 배포도 간편하며 의심스러운 패킷을 서버에 도달하기 전에 사전 차단이 가능하기 때문에 사용한다고 한다.
Nginx 설정 파일
http{
includ /etc/nginx/conf.d/*.conf;
}
nginx를 설치하면 /etc/nginx/nginx.conf 에 nginx 설정 파일이 생긴 것을 볼 수 있을 것이다.
http에 대한 설정을 정의하는 것이며 include는 경로에 대한 확장자를 가진 파일을 포함하는 것으로 우리가 설정하길 원하는 파일을 해당 경로에 .conf 확장자로 만들면 원하는 nginx 설정을 할 수 있다.
나는 /etc/nginx/conf.d/default.conf 경로에 default.conf라는 파일을 만들어서 사용했으며 아래는 예시이다.
upstream backend {
least_conn;
server {도메인}:8001;
server {도메인}:8002;
server {도메인}:8003;
}
server {
listen 80;
location / {
proxy_pass <http://backend>;
}
}
upstream을 사용하여 로드 밸런싱 대상 서버를 설정할 수 있다. 실제론 해당 도메인에 대한 포트로 3개의 서버가 돌아가고 있을 것이다. 이름은 backend로 하였고 proxy_pass에 기존 도메인을 넣는 것이 아니라 upstream의 이름을 넣어서 설정해 준다. 그리고 least_conn은 어떤 로드 밸런싱 기법을 사용하는지를 명시한 것이다. 아무것도 적지 않으면 기본적으로 라운드로빈으로 설정된다.
다른 옵션으로는
- least_conn : 최소 연결 방식
- ip_hash : IP 해시 방식
- least_time : 최소 응답 시간 방식(Nginx Plus에서만 가능하다)
Nginx 문서에 설명이 잘 되어있고 그대로 따라하기만 해도 된다.
http://nginx.org/en/docs/http/load_balancing.html
Nginx Plus라는게 있는데 특정 알고리즘은 Nginx Plus에서만 사용이 가능하다. 아래 문서가 잘 되어 있다.
https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
'Network' 카테고리의 다른 글
소켓 프로그래밍을 하다가 발생한 의문점(왜 내 서버 소켓은 브라우저의 요청 클릭 한 번에 두 개의 커넥션을 생성하나요..?) (0) | 2024.07.08 |
---|