Chapter 3. 용량과 부하 관리
3-1. 용량과 성능
- 용량(Capacity)과 성능(Performance)은 시스템을 설계할 때 자주 함께 언급되지만, 서로 연관은 있어도 다른 개념입니다.
- 용량은 시스템이 감당할 수 있는 처리 능력이나 저장할 수 있는 데이터 양 등, 시스템이 허용할 수 있는 최대치를 의미합니다.
- 관련 지표: 처리량(Throughput)
- 성능은 하나의 요청을 얼마나 빠르게 처리하는지를 나타내는, 응답 속도에 가까운 개념입니다.
- 관련 지표: 응답 시간(Latency)
- 용량을 늘리면 더 많은 요청을 동시에 처리할 수 있지만, 개별 요청 하나의 응답 속도(성능)가 반드시 함께 좋아지는 것은 아닙니다.
용량과 성능은 다른 축이다
용량은 "얼마나 많이 처리할 수 있는가", 성능은 "얼마나 빠르게 처리하는가"에 대한 지표입니다. 두 지표는 서로 영향을 주고받지만 하나가 좋아진다고 다른 하나가 자동으로 좋아지지는 않으므로, 확장 전략을 세울 때는 어떤 지표를 개선하려는 것인지 먼저 구분해야 합니다.
3-3. 수평 확장: 스케일 아웃과 스케일 인
- 스케일 아웃(Scale Out)은 서버(노드)를 추가해 처리 능력을 늘리는 방식이고, 스케일 인(Scale In)은 반대로 노드를 줄이는 방식입니다.
- 수평 확장에서는 여러 노드가 데이터를 나누어 갖거나 복제하게 되므로, 데이터 변경과 참조에 관한 일관성 모델에 주의해야 합니다.
일관성 모델
- 강한 일관성(Strong Consistency): 데이터 변경 처리 결과가 모든 노드에 즉시 반영되는 모델입니다.
- 결과적 일관성(Eventual Consistency): 데이터 변경 처리를 비동기로 각 노드가 개별적으로 처리하여, 모든 노드의 데이터가 동기화되기까지 어느 정도 시간이 걸리는 모델입니다.
강한 일관성과 스케일 아웃의 한계
강한 일관성을 채택하면 하나의 변경이 모든 노드에 즉시 반영되어야 하므로, 노드를 아무리 늘려도 동기화 비용이 함께 늘어나 스케일 아웃에 따른 용량 향상 효과를 충분히 얻기 어렵습니다. 반면 결과적 일관성은 동기화 지연을 감수하는 대신 수평 확장의 이점을 더 크게 누릴 수 있습니다.
부하 분산 알고리즘
- 라운드 로빈(Round Robin)
- 요청을 순서대로 각 서버에 균등하게 분배하는 방식으로, 각 처리의 크기와 소요 시간이 서로 비슷할 때 효과적입니다.
- DNS 라운드 로빈: DNS가 하나의 도메인에 여러 IP를 등록해두고, 조회할 때마다 순서를 바꿔 응답함으로써 부하를 분산합니다.
- 가중 라운드 로빈(Weighted Round Robin): 서버마다 처리 성능이 다를 경우, 성능이 좋은 서버에 더 많은 가중치를 부여해 분배 비율을 조정합니다.
- 최소 접속(Least Connections)
- 현재 연결 수가 가장 적은 서버로 요청을 분배하는 방식입니다.
- 각 서버의 실시간 접속 수를 알아야 하므로 클라이언트 단에서 구현하기는 어렵고, 프록시나 로드밸런서 같은 중계 장비에서 구현합니다.
- 일관적 해싱(Consistent Hashing)
- 요청 키를 해 시링(Hash Ring) 위에 매핑해 담당 노드를 결정하는 방식입니다.
- 노드가 추가되거나 제거되어도 재배치되는 키의 범위가 최소화되어, 캐시나 분산 저장소처럼 노드 변경이 잦은 환경에서 유리합니다.
수평 확장과 접속 위치 고정 (스티키 세션)
- 경우에 따라 같은 클라이언트에서 온 요청은 반드시 같은 노드가 처리해야 하는 상황이 있습니다.
- 예: 한 노드에서 임시 파일을 생성하고, 두 번째 요청에서 그 파일을 다운로드하는 경우
- 이런 요구사항이 있으면 수평 확장의 기술적 난이도가 올라갑니다.
- 이때 사용하는 기법을 퍼시스턴스(Persistence) 또는 **스티키 세션(Sticky Session)**이라고 하며, 로드밸런서(중계 장비)가 특정 기준에 따라 접속할 노드를 결정합니다.
- 쿠키 기반 (L7): 분배 대상 노드가 각자 고유한 정보를 클라이언트의 쿠키에 저장해두면, 로드밸런서가 이후 요청의 쿠키 값을 보고 같은 노드로 분배합니다. 쿠키를 사용하므로 L7 계층에서 구현하는 것이 일반적이지만, 노드가 아닌 중계 장비가 직접 쿠키를 부여하는 경우도 있습니다.
- IP 기반 (L4): 로드밸런서가 클라이언트 IP 등 접속자 정보와 분배 위치를 함께 기억해두고, 두 번째 요청부터는 동일한 노드로 분배합니다. 다만 같은 IP를 통해 여러 사용자가 접속하는 환 경(NAT 등)에서는 실제로는 다른 사용자라도 같은 노드로 분배될 수 있다는 단점이 있습니다.
L4 방식과 L7 방식 중 선택
L4 기반 스티키 세션은 구현이 단순하지만 NAT 환경에서 특정 노드로 부하가 쏠릴 위험이 있고, L7 기반(쿠키)은 세션을 더 정교하게 식별할 수 있는 대신 로드밸런서가 애플리케이션 계층까지 처리해야 하므로 상대적으로 부담이 큽니다. 가능하다면 스티키 세션 자체를 없애고 상태를 외부 저장소로 옮기는 무상태(Stateless) 설계가 수평 확장에는 더 유리합니다.
3-4. 수직 확장: 스케일 업과 스케일 다운
- 수직 확장은 노드 수를 늘리는 대신, 시스템 하나가 갖는 리소스의 용량 자체를 조절하는 기법입니다.
- 리소스를 늘려 성능을 향상시키는 것을 스 케일 업(Scale Up), 반대로 리소스를 줄여 성능을 낮추는 것을 **스케일 다운(Scale Down)**이라고 합니다.
- 가상화 기술이 발전하면서 OS를 정지하지 않고도 CPU, 메모리, 디스크 성능을 변경할 수 있게 되었으며, 이를 **온라인 변경(Online Resize)**이라고 합니다.
사양 변경만으로는 끝나지 않는다
리소스 사양을 바꾸는 것만으로 확장이 끝나지 않습니다. 사양 변경에 맞춰 설정 변경과 튜닝도 함께 이루어져야 합니다.
- 디스크 용량을 늘렸다면 파티션과 파일 시스템도 함께 확장해야 실제로 사용 가능한 용량이 늘어납니다.
- 미들웨어나 애플리케이션이 시작 시점의 리소스 값을 캐싱해 쓰는 경우, 변경 사항을 반영하려면 재시작이 필요할 수도 있습니다.
정리
- 용량은 "얼마나 많이 처리할 수 있는가", 성능은 "얼마나 빠르게 처리하는가"를 나타내는 서로 다른 지표입니다.
- 수평 확장(스케일 아웃/인)은 노드 수를 조절하는 방식으로, 일관성 모델과 부하 분산 알고리즘, 스티키 세션 여부를 함께 고려해야 합니다.
- 수직 확장( 스케일 업/다운)은 노드 하나의 리소스 자체를 조절하는 방식으로, 온라인 변경이 가능하더라도 파일 시스템 확장이나 재시작 같은 후속 작업이 필요할 수 있습니다.