로드밸런싱은 트래픽을 여러 서버에 고르게 분배하는 기술입니다. 매우 많은 사용자들의 요청을 한 서버에서 처리하기에는 부담스러우니, 여러 서버로 분배해서 처리함으로써 서버의 부하를 낮추는 것입니다.
여러 서버를 사용하기 때문에, 한 서버에 문제가 발생하더라도 로드밸런싱을 담당하는 로드밸런서가 트래픽을 다른 정상 작동하는 서버로 돌려서 서비스를 유지할 수 있습니다.
나중에 사용자가 더 많아져서, 더 많은 트래픽을 처리해야하면 또 서버를 늘릴 수 있기 때문에 유연성도 좋아집니다.
로드밸런서는 트래픽을 나눌 뿐만 아니라 주기적으로 서버의 상태를 확인해주는 헬스체크라는 기능 또한 가지고 있습니다.
로드밸런싱 알고리즘
라운드 로빈
요청을 순서대로 각 서버에 순서대로 분배해주는 방식입니다. 예를 들어서 A, B, C 세 서버가 있을 때, A → B → C → A … 이런 순서로 요청을 보냅니다.
모든 서버에 같은 수의 요청이 전달되기 때문에, 서버의 성능이 비슷할 때 적합한 방식입니다.
복잡한 조건이 없어 구현하기가 쉽고, 서버 수를 늘리기도 쉽습니다.
서버의 성능이 다를 경우 불균형이 발생할 수 있습니다.
가중치 기반 라운드 로빈
서버의 성능이 다를 경우에, 서버의 성능에 따라 가중치를 부여해 더 좋은 서버에 더 많은 요청이 가도록 하는 방식입니다.
최소 연결 방식
현재 연결된 세션의 수가 가장 적은 서버에 요청을 보내는 방식입니다.
연결 수만 고려하기 때문에, 각 요청의 처리에 걸리는 시간 등은 고려하지 않아 특정 서버에 과부하가 발생할 수 있습니다. 예를 들어, A는 자원이 적게 드는 연결 3개를 가지고 있고, B가 자원이 많이 드는 연결 1개를 가지고 있어도 B에게 새로운 요청을 보내는 상황이 발생할 수 있습니다.
최소 응답 방식
현재 응답 시간이 가장 짧은 서버로 요청을 보내는 방식입니다. 응답 시간이 짧다는 것은 곧 서버의 부하 상태가 낮다는 것을 의미하므로, 부하가 낮은 서버로 요청을 보낼 수 있습니다.
하지만 각 서버의 응답 시간을 계속 모니터링해줘야 한다는 단점이 있습니다.
헬스체크
로드밸런싱을 하기 위해선 서버가 현재 정상인지 비정상인지 확인해줘야 하는데, 이를 위한 과정이 바로 헬스체크입니다. 로드밸런서는 헬스체크를 통해 서버의 상태를 확인하고, 만약 비정상인 서버가 있다면 그 서버에는 트래픽을 보내지 않습니다.
헬스체크 방식
HTTP 헬스체크: 서버의 특정 URL이나 엔드포인트에 HTTP(S) 요청을 보내고 서버가 예상 응답을 보내는지 확인합니다. 예상 응답이 오지 않으면 비정상으로 간주합니다.
TCP 헬스체크: 서버의 특정 포트에 TCP 연결을 시도하여 연결을 수락하는지 확인합니다. 연결이 거부되면 비정상으로 간주합니다.
ICMP 헬스체크: 서버에 핑 요청을 보내고 서버가 응답하는지 확인합니다. 응답이 없으면 비정상으로 간주합니다.