로드 밸런서의 헬스 체크
로드 밸런서 Load Balancer란
로드 밸런서는 서버의 부하 Load를 분산 Balancing하는 네트워크 장비 또는 소프트웨어입니다.
회사를 다녀보면 동료들이 모두 똑같이 일을 하고 있지 않다는 것을 알게 됩니다. 누구는 매일 6시만 되면 집에 가고 누구는 매일 늦게까지 남아서 일을 하죠. 물론 능력의 차이도 있겠지만 일이 고르게 분배되지 않기 때문입니다.
좋은 체계와 상사가 있는 회사에서는 일감을 적절하게 분배해서 나눠주기 때문에 구성원의 불만과 피로도가 적고, 과부하로 인해 갑자기 멈추거나 폭발하는 사람도 없을 겁니다.
로드 밸런서가 바로 이런 역할을 합니다.
사용자의 요청이 들어오면 연결된 웹 서버 또는 WAS로 요청을 전달해 주고 서버들이 열심히 일을 해서 만들어낸 결과물을 다시 사용자에게 보여줍니다. 어느 서버에 얼마만큼 일을 시킬지를 로드 밸런서가 결정하게 됩니다.
로드 밸런싱 알고리즘
로드 밸런싱을 하는 방법은 다양합니다. 대표적인 알고리즘으로 라운드 로빈 Round Robin이 있습니다. 가장 단순하기 때문에 가장 많이 사용되는 방식으로, 각 서버에 순차적으로 일을 분배합니다.
만약 서버 스펙에 차이가 있다면 적절하게 가중치를 분배하여 일 잘하는 서버에게 일감을 몰아주는 가중치 RR이 적합합니다. 그 밖에 클라이언트의 IP에 따라 결정하는 IP 해시가 있습니다. 이 경우 같은 IP를 쓰는 유저는 계속 동일한 서버로 접속됩니다.
이상이 서버의 현재 상태를 고려하지 않는 정적 로드 밸런싱 알고리즘들입니다.
동적 로드 밸런싱 알고리즘으로는 현재 연결 수가 더 적은 곳을 선택하거나, 응답 시간이 가장 빠른 곳을 선택하거나, 서버의 가용 리소스를 고려하는 방식 등이 있습니다.
헬스 체크 Health check
로드 밸런서는 자기가 거느리고 있는 서버들이 출근은 했는지 어디 아픈데는 없는지 상태를 계속 확인해야 합니다.
상태는 일정한 주기로 서버의 특정 경로( / )에 요청(HTTP)을 보냈을 때 응답 코드(200)로 판단을 합니다.
헬스 체크 경로는 가급적 많은 데이터 트래픽을 발생시키지 않은 곳이 적당하고, 요청 주기, 재시도 횟수, 프로토콜 등도 필요에 따라 설정할 수 있습니다.
문제
서버에 직접 접속할 때는 아무런 이상이 없었는데 로드 밸런서를 연결했더니 사이트가 뜨지 않습니다.
처음에는 서버에서 로드 밸런서를 차단하는 것이 아닌가, WAS의 host 설정에 문제가 있는 것인가 의심을 해보았지만 문제는 LB에 있었습니다.
보통 웹 사이트에 처음 접속을 했을 때 보여지는 페이지를 index 페이지( welcome-file )라고 합니다.
그런데 index.jsp 에서 메인 페이지로 다시 리다이렉트 시키는 구조의 사이트의 경우
로드 밸런서가 헬스 체크 요청에 대한 응답으로 200이 아닌 302을 받기 때문에 서버의 상태를 비정상이라고 판단합니다.
따라서 클라우드 콘솔 등에서 LB에 연결된 웹 인스턴스의 상태는 정상이지만 INACTIVE라고 판단하는 경우 이와 같은 상황이 아닌지 의심해 볼 수 있습니다.
해결
web.xml의 <welcome-file-list>를 보면 index.html이 index.jsp보다 상위에 위치해 있기 때문에
루트 / 로 접속을 했을 때 index.html을 먼저 보게 됩니다.
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
index.html의 내용을 요렇게 바꿔서 메인 페이지로 이동하게 만들어주면
<script>
location.href = ‘main/index.jsp’
</script>
LB의 요청에 대한 응답으로 200이 뜨기 때문에 서버의 상태를 정상이라고 판단하게 됩니다.
또 다른 방법으로는, 로드 밸런서의 헬스 체크 경로 자체를 메인 페이지(/main/index.jsp)로 바꿔주면 간단하게 해결이 됩니다.