사용자가 적은 작은 규모의 서비스에서는 우리가 구축한 서버가 요청을 처리하는데 큰 어려움이 없다.
하지만 서버 또한 컴퓨터이기 때문에 사용할 수 있는 리소스의 제한이 존재한다.
따라서 사용자가 많아져 동시 요청 수가 많아지는 경우 리소스의 한계에 부딪혀 정상적인 서비스가 불가능해질 수 있다.
이런 문제를 해결하는 방법으로 서버가 받는 부하를 분산해주는 Load Balancing이라는 방법을 적용할 수 있다.
Proxy란 서버와 서버 사이에서 목적에 따라 특정 서버들을 대신해 여러가지 작업을 수행해주는 중개인으로 묘사할 수 있다. 프록시 서버는 요청을 가로채서 응답할 수 있으며, 요청만 전달하거나 수정할 수도 있다.
프론트엔드 서버와 백엔드 서버사이에 프록시 서버 역할을 하는 새로운 서버를 추가함으로써, 프론트엔드 서버는 더이상 백엔드 서버가 아닌 프록시 서버로 요청을 보내게 되고, 프록시 서버는 해당 요청을 받아 필요한 작업을 한 뒤 백엔드 서버에 해당 요청을 넘겨주게 된다.
Forward Proxy은 요청을 보내는 서버 또는 사용자를 대신하여 특정 작업을 처리해주는 프록시이다.
Forward Proxy의 예로 VPN과 캐싱을 예로 들 수 있다.
VPN
VPN은 사내 내부 서버에 접근할 때 보안상의 이유로 특정 IP로만 접속 가능하도록 하기 위한 용도로 사용할 수도 있고, 한국 IP로는 접속이 불가능한 쇼핑몰을 접속하기 위해 특정 국가의 IP를 이용하기 위해서도 VPN을 사용할 수 있다. 이 외에도 많은 사용 예시들이 존재하겠지만, 요청 서버에 대한 실제 정보를 가리는 것이 VPN의 주된 용도라고 할 수 있다.
캐싱
클라이언트에서 같은 요청을 여러번 보낼 때 매번 서버에서 같은 요청에 대한 응답처리를 반복할 필요없이 Forward Proxy 서버에서 캐싱해두고 같은 요청에 대한 응답을 대신 즉시 보내주게 되는 것이다. 이렇게 되면 불필요한 통신이 줄어들고 그만큼 리소스 낭비를 줄일 수 있으며 전체적인 성능 개선 효과를 경험할 수 있다.
Reverse Proxy는 프라이빗 네트워크의 서버에 대한 접근을 제어한다. 데이터 암호화 및 암호 해독, 인증 작업, 정보 캐싱 및 Load Balancer(로드 밸런서) 역할을 수행할 수 있다.
기본적으로 Reverse Proxy는 웹 서버 또는 서버 그룹에 대한 Gateway의 역할을 한다. Reverse Proxy는 클라이언트가 접근하고자 하는 서버의 실제 위치를 masking(마스킹)하여 즉, 실제 서버의 위치를 숨겨서 클라이언트가 아닌 백엔드 서버에 대한 익명성을 제공한다.
Reverse Proxy는 수백만 명의 방문자가 있는 서비스에 로드 밸런서로 활용될 수 있다. 특정 서버가 동시에 많은 요청을 처리하게 되면 여러 문제들이 발생 할 수 있는데, 로드 밸런서가 트래픽을 준비된 서버 그룹에 골고루 분산시켜 해당 문제를 해결 할 수 있다.
Reverse Proxy는 로드 밸런서로서의 역할 뿐만 아니라 보안을 위해서도 필요하다. Reverse Proxy를 통해서만 네트워크에 액세스할 수 있게하여 악의적인 공격을 차단하는 등 웹사이트에 보안과 유연성을 추가할 수 있다.
Scale-up 방식은 서버의 성능을 높이는 방식입니다. 즉, 기존 컴퓨터보다 사양이 훨씬 좋은 컴퓨터로 바꾸는 것이다. 기존보다 컴퓨터의 사양이 더 좋아졌기 때문에 서버는 더 많은 일을 할 수 있게 된다.
Scale-out 방식은 동일하거나 비슷한 성능의 서버를 추가하여 여러 대의 서버를 운용하는 방식이다. 즉, 요청을 처리할 수 있는 컴퓨터를 여러 대를 두어서 일을 분산 시키는 거다. 보통 서버를 확장할 때는 Scale-out 방식을 선호하는데, 그 이유로는 하드웨어 성능을 높이는 비용보다 값싼 서버를 한대 더 추가하는 방법이 보통 더 적은 비용이 들고, 여러 대의 서버를 운용하면서 서비스를 중단없이 운영할 수 있다는 장점이 있기 때문이다.
Load Balancer(로드 밸런서)는 Reverse Proxy의 일종으로 여러 대의 서버에게 요청을 균등하게 분산시켜주는 역할을 한다.
서비스 이용자가 증가하여 scale out 방식으로 서버를 확장 했는데, 하나의 서버에만 요청이 집중 된다면 서버를 확장하기 전과 다를게 없는 시스템이다. 그렇기 때문에 로드 밸런서를 활용하여 우리가 운용중인 서버들에게 요청을 분산 시켜주는 작업이 필요하다.
로드 밸런서는 유저의 접속과 사용을 통해 발생하는 트래픽들(http request)들을 모두 1차적으로 처리한다.
1차적으로 요청들을 처리하고 난 뒤, 로드 벨런서는 서비스를 운영하고 있는 서버들로 요청을 분배하게 된다.
로드 밸런서를 사용하면 요청을 고르게 분배해줘서 많은 요청을 동시에 처리할 수 있게 해주는 장점 외에도 Fault Tolerant System (결함 감내 시스템)을 구축 할 수 있다.
예를 들어, 운영되고 있는 서버 3개 중에 1개가 어떠한 결함이나 에러로 운영 중단이 된다면 로드 밸런서가 자동으로 정상적으로 작동하는 나머지 2개의 서버에만 요청을 분배할 수 있다. 이러면 실제 요청을 보내는 사용자는 서버들 중 하나가 운영 중단이 되었어도 정상적으로 서비스를 이용할 수 있다. 이 사이에 개발자들은 운영 중단 되었던 서버를 고쳐 정상적으로 작동 시키고, 로드 밸런서는 다시 해당 서버를 포함하여 모든 서버들에 요청을 분배한다.
이런 로드 밸런서의 장점을 통해 시스템을 이용할 수 없는 시간을 의미하는 Down Time 없이 서비스 운영 및 배포가 가능하다.
Proxy는 서버와 서버 사이에서 목적에 따라 특정 서버들을 대신해 여러가지 작업을 수행해주는 중개 서버이며, 역할에 따라 Forward Proxy와 Reverse Proxy가 있다.
Forward Proxy는 서버 또는 사용자를 대신하여 특정 작업들을 처리해주는 작업을 수행한다.
Reverse Proxy는 서버에 대한 접근을 제어하여 데이터 암호화 및 암호 해독, 인증 작업, 정보 캐싱 및 Load Balancer(로드 밸런서) 등의 역할을 수행한다.
Scale Out 방식의 확장은 요청을 처리할 수 있는 서버를 늘려 일은 분산 시키는 방식이며, Load Balancer를 통해 구현 할 수 있다.
Load Balancer는 Reverse Proxy의 일종이며, 운영 중인 여러 대의 서버에게 요청을 균등하게 분산시켜주는 역할을 한다.
Load Balancer를 이용하면 Down Time 없이 서비스를 운영하고 배포할 수 있다.