로드 밸런서의 동작 방식과 로드 밸런싱
부하 분산이란 무엇인가?
부하 분산이란 특정 서버에 몰리는 트래픽을 여러 서버로 분산시켜서 부하를 분산시켜준다는 의미입니다. 이러한 부하 분산 작업은 대규모 서비스를 제공할 때 필수적으로 수행되어야 합니다. 서비스가 단일 서버로 구성 될 경우 해당 서버에 장애가 나면 전체 서비스가 중단되기 때문에 서버를 여러대를 놓아서 분산 시스템이 서비스를 수행할 수 있게 해주어야합니다. 이러한 분산 시스템을 통한 서비스를 가능하게 하는 작업이 부하 분산 작업입니다. 이러한 부하 분산 작업을 해주는 장비로 로드밸런서가 존재합니다.
부하 분산을 수행해주는 장비 로드 밸런서
로드 밸런서는 서비스의 가용성을 보장하기 위해 여러 서버로 구성된 서버에게 트래픽을 분산시켜줍니다. 보통 서비스는 가용성을 높이기 위해 여러대의 서버로 서비스를 제공합니다. 이 경우 클라이언트는 어떤 서버로 요청을 해야할지 난감한 상황이 발생합니다. 이러한걸 해결하기 위해 서버와 클라이언트 사이에서 로드밸런서가 존재하여 클라이언트와 서버를 연결해주고 그 연결을 관리해줍니다.
이러한 로드 밸런서는 서비스를 위한 가상 IP(VIP)를 가지고 있습니다. 이러한 가상 IP는 서비스를 위해 존재하기 때문에 서비스 IP라고도 합니다. 그리고 각 서버는 개별적으로 IP를 가지고 있습니다. 이렇게 로드 밸런서의 가상 IP와 각 서버의 실제 IP는 바인딩이 됩니다. 여기서 바인딩이라는 것은 연결이 된다는 것입니다. 클라이언트는 로드밸런서의 가상 IP로 접속해 로드 밸런서를 통해 각 서버와 통신합니다. 이렇게 로드 밸런서를 통해 가상 IP와 실제 IP가 통신할 때 포트의 변경까지 수행 할 수 있습니다. 로드밸런서에서 80번 포트로 트래픽을 받았지만 실제 IP가 있는 서버에서는 8080 포트로 트래픽을 받고, 응답할 수 있습니다. 이렇게 로드밸런서는 이렇게 가상 IP를 가지고 각 서버의 IP로 트래픽을 분산시켜줍니다.
이렇게 부하 분산 뿐만 아니라 방화벽을 액티브-액티브 상태로 구성하기 위한 방화벽 부하 분산을 위해 로드밸런서가 사용되기도 합니다.
추가적인 로드 밸런서에 대한 글은 여기에서 확인할 수 있습니다.
로드 밸런서의 작동 방식
1. 헬스 체크
로드 밸런서는 부하 분산 작업을 진행 할 때 서버가 살아있는지, 장애가 발생하지 않았는지 끊임없이 체크합니다. 이렇게 주기적으로 서버가 문제가 없는지 확인하는 작업을 헬스체크라고합니다. 로드밸런서는 이러한 헬스체크의 결과물을 바탕으로 서버들의 상태를 파악하고 정상인 상태의 서버로만 부하를 분산합니다.
이러한 헬스 체크 방식으로는 ICMP방식을 통한 헬스체크가 있습니다.
ping을 날려서 해당 서버가 살아있는지 확인하는 겁니다. 다만 서버가 작동은 하지만 오작동을 하고 있는 경우는 잡아내지 못합니다.
또 다른 헬스 체크 방식으로는 TCP 서비스 포트를 확인하는겁니다. TCP 방식의 three way-handshake방식을 활용해서 SYN과 ACK를 서버와 로드밸런서 간에 주고 받습니다. 그리고 Three way-Handshake방식으로 인증이 완료되면 FIN 시그널을 보내 헬스 체크를 종료합니다.
뿐만 아니라 Three way-handshake까지 가지 않고 TCP Half Open 방식으로 통신을 하기도 합니다. SYN,ACK를 주고 받지만 로드 밸런서가 서버로 부터 SYN ACK를 받은 이후 RST를 보내 세션을 끊는 방법입니다.
마지막으로 서버의 응답 콘텐츠 확인, HTTP 상태코드 확인과 같이 서버에게 HTTP 메세지를 준 다음 그에 대한 응답이 올바른지 확인하는 방법도 존재합니다. 응답 콘텐츠 확인 방식은 기대한 콘텐츠가 전송 되는지 확인하는 방식이고 HTTP 상태코드 확인 방식은 기대한 200 Status code가 오는지 확인하는 방식입니다.
이러한 헬스 체크 방식 뿐만 아니라 헬스 체크 주기에 대한 설정도 로드밸런서에서 중요하게 생각해야합니다. 헬스 체크 패킷을 서버로 얼마간의 기간을 두고 보낼 지, 얼마나 응답을 기다릴지, 응답이 없을 경우 몇번까지 다시 시도할 것인지, 얼마 동안 만큼 응답이 없으면 서버가 다운되었다고 판단할 것인지, 서비스 다운이 된 서버에 대해 얼마간의 기간을 두고 다시 헬스 체크 패킷을 보낼 것인지 설정을 해줘야합니다.
부하 분산 알고리즘
로드 밸런서가 부하 분산 작업을 할 때 미리 설정된 분산 알고리즘을 통해 부하 분산을 시행합니다. 이러한 부하 분산 알고리즘으로는 라운드 로빈, 최소 접속 방식, 해시가 있습니다.
우선 첫번째로 라운드 로빈 방식은 로드밸런스와 연결된 서버들에게 순차적으로 돌아가며 트래픽을 분산하는 방식입니다. 순차적으로 모든 서버에 트래픽을 분산하기 때문에 장비당 누적 세션 수는 동일합니다. 장비당 누적 세션 수는 (전체 세션 수/ 장비 수) 입니다.
그 다음으로 최소 접속 방식은 서버의 세션 부하를 체크한 후 부하량에 따라 분산을 다르게 하는 방식입니다. 각 서버에 보내진 세션 수를 확인 한 후 세션이 가장 적게 보내진 장비에 세션을 보내는 방식으로 진행됩니다.
마지막으로 해시 방식은 서버의 부하 보다는 클라이언트가 같은 서버에 지속적으로 통신할 수 있도록 사용하는 방식입니다. 해시 알고리즘을 통해 어떤 장비로 트래픽을 분산할지 결정하는데 동일한 키 값을 가지고 있는 트래픽은 일정한 서버로 보내지기 때문에 서버에서 세션을 지속적으로 유지할 수 있습니다. 항상 동일한 장비로 서비스가 분산되기 때문에 세션 유지가 필수적인 서비스에 필요한 분산 방식입니다. 다만 해시 알고리즘의 결과값이 특정 서버에만 치중되면 부하 분산 비율이 특정 서버에만 지나치게 커질 수 있다는 단점이 존재합니다.
최근 로드 밸런서는 스티키 옵션을 통해 해시 방식과 최소 접속 방식의 장점을 결합해 사용하기도 합니다. 스티키 옵션은 한번 체결된 커넥션을 지속적으로 유지하는 방식으로 처음 들어온 서비스를 세션 테이블에 기록해 동일한 클라이언트에게서 요청이 들어오면 이전에 처리했던 서버로 동일하게 분산해주는 서비스입니다.
네트워크에서의 로드 밸런서 구성
네트워크에서 로드 밸런서를 구성하는 방법은 로드밸런서의 위치에 따라 원 암 구성 방식, 인라인 구성 방식으로 나뉩니다.
원 암 구성
원 암 구성은 로드밸런서가 중간 스위치 옆에 존재하는 구성입니다. 이러한 원 암 구성은 모든 트래픽이 로드밸런서로 가는 것이 아니라 부하 분산을 수행 당하는 트래픽만 로드밸런서를 경유합니다. 만약 로드밸런서를 경우하는 트래픽의 경우 서비스 IP와 실제 IP간의 차이가 있기 때문에 Destination NAT와 Source NAT를 적용해주어야 합니다. 이러한 원 암 방식은 스위치와 로드밸런서 간의 연결 인터페이스가 1개라는 의미가 아니라 연결되어있다는 의미입니다.
인라인 구성
인라인 구성은 로드밸런서가 스위치 중간에 존재하는 경우로 모든 트래픽이 로드밸런스를 경유합니다. 부하 분산 작업을 수행 당하지 않더라도 모든 트래픽은 로드밸런서를 지나기 때문에 로드 밸런서에 대한 부담이 높아진다는 특징이 있습니다.
출처: IT엔지니어를 위한 네트워크 입벽
Leave a comment