1. 부하 분산이란?
- 사용자에 따라 호출하는 서버의 IP가 다르면 특정 서버에 장애 발생 시, 전체 사용자에게 영향을 미치지 않아 장애 범위는 줄어들지만 여전히 부분적으로 서비스 장애 발생

단일 서버를 구성하거나 서버를 이중화해 서비스 호출을 분리한 경우, 서버 장애에 따라 서비스 장애가 발생한다.
- 이런 문제를 해결하기 위해 L4나 L7 스위치라는 로드 밸런서(Load Balancer)를 사용
📌 로드 밸런서
- 동일한 서비스를 하는 다수의 서버가 등록되고 사용자로부터 서비스 요청이 오면 로드 밸런서가 받아 사용자별로 다수의 서버에 서비스 요청을 분산시켜 부하를 분산
- 서비스를 위한 가상 IP(VIP)를 하나 제공하고 사용자는 각 서버의 개별 IP 주소가 아닌 동일한 가상 IP를 통해 각 서버로 접근
- 각 서버의 서비스 상태를 체크해 서비스가 가능한 서버로만 사용자의 요청을 분산

로드 밸런서를 통한 부하 분산 및 서비스 가용성 확보
2. 부하 분산 방법

부하 분산 예
-
VIP에는 사용자의 서비스 요청이 들어올 때, 어느 서버로 요청을 전달할 것인지 부하 분산 그룹을 설정
-
http 서비스는 서버 1번과 2번으로, https 서비스는 서버 2번과 3번으로 부하 분산 그룹이 존재
-
서로 다른 VIP로도 부하 분산을 구성 가능

동일한 리얼 IP에서 서비스 포트마다 VIP를 다르게 설정할 수 있고 리얼 IP의 서비스 포트와 VIP 포트도 서로 다르게 설정할 수 있다.
3. 헬스 체크
- 로드 밸런서에서는 부하 분산을 하는 각 서버의 서비스를 주기적으로 헬스 체크(Health Check)해 정상적인 서비스 쪽으로만 부하를 분산하고 비정상적인 서버는 서비스 그룹에서 제외해 트래픽을 보내지 않음
3-1. 헬스 체크 방식
ICMP
- VIP에 연결된 리얼 서버에 대해 ICMP(ping)로 헬스 체크를 수행하는 방법
TCP 서비스 포트
- 로드 밸런서에 설정된 서버의 서비스 포트를 확인
TCP 서비스 포트: Half Open
- 초기의 3방향 핸드셰이크와 동일하게 SYN을 보내고 SYN, ACK를 받지만 이후 ACK 대신 RST를 보내 세션을 끊음
HTTP 상태 코드
- 로드 밸런서가 서버로 3방향 핸드셰이크를 거치고 나서 HTTP를 요청해 정상적인 상태 코드(200 OK)를 응답하는지 여부를 체크해 헬스 체크를 수행
콘텐츠 확인(문자열 확인)
- 로드 밸런서에서 서버로 콘텐츠를 요청하고 응답받은 내용을 확인하여 지정된 콘텐츠가 정상적으로 응답했는지 여부를 확인하는 헬스 체크 방법
- 앞단의 서버가 백엔드로 요청을 하고 백엔드에서 정상적인 결괏값으로 웹 페이지에 특정 문자열을 출력하게 해 백엔드 상태까지 확인하면서 헬스 체크를 수행
4. 부하 분산 알고리즘
4-1. 라운드 로빈
- 특별한 규칙 없이 현재 구성된 장비에 순차적으로 돌아가면서 트래픽을 분산
- 서버가 3대가 있을 때, 첫 번째 요청은 1번 서버, 두 번째 요청은 2번 서버, 세 번째 요청은 3번 서버, 네 번째 요청은 다시 1번 서버로 할당
- 모든 장비의 총 누적 세션 수는 동일

라운드 로빈 방식의 부하 분산
4-2. 최소 접속 방식
- 각 장비의 세션 수를 확인해 현재 세션이 가장 적게 연결된 장비로 서비스 요청을 보내는 방식
- 서비스별로 세션 수를 관리하면서 분산해주므로 각 장비에서 처리되는 활성화 세션 수가 비슷하게 분산되면서 부하를 분산

최소 접속 방식
4-3. 해시
- 서버의 부하를 고려하지 않고 클라이언트가 같은 서버에 지속적으로 접속하도록 하기 위해 사용하는 부하 분산 방식
- 해시 알고리즘을 이용해 얻은 결괏값으로 어떤 장비로 부하를 분산할지를 결정
- 알고리즘 계산에 사용되는 값들을 지정할 수 있는데 주로 출발지 IP 주소, 목적지 IP 주소, 출발지 서비스 포트, 목적지 서비스 포트를 사용

해시 방식의 부하 분산
5. 로드 밸런서 구성 방식
5-1. 원암 구성
- 로드 밸런서가 중간 스위치 옆에 연결되는 구성
- 부하 분산을 수행하는 트래픽에 대해서만 로드 밸런서를 경유하고 부하 분산을 수행하지 않는 트래픽은 로드 밸런서를 경유하지 않고 통신할 수 있음

로드 밸런서의 원암 구성, 부하 분산을 이용할 때는 로드 밸런서를 경유한다.
- 로드 밸런서를 이용하는 서비스에 대해서만 로드 밸런서를 경유하므로 불필요한 트래픽이 로드 밸런서에 유입되자 않아 로드 밸런서 부하를 줄일 수 있음
5-2. 인라인 구성
- 로드 밸런서가 스위치에서 서버까지 가는 일직선상 경로에 있는 형태
- 트래픽이 흐르는 경로에 로드 밸런서가 있어 서버로 향하는 트래픽이 로드 밸런서의 서비스를 받는지 여부와 상관없이 로드 밸런서를 모두 통과함
- 구성이 직관적이고 이해하기 쉽지만 모든 트래픽이 로드 밸런서를 경유하므로 로드 밸런서의 부하가 높아짐

로드 밸런서의 인라인 구성, 부하 분산 여부와 상관없이 모든 트래픽이 로드 밸런서를 경유한다.
6. 로드 밸런서 동작 모드
6-1. 트랜스패런트 모드
- 로드 밸런서에서 서비스하기 위해 사용하는 VIP 주소와 실제 서버가 동일한 네트워크를 사용하는 구성
- 기존에 사용하던 네트워크 대역을 그대로 사용하므로 로드 밸런서 도입으로 인한 IP 네트워크 재설계를 고려하지 않아도 됨
- 네트워크에 L2 스위치를 추가하는 것과 동일하게 기존 망의 트래픽 흐름에 미치는 영향 없이 로드 밸런서를 손쉽게 구성할 수 있음

원암과 인라인 구성에서 모두 트랜스패런트 구성이 가능하다.
6-2. 라우티드 모드
- 로드 밸런서를 기준으로 사용자 방향(Client Side)과 서버 방향(Server Side)이 서로 다른 네트워크로 분리된 구성
- 로드 밸런서는 사용자 방향과 서버 방향의 네트워크를 라우팅으로 연결
- 보안 강화 목적으로 서버쪽 네트워크를 사설로 구성해 서버에서 직접 접속하는 것을 막는 용도로 사용되기도 함

원암과 인라인 구성에서도 모두 라우티드 모드 구성이 가능하다.
6-3. DSR(Direct Server Return) 모드
- 사용자의 요청이 로드 밸런서를 통해 서버로 유입된 후에 다시 로드 밸런서를 통하지 않고 서버가 사용자에게 직접 응답하는 모드
- 로드 밸런서를 경유하지 않으므로 원암으로 구성
- 요청 트래픽만 로드 밸런서를 통해 흐르므로 로드 밸런서 전체 트래픽이 감소해 로드 밸런서 부하가 감소
- 로드 밸런서에서 실제 서버까지의 통신이 L2 통신인지, L3 통신인지에 따라 L2 DSR과 L3 DSR로 나뉨

로드 밸런서가 서버 대역을 가지고 있으면 L2 DSR이고 없으면 L3 DSR이다.
7. 로드 밸런서 유의사항
7-1. 원암 구성의 동일 네트워크 사용 시

원암 구성에서 서비스 IP와 서버가 동일 네트워크를 사용할 때의 문제
- 사용자는 10.10이라는 서비스 IP로 요청했지만 응답은 서버의 실제 IP인 10.11로 받게 되고 서비스를 호출한 사용자 입장에서는 요청하지 않은 IP에서 응답 패킷을 받았으므로 해당 패킷은 정상적으로 처리되지 않고 폐기됨
원암 구성의 동일 네트워크 문제 해결 방법
- 게이트웨이를 로드 밸런서로 설정
- 로컬 네트워크가 아닌 외부 사용자의 호출에 대한 응답이 항상 로드 밸런서를 통하므로 정상적으로 사용자에게 응답 가능

서버의 게이트웨이를 로드 밸런서로 설정
- Source NAT 사용
- 로드 밸런서가 실제 서버로 가기 위해 수행하는 Destination NAT 뿐만 아니라 출발지 IP 주소를 로드 밸런서가 가진 IP로 함께 변경
- 로드 밸런서는 응답 패킷의 출발지를 실제 서버에서 로드 밸런서에 있는 서비스 IP로 바꾸고 목적지 IP 주소를 로드 밸런서의 IP에서 원래의 사용자 IP로 변경해 사용자에게 응답

로드 밸런서에서의 Source NAT 설정
- DSR 모드
- 각 서버에는 서비스 IP 정보가 루프백 인터페이스에 설정되어 있으며 서비스에 응답할 때, 루프백에 설정된 서비스 IP 주소를 출발지로 응답

로드 밸런서에서의 DSR 모드 동작
7-2. 동일 네트워크 내에서 서비스 IP(VIP 호출)
- 인라인과 원암 구성에서 동일한 네트워크 내에서 서비스 호출 시 로드 밸런서를 거치지 않고 응답하면 서비스를 요청한 IP 주소가 아닌 다른 IP 주소로 응답이 오므로 해당 패킷은 폐기되면서 정상적인 서비스가 이루어지지 않게됨

동일 네트워크 내에서 서비스 호출 시 로드 밸런서를 거치치 않고 응답하는 경우
해결 방법
- 서비스 요청이 로드 밸런서를 거칠 때, 출발지 IP 주소를 로드 밸런서의 IP로 변경하는 Source NAT 방법을 사용하거나 DSR 모드를 사용해 실제 서버에서 로드 밸런서를 거치지 않고 직접 응답
- 부하 분산 서비스를 받는 서버를 로드 밸런서에 직접 연결