Scale-up VS Scale-out
scale-up은 수직적 규모 확장(vertical scaling)이라고 하며, 서버에 고사양 자원(더 좋은 성능의 CPU, 많은 RAM 등)을 추가하는 행위를 말한다.
scale-out은 수평적 규모 확장이라고 하며 더 많은 서버를 추가하여 성능을 개선하는 행위를 말한다.
서버로 유입되는 트래픽의 양이 적을 때는 수직적 확장이 좋은 선택이며, 이 방법의 가장 큰 장점은 "단순함"이다. 하지만 이 방법에는 몇 가지 단점이 존재한다.
- 수직적 규모 확장에는 한계가 있다. 한 대의 서버에 CPU나 RAM을 무한대로 증설할 방법이 없다.
- 장애에 대한 자동복구(failover) 방안이나 다중화(redundancy) 방안을 제시하지 않는다. 만약 서버에 장애가 발생한다면 웹/앱은 완전히 중단된다.
이러한 단점 때문에, 대규모 애플리케이션을 지원하는 데는 scale-out이 보다 적절하다.
위와 같은 설계에서는 사용자는 웹 서버에 바로 연결된다. 웹 서버가 다운되면 사용자는 웹 사이트에 접속할 수 없다. 또한, 너무 많은 사용자가 접속하여 웹 서버가 한계 상황에 도달하게 되면 응답 속도가 느려지거나 서버 접속이 불가능해질 수 있다.
이러한 문제를 해결하기 위해 로드밸런서(Load balancer)를 도입한다.
로드밸런서
로드밸런서는 부하 분산 집합(load balancing set)에 속한 웹 서버들에게 트래픽 부하를 고르게 분산하는 역할을 한다.
위 그림은 로드밸런서가 어떻게 동작하는지 보여준다.
사용자는 로드밸런서의 공개 IP 주소(public IP address)로 접속한다. 따라서 웹 서버는 클라이언트의 접속을 직접 처리하지 않는다.
더 나은 보안을 위해, 서버 간 통신에는 사설 IP 주소(private IP address)가 이용된다. 사설 IP 주소는 같은 네트워크에 속한 서버 사이의 통신에만 쓰일 수 있는 IP 주소로, 인터넷을 통해서는 접속할 수 없다.
로드밸런서는 웹 서버와 통신하기 위해 바로 이 사설 주소를 이용한다.
위 그림에서 볼 수 있듯, 부하 분산 집합에 또 하나의 웹 서버를 추가하고 나면 장애를 자동복구하지 못하는 문제(no failover)는 해소되며, 웹 계층의 가용성(availability)은 향상된다. 더 자세히 살펴보면 다음과 같다.
- 서버 1이 다운되면 모든 트래픽은 서버 2로 전송된다. 따라서 웹 사이트 전체가 다운되는 일이 방지된다. 부하를 나누기 위해 새로운 서버를 추가할 수도 있다.
- 웹 사이트로 유입되는 트래픽이 가파르게 증가하면 두 대의 서버로 트래픽을 감당할 수 없는 시점이 오는데, 로드밸런서를 통해 대처할 수 있다. 웹 서버 계층에 더 많은 서버를 추가하기만 하면 된다. 그럼 로드밸런서가 자동으로 트래픽을 분산할 것이다.
위 구조에서 데이터 계층을 살펴보면 하나의 데이터베이스 서버뿐이다. 이는 장애의 자동복구나 다중화를 지원하는 구성이 아니다. 이를 해결하기 위해 데이터베이스 다중화 기술을 이용한다. 여기를 참고하자.
L4 / L7 Load-Balancing
네트워크 통신 시스템은 크게 7가지 계층(OSI 7 layers)으로 나뉜다. 각각의 계층이 L1/L2/L3/.../L7에 해당한다. 상위 계층에서 사용되는 장비는 하위 계층의 장비가 갖고 있는 기능을 모두 가지고 있으며, 상위 계층으로 갈수록 더욱 정교한 로드밸런싱이 가능하다.
부하 분산에서는 L4 Load Balancer와 L7 Load Balancer가 가장 많이 사용된다. 그 이유는 L4 Load Balancer부터 포트(Port) 정보를 바탕으로 로드(부하)를 분산하는 것이 가능하기 때문이다.
그렇다면 L4와 L7에는 어떤 차이가 있을까?
L4 Load Balancer는 네트워크 계층이나 트랜스포트 계층의 정보 즉, IP, Port를 기준으로 스케줄링 알고리즘을 통해 부하를 분산한다. 요청하는 서비스의 종류와 상관 없이 여러 곳에서 처리하는 방식이다.
L7 Load Balancer는 애플리케이션 계층에서 로드를 분산한다. HTTP, Cookie 등과 같은 사용자의 요청을 기준으로 특정 서버에 트래픽을 분산한다. 즉, 패킷의 내용을 확인하고 그 내용에 따라 로드를 특정 서버에 분배하는 것이 가능한 것이다. 아래의 그림과 같이 URL에 따라 부하를 분산시키거나 HTTP 헤더의 쿠키값에 따라 부하를 분산하는 등 클라이언트의 요청을 보다 세분화하여 서버에 전달할 수 있다.
참고
https://m.post.naver.com/viewer/postView.naver?volumeNo=27046347&memberNo=2521903
'IT' 카테고리의 다른 글
[IT] 샤딩(Sharding) / 샤드(Shard) - DB의 수평적 규모 확장 (1) | 2023.04.07 |
---|