원문은 https://blog.algomaster.io/p/scalability입니다.
시스템 성장에 따라, 이를 처리할 수 있도록 조정하지 않으면 성능이 저하되기 시작합니다.
확장성은 시스템에 리소스를 추가하여 증가하는 부하를 처리할 수 있는 시스템의 속성입니다.
증가하는 작업량을 지원하기 위해 지속적으로 발전할 수 있는 시스템은 확장성이 있습니다.
본 글에서는 시스템이 성장할 수 있는 다양한 방법과 시스템을 확장 가능하게 만드는 방법에 대해 살펴보겠습니다.
시스템은 어떻게 성장할 수 있나요?
시스템은 여러 차원에서 성장할 수 있습니다.
1. 사용자 기반의 성장
더 많은 사용자가 시스템을 사용하기 시작하면서, 요청 건수 증가
예: 신규 사용자가 급증하는 소셜 미디어 플랫폼
2. 기능 성장
시스템의 기능을 확장하기 위해 더 많은 기능 도입
예: 이커머스 웹사이트에서 새로운 결제 수단에 대한 지원 추가
3. 데이터 볼륨의 증가
사용자 활동이나 로깅으로 인해 시스템이 저장하고 관리하는 데이터의 양 증가
예: 유튜브와 같은 동영상 스트리밍 플랫폼은 시간이 지남에 따라 더 많은 동영상 콘텐츠를 저장합니다.
4. 복잡성 증가
시스템의 아키텍처가 새로운 기능, 확장 또는 통합을 수용하기 위해 발전하여 추가적인 구성 요소와 종속성 발생
예: 단순한 애플리케이션으로 시작된 시스템은 더 작고 독립적인 시스템으로 나뉩니다.
5. 지리적 범위의 성장
새로운 지역 또는 국가의 사용자에게 서비스를 제공하기 위해 시스템 확장
예: 새로운 해외 시장에서 웹사이트와 유통을 시작하는 전자상거래 회사
How to Scale a System?
시스템을 확장 가능하게 만드는 10가지 일반적인 방법은 다음과 같습니다:
1. 수직 확장 (Scale up)
즉, 더 많은 RAM, 더 빠른 CPU 또는 추가 스토리지로 서버를 업그레이드하여 기존 시스템에 더 많은 성능을 추가하는 것입니다.
이는 단순한 아키텍처에 적합한 접근 방식이지만 확장할 수 있는 범위에는 한계가 있습니다.
2. 수평 확장 (Scale out)
즉, 시스템에 더 많은 컴퓨터를 추가하여 여러 서버에 작업 부하를 분산시키는 것입니다.
이는 대규모 시스템을 확장하는 가장 효과적인 방법으로 고려되기도 합니다.
예: 넷플릭스는 스트리밍 서비스에 수평적 확장을 사용하여 증가하는 사용자와 데이터 트래픽을 처리하기 위해 클러스터에 더 많은 서버를 추가합니다.
클러스터?
클러스터는 여러 대의 컴퓨터나 서버를 하나의 시스템처럼 함께 작동하도록 연결한 그룹을 의미합니다. 본문에서 언급된 것처럼, 넷플릭스는 수평적 확장(스케일 아웃) 방식을 사용하여 증가하는 사용자와 데이터 트래픽을 처리하기 위해 클러스터에 더 많은 서버를 추가합니다.
클러스터링의 주요 이점은:
- 높은 가용성 - 한 서버가 실패해도 다른 서버가 작업을 계속 수행
- 부하 분산 - 여러 서버에 작업을 분산시켜 성능 향상
- 확장성 - 필요에 따라 새로운 서버를 추가하여 용량 확장 가능
3. 로드 밸런싱(Load Balancing)
로드 밸런싱은 단일 서버가 과부하되지 않도록 여러 서버에 트래픽을 분산하는 프로세스입니다.
예: Google은 글로벌 인프라 전반에 걸쳐 로드 밸런싱을 광범위하게 사용하여 대규모 서버 팜에 검색 쿼리와 트래픽을 고르게 분산합니다.
- 수평적 확장(스케일 아웃)과 로드 밸런싱의 차이점
수평적 확장(스케일 아웃) 로드 밸런싱 시스템에 더 많은 서버나 인스턴스를 추가하는 전략 여러 서버 간에 트래픽을 분산시키는 기술 수용 용량을 늘리는 것에 초점 효율적인 리소스 활용과 가용성 확보에 초점 시스템의 물리적 확장에 관한 것 기존 리소스를 효율적으로 활용하는 방법에 관한 것
4. 캐싱 (Caching)
캐싱은 서버나 데이터베이스의 부하를 줄이기 위해 자주 접근하는 데이터를 메모리(예: RAM)에 저장하는 기술입니다.
캐싱을 구현하면 응답 시간을 획기적으로 단축할 수 있습니다.
예: Reddit은 캐싱을 사용하여 인기 게시물 및 댓글과 같이 자주 액세스하는 콘텐츠를 저장하여 매번 데이터베이스를 쿼리 하지 않고도 빠르게 제공할 수 있습니다.
5. 콘텐츠 전송 네트워크(CDNs)
CDN은 정적 자산(이미지, 동영상 등)을 사용자에게 더 가까운 곳에 배포합니다. 이렇게 하면 지연 시간을 줄이고 로드 시간을 단축할 수 있습니다.
예: Cloudflare는 CDN 서비스를 제공하여 사용자와 가까운 서버에 콘텐츠를 캐싱하여 전 세계 사용자의 웹사이트 접근 속도를 높입니다.
6. 샤딩/파티셔닝 (Sharding/Partitioning)
파티셔닝은 데이터나 기능을 여러 노드/서버에 분산시켜 작업 부하를 분산시키고 병목 현상을 방지하는 것을 의미합니다.
예: Amazon DynamoDB는 파티셔닝을 사용하여 NoSQL 데이터베이스 서비스의 데이터와 트래픽을 여러 서버에 분산하여 빠른 성능과 확장성을 보장합니다.
7. 비동기 통신 (Asynchronous communication)
비동기 통신은 장기적이거나 중요하지 않은 작업을 백그라운드 대기열이나 메시지 브로커로 연기하는 것을 의미합니다.
이렇게 하면 메인 애플리케이션이 사용자에 대한 응답성을 유지할 수 있습니다.
예: Slack은 메시징에 비동기식 통신을 사용합니다.
메시지가 전송될 때 발신자의 인터페이스는 멈추지 않고 백그라운드에서 메시지가 처리되고 전달되는 동안 계속 응답합니다. (= 사용자 또는 시스템이 메시지를 보낸 후에도 차단되지 않고 계속해서 다른 작업을 수행할 수 있다.)
8. 마이크로서비스 아키텍처 (Microservices Architecture)
마이크로 서비스 아키텍처는 애플리케이션을 독립적으로 확장할 수 있는 더 작고 독립적인 서비스로 세분화합니다. 이를 통해 복원력이 향상되고 팀이 특정 구성 요소에 대해 병렬로 작업할 수 있습니다.
예: Uber는 청구, 알림, 차량 매칭 등 다양한 기능을 독립적으로 처리할 수 있는 마이크로서비스로 아키텍처를 발전시켜 효율적인 확장과 빠른 개발을 가능하게 했습니다.
9. 오토 스케일링 (Auto-Scaling)
자동 확장은 현재 부하에 따라 활성 서버의 수를 자동으로 조정하는 것을 의미합니다.
이는 시스템이 수동 개입 없이 트래픽 급증을 처리할 수 있도록 보장합니다.
예: AWS 자동 스케일링은 애플리케이션을 모니터링하고 용량을 자동으로 조정하여 가장 낮은 비용으로 안정적이고 예측 가능한 성능을 유지합니다.
10. 다중 지역 배포 (Multi-region Deployment)
애플리케이션을 여러 데이터 센터나 클라우드 지역에 배포하여 지연 시간을 줄이고 중복성을 개선합니다.
예: Spotify는 다중 지역 배포를 사용하여 전 세계 사용자가 어디에 있든 상관없이 음악 스트리밍 서비스의 가용성과 응답성을 높게 유지합니다.