스케일 아웃
서버의 수를 늘려 부하를 여러 서버에 분산시키는 수평 확장 방식입니다.
동작 방식
스케일 아웃 (Scale Out) = 수평 확장
Before
[서버1 (한계치 도달)]
After
[로드밸런서]
/ | \
[서버1] [서버2] [서버3] ← 부하 분산
로드밸런서와 함께 사용
클라이언트 요청
↓
[로드밸런서] ← 트래픽 분배
/ | \
[s1] [s2] [s3]
분배 방식
- Round Robin : 순서대로 번갈아 배분
- Least Connection : 연결 수 가장 적은 서버로
- IP Hash : 같은 IP는 항상 같은 서버로
스케일 아웃의 핵심 문제
1. 세션 불일치
사용자가 서버1에 로그인
↓
다음 요청이 서버2로 라우팅
↓
서버2는 로그인 정보 없음 X
해결책: 세션을 Redis에 중앙 저장
[서버1] [서버2] [서버3]
\ | /
[Redis] ← 세션 공유 O
// Spring - Redis 세션 공유
@EnableRedisHttpSession
public class SessionConfig { }
// application.yml
spring:
session:
store-type: redis
2. 데이터 동기화
서버1에서 파일 업로드
↓
서버2에서 해당 파일 조회 불가 X
해결책: 파일을 S3 등 외부 스토리지에 저장
[서버1] [서버2] [서버3]
\ | /
[S3] ← 파일 공유 O
3. 코드 배포
서버가 늘어날수록 배포 복잡도 증가
해결책: CI/CD + 컨테이너(Docker + k8s)
→ 여러 서버에 동시 배포 자동화
스케일 업 vs 스케일 아웃
| 항목 | 스케일 업 | 스케일 아웃 |
|---|---|---|
| 방법 | 서버 사양 업그레이드 | 서버 대수 증가 |
| 비용 | 고사양일수록 급증 | 상대적으로 저렴 |
| 한계 | 물리적 한계 존재 | 거의 무한 확장 |
| 구현 난이도 | 낮음 | 높음 |
| 다운타임 | 교체 시 발생 | 없음 |
| 장애 대응 | 단일 장애점 | 일부 서버 장애 무관 |
스케일 아웃에 유리한 기술
O Stateless 설계 (REST API)
→ 서버가 상태를 갖지 않아 어느 서버로 가도 동일 처리
O NoSQL (MongoDB, Redis, Cassandra)
→ 분산 저장 설계에 최적화
O 마이크로서비스 (MSA)
→ 서비스별로 독립적인 스케일 아웃 가능
X RDB
→ 분산 환경에서 정합성 유지 어려움
→ 스케일 업이 더 적합
스케일 아웃의 핵심은 "서버를 Stateless하게 설계하는 것" 입니다. 서버가 상태를 갖지 않아야 어느 서버로 요청이 가도 동일하게 처리할 수 있습니다.