# 확장성의 개요
확장성은 마치 건물의 건축자가 미래의 인구 증가를 예측하고, 건물을 더 크게 만드는 것과 비슷합니다.
인터넷 트래픽이 증가하면서, 확장성이 좋은 애플리케이션이 필요해집니다. 따라서, 프로젝트를 구축할 때부터 확장성을 고려하는 것이 중요합니다.
# 주요개념
## 스케일업과 스케일아웃이란?
스케일업은 일반적으로 더 빠른 CPU, 더 많은 RAM, 더 큰 저장공간 등으로 구성됩니다.
이는 마치 집을 더 크게 만들기 위해 기존의 방을 더 넓게 확장하거나 더 높여서 층을 추가하는 것과 비슷합니다.
스케일업은 기존 시스템을 업그레이드하므로 복잡성이 적고 관리가 상대적으로 쉽지만, 하드웨어에는 물리적인 한계가 있어 결국에는 확장성에 제한이 있습니다.
반면에 스케일아웃은 여러 개의 하드웨어를 추가하여 네트워크를 확장하는 것을 의미합니다.
이는 기존 시스템과 동일하거나 비슷한 성능의 하드웨어를 추가하여 시스템의 처리 능력을 향상시키는 것으로, 마치 집을 더 크게 만들기 위해 새로운 방을 추가하거나 새로운 건물을 지어서 이웃에 연결하는 것과 비슷합니다.
스케일아웃은 더 많은 리소스를 추가함으로써 거의 무제한의 확장성을 제공할 수 있지만, 이를 관리하고 조정하는 것이 복잡할 수 있습니다.
또한, 데이터를 여러 시스템에 분산시키는 방법을 고려해야 하므로, 데이터 관리 전략에 대한 고려가 필요합니다.
따라서, 스케일업과 스케일아웃 중 어느 방법을 선택할지는 시스템의 요구사항, 예산, 데이터 관리 전략 등을 종합적으로 고려하여 결정해야 합니다.
## 고가용성이란?
고가용성(High Availability)은 IT 시스템에서 중요한 특성 중 하나로, 서비스가 지속적으로 정상 작동하도록 하는 능력을 말합니다.
이는 사용자가 서비스를 언제든지 이용할 수 있게 하며, 시스템의 다운타임을 최소화하는 것을 목표로 합니다.
고가용성을 달성하기 위해선 다음과 같은 전략들이 사용될 수 있습니다:
1. **중복성(Redundancy)**: 중요한 컴포넌트를 복제하여, 하나가 실패하더라도 다른 하나가 작동하도록 합니다. 예를 들어, 데이터는 여러 디스크에 복제되어 저장되며, 하나의 디스크가 고장나도 데이터를 복구할 수 있습니다.
2. **장애 예방 및 복구(Failover and Recovery)**: 시스템에서 문제가 발생하면, 장애를 자동으로 감지하고 복구하는 메커니즘이 필요합니다. 예를 들어, 주 서버가 실패하면 백업 서버가 자동으로 작동하여 서비스를 계속 제공할 수 있습니다.
3. **부하 분산(Load Balancing)**: 여러 서버에 작업을 고르게 분산시킴으로써, 각 서버의 부하를 줄이고 전체 시스템의 성능을 향상시킵니다. 이는 각 서버에 과부하가 걸리지 않도록 하여 서버의 다운타임을 줄이는 데 도움이 됩니다.
4. **정기적인 백업과 테스트**: 데이터 손실을 방지하고 시스템을 빠르게 복구하기 위해, 정기적으로 백업을 수행하고 복구 절차를 테스트해야 합니다.
## 짧은 지연 시간이란?
짧은 지연시간은 컴퓨터 시스템 또는 네트워크에서 발생하는 응답 시간의 최소화를 의미합니다.
이는 사용자가 작업을 요청한 후 결과를 받을 때까지 걸리는 시간을 줄이는 것을 목표로 합니다.
짧은 지연시간을 달성하기 위해서는 다음과 같은 요소들이 중요합니다:
1. **네트워크 대역폭**: 네트워크 대역폭은 데이터 전송 속도를 결정하는 요소입니다. 충분한 대역폭을 확보하여 데이터가 신속하게 전송되도록 해야 합니다.
2. **서버 성능**: 서버의 성능은 응답 시간에 직접적인 영향을 미치는 요소입니다. CPU, 메모리, 디스크 속도 등의 성능을 최적화하고, 적절한 서버 구성을 선택하여 응답 시간을 최소화해야 합니다.
3. **로드 밸런싱**: 로드 밸런싱은 여러 서버 간에 작업을 분산시켜 부하를 분산시키는 기술입니다. 이를 통해 각 서버의 작업 부하를 고르게 분산하여 지연시간을 최소화할 수 있습니다.
4. **캐싱**: 캐싱은 빈번하게 요청되는 데이터나 연산 결과를 저장해두고 재사용하는 것을 의미합니다. 이를 통해 데이터나 결과를 빠르게 제공하여 지연시간을 줄일 수 있습니다.
5. **지연 시간 최적화 기술**: 데이터 압축, 데이터 전송 최적화, 프로토콜 최적화 등의 기술을 사용하여 데이터 전송 시간을 최소화할 수 있습니다.
짧은 지연시간은 사용자 경험을 향상시키고, 실시간 응용 프로그램에서는 중요한 요소입니다. 예를 들어, 온라인 게임이나 응급 상황에서의 의료 시스템에서는 실시간 상호작용이 필요하므로, 짧은 지연시간이 매우 중요합니다.
따라서, 네트워크 및 시스템의 성능 최적화, 로드 밸런싱, 캐싱 등의 기술을 사용하여 짧은 지연시간을 달성할 수 있습니다. 이를 통해 사용자는 빠르고 응답성 있는 서비스를 경험할 수 있습니다.
## 클러스터란 무엇이며, 클러스터링이 필요한 이유는?
클러스터는 여러 컴퓨터가 연결되어 하나의 시스템처럼 작동하는 것을 말합니다.
마치 팀으로 일하는 것과 같습니다. 클러스터링은 고가용성과 확장성을 제공하기 때문에 필요합니다.
## 지연시간, 대역폭, 처리량이란 무엇인가?
지연시간은 정보가 한 곳에서 다른 곳으로 이동하는 데 걸리는 시간을 말하며, 대역폭은 한 번에 전송할 수 있는 데이터의 양을 의미합니다.
마치 고속도로에서 차량이 이동하는 속도와 차선의 넓이와 같습니다. 처리량은 단위 시간당 처리할 수 있는 작업의 양을 말합니다.
## 부하분산이란 무엇인가?
부하분산은 여러 컴퓨터나 네트워크 간에 작업을 나누는 것을 말합니다.
마치 여러 사람이 짐을 나눠서 들어가는 것과 같습니다.
## 고정 세션(또는 세션 선호도)란 무엇인가?
부하 분산 장치에서 사용하는 고정 세션(Session Persistence) 또는 세션 유지는 클라이언트가 요청하는 서비스를 항상 동일한 서버로 연결시켜주는 기능을 말합니다.
이는 사용자의 요청이 끊김 없이 동일한 서버로 이어지도록 보장하므로, 사용자 세션의 연속성을 유지하는 데 중요한 역할을 합니다.
이 기능은 특히 사용자의 상태 정보를 유지해야 하는 웹 애플리케이션에서 중요합니다. 예를 들어, 온라인 쇼핑몰에서 사용자가 장바구니에 물건을 담았다면 해당 정보는 특정 서버에 저장됩니다.
이후 사용자가 결제를 진행하려 할 때, 고정 세션 기능이 없다면 다른 서버로 연결될 수 있고, 이 서버는 사용자가 물건을 담았던 정보를 모르기 때문에 문제가 발생할 수 있습니다.
이런 문제를 방지하기 위해, 부하 분산 장치는 고정 세션 기능을 통해 사용자의 모든 요청을 처음 연결된 서버로 유지시킵니다.
고정 세션을 구현하는 방법은 여러 가지가 있습니다.
주로 사용되는 방법 중 하나는 쿠키 기반의 세션 유지입니다. 이 방법은 사용자의 브라우저에 쿠키를 저장하고, 이 쿠키를 통해 사용자의 요청을 항상 동일한 서버로 연결시키는 방법입니다.
다른 방법으로는 IP 기반의 세션 유지가 있으며, 이는 사용자의 IP 주소를 기반으로 동일한 서버로 요청을 연결시키는 방법입니다. 이 외에도 세션 ID, SSL ID 등을 활용하는 방법도 있습니다.
이러한 고정 세션 기능은 사용자의 요청을 처리하는 서버 간에 상태 정보를 공유하지 않는 상태 비저장(stateless) 모델에서 특히 중요합니다. 이 모델에서는 각 서버가 독립적으로 동작하기 때문에, 특정 사용자의 요청을 항상 동일한 서버로 연결시켜주는 고정 세션 기능이 필요합니다.
고정 세션 접근법(Session Persistence) 많은 이점이 있지만, 몇 가지 단점도 있습니다:
1. **불균형한 리소스 분배**: 고정 세션 접근법은 사용자 세션을 항상 특정 서버에 연결시키므로, 일부 서버에 과도한 부하가 집중될 수 있습니다. 특히, 일부 사용자가 많은 양의 데이터나 처리를 요구하는 경우, 해당 서버는 과부하 상태에 빠질 수 있습니다.
2. **서버 장애 시 문제**: 세션을 고정시키는 서버가 다운되면, 해당 서버에 연결되어 있던 사용자 세션도 모두 손실됩니다. 이로 인해 사용자 경험이 저하되거나 중요한 데이터가 손실될 수 있습니다.
3. **스케일링 제한**: 고정 세션 접근법은 수평 스케일링(horizontal scaling)을 제한할 수 있습니다. 새로운 서버를 추가하더라도, 이미 고정된 세션들은 기존 서버에 계속 연결되어 있기 때문에, 새 서버를 효율적으로 활용하기 어려울 수 있습니다.
4. **세션 데이터 동기화 문제**: 서버 간에 세션 데이터를 동기화하지 않는 상태 비저장(stateless) 모델에서는, 각 서버가 독립적으로 동작하므로, 특정 사용자의 세션 데이터를 다른 서버와 동기화하는 것이 어렵습니다.
이러한 단점을 극복하기 위해, 레디스(Redis)와 같은 인메모리 데이터 저장소를 사용하여 세션 정보를 모든 서버가 공유할 수 있게 하는 방법, 또는 세션 클러스터링(Session Clustering)과 같은 기술을 사용하여 서버 간에 세션 정보를 공유하는 방법 등이 사용될 수 있습니다.
## 샤딩이란?
샤딩은 데이터베이스를 여러 부분으로 나누는 것을 말합니다. 마치 큰 책을 여러 권으로 나누는 것과 같습니다. 이는 데이터의 처리 속도를 높이고, 확장성을 향상시킵니다.
## 비공유 아키텍처란?
비공유 아키텍처는 각 프로세서가 자신의 메모리를 가지고 있는 시스템 구조를 말합니다. 마치 각 사람이 자신만의 방을 가지고 있는 아파트와 같습니다.
즉, 비공유 아키텍처(Non-shared Architecture)는 컴퓨터 시스템에서 여러 대의 컴퓨터가 각각 독립적으로 자신의 자원을 가지고 동작하는 구조를 말합니다.
이 구조에서 각 컴퓨터는 자신의 프로세서, 메모리, 디스크 등의 자원을 가지고 있고, 다른 컴퓨터의 자원을 공유하지 않습니다.
비공유 아키텍처의 주요 특징과 장점은 다음과 같습니다:
1. **독립성**: 각 컴퓨터는 자신의 작업을 독립적으로 수행하므로, 한 컴퓨터에서 문제가 발생해도 다른 컴퓨터에 영향을 미치지 않습니다.
2. **확장성**: 새로운 컴퓨터를 추가함으로써 시스템의 성능을 증가시킬 수 있습니다. 이를 수평 확장(Horizontal Scaling)이라고 합니다.
3. **고성능**: 각 컴퓨터가 자신의 자원을 전적으로 활용할 수 있으므로, 고성능을 달성할 수 있습니다.
하지만, 비공유 아키텍처는 다음과 같은 단점도 가지고 있습니다:
1. **리소스 공유의 어려움**: 각 컴퓨터는 자신의 자원을 독립적으로 가지고 있으므로, 리소스를 공유하려면 별도의 네트워크 통신이 필요합니다. 이로 인해 네트워크 오버헤드가 발생할 수 있습니다.
2. **데이터 일관성 유지의 어려움**: 각 컴퓨터가 독립적으로 동작하기 때문에, 데이터의 일관성을 유지하는 것이 어렵습니다. 이를 위해 분산 시스템에서는 데이터 동기화 알고리즘을 사용해야 합니다.
비공유 아키텍처는 클러스터 컴퓨팅, 그리드 컴퓨팅, 클라우드 컴퓨팅 등 다양한 분산 시스템에서 사용되며, 이들 시스템은 비공유 아키텍처의 단점을 극복하기 위한 다양한 기술과 알고리즘을 사용합니다.
## 장애 극복 기능(failover)란?
장애 극복 기능은 시스템의 일부가 고장 나면 다른 부분이 그 기능을 대신 수행하도록 하는 기능을 말합니다.
마치 한 바퀴가 펑크 난 자동차가 스페어 타이어로 교체하여 계속 움직이는 것과 같습니다.
이 기술은 시스템의 가용성을 높이고, 중요한 데이터의 손실을 막기 위해 사용됩니다.
장애 극복 기능을 가진 시스템은 다음과 같은 특징을 가지고 있습니다:
1. **중복성(Redundancy)**: 장애가 발생한 경우를 대비해, 중요한 컴포넌트나 시스템이 여러 개 준비되어 있습니다. 하나의 컴포넌트가 고장나면, 다른 컴포넌트가 그 기능을 대체할 수 있습니다.
2. **장애 감지(Fault Detection)**: 시스템은 정기적으로 모든 컴포넌트의 상태를 검사하고, 문제가 발생하면 즉시 알아차릴 수 있습니다.
3. **복구 메커니즘(Recovery Mechanism)**: 장애가 발생하면, 시스템은 자동으로 복구 과정을 시작합니다. 이는 대체 컴포넌트를 활성화하거나, 문제가 발생한 컴포넌트를 다시 시작하는 등의 작업을 포함할 수 있습니다.
장애 극복 기능은 다양한 시스템에서 사용되며, 그 중요성은 시스템의 용도와 필요성에 따라 다릅니다. 예를 들어, 항공 제어 시스템이나 의료 장비 같은 경우, 장애가 생기면 심각한 결과를 초래할 수 있기 때문에, 이런 시스템에서는 강력한 장애 극복 기능이 필요합니다.
또한, 클라우드 컴퓨팅, 분산 시스템, 데이터베이스 시스템 등에서도 장애 극복 기능은 중요한 역할을 합니다. 이러한 시스템에서는 주로 클러스터링, 복제(replication), 샤딩(sharding) 등의 기술을 사용하여 장애 극복 기능을 구현합니다.
## 세션 복제란?
세션 복제는 사용자의 세션 정보를 여러 서버에 복제하여, 한 서버가 실패하더라도 사용자의 세션이 유지되도록 하는 것을 말합니다.
마치 중요한 문서를 여러 곳에 복사해 두는 것과 같습니다.
## CAP 정리란?
CAP 정리(Consistency, Availability, Partition tolerance)는 분산 시스템에서 세 가지 속성인 일관성(Consistency), 가용성(Availability), 그리고 네트워크 분할 허용성(Partition tolerance) 중에서 동시에 세 가지를 모두 만족시키는 시스템을 구현할 수 없다는 이론입니다.
1. **일관성(Consistency)**: 모든 노드가 같은 순간에 같은 데이터를 볼 수 있어야 합니다. 즉, 시스템은 언제나 하나의 정확한 현재 상태를 보여줍니다.
2. **가용성(Availability)**: 모든 요청이 성공 또는 실패 결과를 반환해야 합니다. 즉, 정상 작동하는 노드는 항상 응답을 반환해야 합니다.
3. **네트워크 분할 허용성(Partition tolerance)**: 시스템은 네트워크 파티션(분할)이 발생하더라도 정상적으로 작동해야 합니다. 즉, 시스템의 일부가 네트워크 문제로 인해 다른 부분과 통신할 수 없게 되더라도, 시스템은 계속해서 작동해야 합니다.
CAP 정리에 따르면, 위의 세 가지 속성 중에서 동시에 두 가지만을 만족시킬 수 있습니다.
이를 도식화하면, 세 가지 속성을 각각의 꼭짓점으로 하는 삼각형이 그려집니다. 이 삼각형에서 한 번에 두 꼭짓점만 동시에 선택할 수 있으며, 세 꼭짓점을 동시에 선택할 수는 없습니다.
사실, 대부분의 실제 분산 시스템은 네트워크 분할이 발생할 수 있다는 사실을 받아들여야 하므로, 일관성과 가용성 사이에서 선택을 해야 합니다. 이에 따라, 일관성을 중요시하는 시스템은 CP(Consistency, Partition tolerance) 모델을, 가용성을 중요시하는 시스템은 AP(Availability, Partition tolerance) 모델을 선택합니다.
## 페이스북과 같은 소셜 네트워크의 데이터 구조를 어떻게 설계하시겠습니까? 두 사람 사이의 최단 경로를 표시하는 알고리즘을 설명하세요.
페이스북과 같은 소셜 네트워크의 데이터 구조는 그래프로 표현될 수 있습니다. 이 경우, 노드는 사용자를, 간선은 사용자 간의 관계를 나타냅니다.
두 사람 사이의 최단 경로를 찾는 알고리즘으로는 다익스트라 알고리즘이나 벨만-포드 알고리즘이 사용될 수 있습니다.
이는 마치 두 도시 사이의 최단 거리를 찾는 것과 같습니다. 예를 들어, '철수 → 영희 → 말자 → 복자 → 금자'와 같은 경로를 통해 두 사람 사이의 최단 경로를 찾을 수 있습니다.
# 확장성 추가 개념
## URL 단축 서비스 설계
## 글로벌 동영상 스트리밍 서비스 설계
## 글로벌 채팅 서비스 설계
## 게시판 서비스 및 소셜 네트워크 설계
## 글로벌 파일 저장 및 공유 서비스 설계
## 초대형 소셜 미디어 서비스 설계
## 차량 공유 서비스 설계
## 검색 엔진 관련 서비스 설계
## API 비율 제한기 설계
## 주변 검색 서비스 설계
## 정리