로드밸런싱

June·2022년 10월 6일
1

우테코

목록 보기
80/84

팀에서 무중단 배포를 하기로 했다. 하나의 인스턴스에서 포트번호만 바꾸면서 할 수도 있고, 두 개 이상의 다른 인스턴스를 돌리는 상황에서 무중단 배포를 할 수도 있다. 현재 EC2 성능이 그렇게 좋지도 않고, 더 많은 부하에 대비하기 위해 두 개의 인스턴스를 운영하기로 했다. 그리고 두 개의 인스턴스를 운영하니 로드밸런싱을 하기로 했는데 잘 몰라서 정리를 한다.

하나의 서버가 받는 부하가 커져서 응답 지연시간이 길어진다면 방법은 두 가지이다.
첫 번째는 scale-up을 하는 것인데 하나의 인스턴스의 성능을 높이는 것이다. 실제로 스택오버플로는 2013년 천만 명의 사용자를 한 대의 마스터 데이터 베이스로 처리했다고 한다 (대규모 시스템 설계 기초 p.26). 하지만 이렇게 될 경우 그 서버에 문제가 생기면 곧 시스템 전체의 장애가 된다 (SPOF).

그래서 두 번째 방법은 scale-out으로 인스턴스 대수 자체를 늘리고 각각 인스턴스가 받는 부하 자체를 줄이는 것이다.

로드밸런서

로드밸런싱은 서버에 가해지는 부하를 분산하는 것이다.

로드밸런싱 알고리즘

라운드로빈 방식, 가중 라운드로빈 방식 (Round Robin Method, Weighted Round Robin Method)

라운드로빈 방식은 서버에 들어오는 요청이 순서대로 첫번째 서버, 두번째 서버, .. 이런식으로 할당되는 것이다. 서버 하나씩 순서대로 공평하게 요청을 처리하기 때문에 인스턴스의 성능이 비슷하면 좋다.

만약 서버간 성능 차이가 있다면 성능이 좋은 서버가 더 많은 요청을 받게 할 수도 있다. 이렇게 가중치를 주는 방식을 가중 라운드로빈 방식이라 할 수 있다.

IP 해시 방식

IP 주소를 해싱하여 서버에 매핑하는 것이다. 해싱은 같은 입력에 대해 같은 출력을 보이므로 동일한 사용자는 동일한 서버로 연결되는 것을 보장한다.

하지만 해싱 방식은 문제가 하나 있다. 서버가 늘어나거나 줄어들면 해시의 결과로 할당되는 서버가 달라질 수 있기 때문에 캐시 미스가 발생하는 것이다. 이 부분 관련해서는 안정 해시로 따로 조금 더 정리를 해야할 것 같다.

최소 연결 방식(Least Connection Method)

가장 연결이 적은 상태에 트래픽을 배분하는 것이다. 만약 요청이 긴 서비스가 있을 경우 이 방식이 적합할 것 같다.

최소 응답 시간 방식

서버의 연결상태와 응답시간을 고려해서 트래픽을 분배하는 방식이다.

L4 로드밸러서 vs L7 로드밸런서

L4 로드밸런서는 말 그대로 전송계층 프로토콜을 이용해서 부하 분산을 하는 것이다. L4는 네트워크 계층이므로 IP를 기준으로 로드밸런싱을 할 때 사용한다. 패킷 레벨에서만 부하 분산을 하기 때문에 속도가 빠르지만, HTTP 요청까지 확인을 하지 않기 때문에 디테일한 부하분산은 안된다. L4 로드밸런서는 주로 소프트웨어보다는 벤더사에 의해 제공되는 하드웨어 단에서 수행된다고 한다. Nginx에서 ip 주소로 로드밸런싱이 가능하니 L4 로드밸런싱이 가능하다.

What Is Layer 4 Load Balancing?

L7 로드밸런서는 응용계층인 어플리케이션에서 HTTP의 URI나 쿠키 정보등을 바탕으로 부하 분산을 한다. 내부 패킷을 봐야하기 때문에 L4 보다 비용이 들기는 하지만, 그 효율성 때문에 충분히 가치가 있다고 한다. 예를 들어 요청이 이미지와 관련된 것이면 이미지 처리를 전문으로 하는 서버로 보내고, 비디오와 관련된 것이면 비디오와 관련된 곳으로 요청을 보내면된다.

What is Layer 7 Load Balancing?

Nginx에서 로드밸런싱

upstream backend {  
    {로드밸런싱 알고리즘};     //아무것도 안적으면 라운드로빈이 디폴트다.
    server {was1 ip:포트번호}; 
    server {was2 ip: 포트번호};
}

server {
  ...
  
  location / {
    proxy_set_header Host $host; 
    proxy_set_header Connection ""; 
    proxy_pass http://backend; // 위에서 설정한 backend에 있는 값들로 보낸다. 
  }
}

현재 팀에서는 아직 뚜렷하게 어느 요청이 특히 부하가 많고 이런 것을 파악하지 못했다. 그래서 기본값인 라운드로빈 방식으로 로드밸런싱을 하기로 했다.

추가로 생각해볼 것

서버를 두 대로 늘려서 고려해야할 포인트들이 굉장히 많이 늘었다. 지금 세션을 쓰고 있지 않지만 만약 세션을 쓴다면 두 대의 서버 인스턴스가 메모리를 공유할 수 없으므로 그에 대한 해결책을 마련해야한다. 또 각각의 인스턴스에서 로그를 남기는데 한 사용자에 대해 어떻게 일관적으로 로그를 수집할 수 있을지에 대해서도 생각해야 한다.

참고

1개의 댓글

comment-user-thumbnail
2022년 10월 6일

덕분에 정말 쉽게 배워갑니다 👍👍👍

답글 달기