안녕하세요,
볼드나인 프론트엔드 개발자 김용재입니다.
현대의 시스템 설계에서 확장성(Scalability)은 필수적인 요소입니다. 트래픽과 데이터가 증가해도 안정적으로 운영되기 위해서는 적절한 확장 방식을 선택하고 시스템을 설계해야 합니다.
이번 글에서는 초기 시스템 구조인 단일 서버 디자인부터 서버의 수평, 수직 확장 그리고 데이터베이스의 확장 전략까지 차근차근 살펴보겠습니다.
단일 서버 디자인 (레거시 시스템)
단일 서버 디자인은 초기 시스템에서 자주 사용되는 간단한 구조로, 하나의 서버가 클라이언트의 모든 요청을 처리하고 데이터베이스도 동일한 서버 내에서 운영되는 설계 방법입니다. 이러한 단순한 설계는 구현이 쉽지만, 심각한 한계를 가지고 있습니다.
먼저, 단일 장애점(Single Point of Failure) 문제입니다. 단일 장애점에서 서버가 다운되면 시스템 전체가 중단되는 취약성이 있습니다. 모든 요청과 데이터 처리가 한 서버에 의존하기 때문에 장애에 매우 민감합니다. 또한, 사용자 트래픽이 증가할 경우 단일 서버만으로 이를 감당할 수 없다는 문제도 있습니다.
개선된 디자인: 데이터베이스 분리
이러한 단일 서버 디자인의 문제를 보완하기 위해 웹 서버와 데이터베이스를 분리하여 각각 독립적으로 운영하는 구조를 설계할 수 있습니다.
이 디자인에서는 클라이언트 요청이 클라이언트 -> 인터넷 -> HTTP 웹서버 -> 데이터베이스 서버 경로를 통해 처리되는데, 이렇게 웹 서버와 데이터베이스 서버를 분리함으로써 각각 확장할 수 있는 유연성이 확보됩니다. 즉, 데이터베이스가 과부하 상태에 이를 경우 복제본을 추가하거나 더 강력한 서버로 교체하여 대응이 가능합니다.
하지만 여전히 웹 서버나 데이터베이스 서버 중 하나라도 장애가 발생하면 시스템 전체가 중단되는 단일 장애점 문제가 남아 있고, 대규모 트래픽 증가나 하드웨어 오류와 같은 상황에 대한 대응이 어려운 한계가 존재합니다.
서버의 수평 확장과 수직 확장
데이터베이스와 웹 서버를 분리한 설계로 단일 서버 디자인의 한계를 어느 정도 극복할 수 있지만, 트래픽 증가나 시스템 안정성을 고려할 때 확장성이라는 더 큰 문제를 해결해야 합니다.
시스템 확장은 곧 서비스의 지속 가능성을 결정짓는 핵심 요소로, 이를 구현하는 방법에는 수평 확장과 수직 확장이라는 두 가지 방법이 있습니다.
수평 확장 (Horizontal Scaling)
수평 확장은 기존 서버 외에 동일한 기능을 가진 새로운 서버를 추가해 트래픽을 분산하는 방식입니다. 이를 통해 한 서버에 집중되는 부하를 여러 대의 서버로 나누어 사용자 증가에 유연하게 대응할 수 있습니다. 예를 들어, 이커머스 플랫폼에서 급격히 증가하는 사용자 요청을 처리하기 위해 추가 웹 서버를 배치하면 서비스 품질을 유지할 수 있습니다.
이 방식의 가장 큰 장점은 무한에 가까운 확장 가능성입니다. 적절히 설계된 시스템에서는 새로운 서버를 추가하기만 하면 점진적으로 성능이 향상되기 때문에, 대규모 트래픽 처리에도 효과적입니다.
또한, 다수의 서버가 동작하기 때문에 고가용성(오랜 기간동안 정상 운영이 가능함)을 보장할 수 있습니다. 특정 서버에 장애가 발생하더라도 로드 밸런서를 통해 다른 서버로 트래픽을 자동으로 분배할 수 있어 서비스 중단을 방지할 수 있습니다.
다만, 수평 확장은 몇 가지 요구사항을 충족해야 합니다. 무상태(stateless) 웹 서버는 요청 간에 상태를 공유하지 않아야 하며, 사용자의 상태 정보는 외부 스토리지(예: Redis, 데이터베이스)에 저장해야 합니다. 또한, 로드 밸런서를 통해 트래픽을 균등하게 분배해야만 여러 서버의 부하를 효율적으로 관리할 수 있습니다.
수직 확장 (Vertical Scaling)
수직 확장은 기존 서버의 성능을 강화하는 방식으로, CPU, 메모리, 디스크 등의 하드웨어 성능을 향상시켜 처리 능력을 높이는 방법입니다. 예를 들어, 데이터베이스 서버의 성능이 부족할 경우 더 많은 CPU 코어나 RAM을 추가해 성능 병목을 해소할 수 있습니다.
이 방식의 장점은 간단한 관리입니다. 추가적인 서버를 운영하지 않기 때문에 서버 인프라를 복잡하게 구성할 필요가 없으며, 시스템 전체의 구조를 변경하지 않고 성능을 높일 수 있습니다. 특히, 초기 스타트업이나 MVP(최소 기능 제품)를 개발하는 단계에서는 비용 효율성과 운영의 단순성을 이유로 수직 확장이 선호됩니다.
하지만 수직 확장은 물리적 한계와 단일 장애점(Single Point of Failure) 이라는 단점을 가집니다. 하드웨어 성능에는 한계가 존재하므로, 일정 수준 이상으로 확장할 수 없으며, 서버 한 대가 모든 요청을 처리하기 때문에 서버가 장애를 일으키면 시스템 전체가 다운됩니다. 이러한 제약으로 인해 대규모 트래픽을 처리하기에는 적합하지 않을 수 있습니다.
정리하자면,
수직 확장은 초기 시스템에 적합한 간단하고 경제적인 선택지이지만, 대규모 트래픽을 처리해야 하는 서비스에는 수평 확장이 필수적입니다. 넷플릭스, 아마존, 구글과 같은 글로벌 기업은 수평 확장을 통해 높은 성능과 안정성을 확보하고 있습니다.
따라서 시스템 설계 시 요구사항과 예상 트래픽 증가량을 면밀히 분석해 가장 적합한 확장 방식을 선택해야 합니다.
데이터베이스 확장 전략
데이터베이스는 시스템에서 중요한 역할을 하지만, 종종 단일 장애점(Single Point of Failure) 이 될 가능성이 큽니다. 이러한 문제를 해결하기 위해 데이터베이스 설계에도 여러 가지 확장 전략이 활용됩니다. 각각의 접근 방식은 시스템의 요구사항과 중요도에 따라 선택될 수 있습니다.
Cold Standby
Cold Standby 는 데이터베이스의 정기적인 백업을 외부 스토리지(예: S3)에 저장하는 방식으로, 장애 발생 시 이를 복구하는 구조입니다. 이 방식은 설정이 간단하고 비용이 저렴하다는 장점이 있지만, 복구 시간이 오래 걸려 높은 다운타임을 초래할 수 있으며, 마지막 백업 이후의 트랜잭션 데이터는 손실될 가능성이 있습니다. 따라서 Cold Standby는 데이터 손실이나 다운타임이 큰 문제가 되지 않는 시스템에 적합합니다.
Warm Standby
다음으로, Warm Standby 는 주요 데이터베이스(primary)의 데이터를 실시간으로 대기 데이터베이스(standby)에 복제하는 방식입니다. 이 방법은 장애 발생 시 대기 데이터베이스로 즉각 전환할 수 있어 최소한의 다운타임을 보장하며, 실시간 복제를 통해 데이터 손실 가능성도 거의 없습니다.
다만, 복제 과정에서 대기 데이터베이스에 부하가 추가될 수 있는 단점이 존재합니다. Warm Standby는 적당한 신뢰성과 빠른 복구가 필요한 중간 규모 시스템에 적합합니다.
Hot Standby
마지막으로, Hot Standby 는 여러 데이터베이스 인스턴스가 동시에 쓰기와 읽기를 처리할 수 있도록 구성한 확장 방식입니다. 이 구조는 수평 확장(Horizontal Scaling)을 통해 읽기와 쓰기 성능을 모두 향상시킬 수 있으며, 높은 신뢰성과 뛰어난 성능을 제공합니다.
하지만 설정이 복잡하고 데이터 동기화 문제를 처리해야 하는 어려움이 있을 수 있습니다. 이러한 이유로 Hot Standby는 대규모 트래픽과 데이터 처리가 필요한 시스템에서 주로 사용됩니다.
지금까지 단일 서버 디자인부터 시작해, 이를 개선하기 위한 데이터베이스 분리, 그리고 시스템 확장을 위한 수평 확장과 수직 확장, 마지막으로 데이터베이스 확장 전략까지 살펴보았습니다. 이러한 설계 방법들은 각각의 장단점이 뚜렷하며, 시스템의 규모와 요구사항에 따라 적절히 선택되고 조합되어야 합니다.
시스템 설계는 요구사항을 정확히 이해하고, 장기적인 확장성과 복원력을 고려하는 것이 핵심입니다.
모든 설계 요소는 하나의 완벽한 해답이 아닌 상황에 맞는 선택의 결과라고 생각합니다. 따라서, 적절한 트레이드오프를 통해 가장 효율적이고 신뢰할 수 있는 시스템 구조를 설계하는 것이 궁극적인 목표라고 할 수 있습니다.
이 글을 통해 다양한 시스템 설계 방식을 이해하고,
프로젝트에 맞는 최적의 시스템을 설계하는 데 도움이 되셨길 바랍니다.