시스템 사용자 수가 늘어날수록 설계해야 하는 시스템의 규모가 달라지며, 이를 위해 다양한 요소를 고려해야 한다. 수백만 명의 사용자가 존재하는 대규모 시스템을 개발할 때 필요한 중요한 사항을 정리해본다.
시스템이 수평적 확장(Scale out)을 하려면 웹 계층이 무상태를 유지해야 한다. 사용자 세션 정보와 같은 상태 정보는 데이터베이스와 같은 지속 가능한 저장소에 맡기고, 웹 계층은 필요할 때만 데이터를 불러온다. 이를 통해 웹 서버가 사용자 요청을 처리하는 데 상태 정보가 필요 없으므로 서버를 추가하거나 제거하는 과정이 용이해진다.
데이터베이스 호출을 최소화하고 자주 참조되는 데이터를 메모리에 캐시하여 빠르게 접근할 수 있도록 한다. 캐시 메모리가 너무 작으면 자주 사용되는 데이터가 캐시에서 밀려나 성능 저하가 발생할 수 있어, 캐시 용량을 넉넉히 할당해두는 것이 좋다.
데이터 센터의 장애에 대비해 여러 지역에 데이터 센터를 구축하여, 가장 가까운 데이터 센터로 사용자 트래픽을 라우팅한다. 장애가 발생할 경우 다른 데이터 센터로 트래픽을 전환하여 서비스의 안정성을 확보할 수 있다.
정적 콘텐츠는 주로 이미지, 비디오, CSS, JavaScript 파일 등을 포함하며, CDN을 통해 제공하면 사용자가 가장 가까운 서버로부터 파일을 전달받아 로딩 시간을 단축할 수 있다. 이를 통해 사이트의 로딩 속도를 줄이고, 메인 서버의 부하를 줄일 수 있다.
데이터베이스의 수평적 확장을 위해 데이터를 샤딩(sharding)하여 관리한다. 각 샤드는 동일한 스키마를 사용하되 데이터를 분할하여 저장한다. 주요 고려사항은 다음과 같다:
서비스를 독립적인 마이크로 서비스 구조로 분리하면, 한 서비스의 장애가 다른 서비스에 영향을 미치지 않도록 할 수 있다. 시스템이 커질수록 계층마다 독립적으로 서비스화하여 안정성과 확장성을 확보할 수 있다.
시스템의 규모 확장은 단순히 서버를 추가하는 것뿐만 아니라, 서비스의 안정성과 성능을 보장하기 위한 설계와 고려가 필요하다. 무상태 웹 계층, 데이터베이스 다중화, 캐시 및 CDN 활용, 샤딩과 마이크로 서비스 구조, 그리고 모니터링 및 자동화 도구의 도입은 안정적이고 확장 가능한 시스템을 구축하는 데 중요한 역할을 한다.