1장. 사용자 수에 따른 규모 확장성 (4)

parkrootseok·2025년 5월 3일

시스템디자인

목록 보기
5/6
post-thumbnail

데이터베이스의 규모 확장

저장할 데이터가 많아지면 데이터베이스에 대한 부하도 증가하게 됩니다. 그때가 오면 데이터베이스를 증설할 방법을 찾아야 합니다. 데이터베이스의 규모를 확장하는 방법엔 두 가지가 있습니다. 하나는 수직적 규모 확장이고 다른 하나는 수평적 규모 확장법입니다.

수직적 확장

수직적 확장은 Scale Up이라고도 부르는데, 기존 서버에 더 많거나 성능이 좋은 자원(CPU, RAM 등)을 증설하는 방법입니다. 이러한 수직적 확장에는 다음과 같은 한계가 존재합니다.

  • 데이터베이스 서버 하드웨어에는 한계가 있으므로 CPU, RAM 등을 무한 증설할 수는 없음
  • SPOF(Single Point of Failure)로 인한 위험성 존재
  • 고성능 서버로 갈수록 가격 부담이 커짐

수평적 확장

데이터베이스의 수평적 확장은 샤딩이라고도 부르는데, 더 많은 서버를 추가함으로써 성능을 향상시키는 방법입니다. 샤딩은 대규모 데이터베이스를 샤드라고 부르는 작은 단위로 분할하는 방법입니다. 모든 샤드는 같은 스키마를 쓰지만, 샤드에 보관되는 데이터 사이에는 중복이 발생하지 않습니다. 이때, 데이터를 어떤 샤드에 보관할지 결정하는 예시는 다음과 같습니다.

위 그림은 샤딩 키를 user_id로 설정한 경우입니다. 샤딩 전략을 구현할 때 가장 중요한 것은 샤딩 키를 어떻게 정하느냐 입니다. 샤딩 키는 파티션 키라고도 부루는데, 데이터가 어떻게 분산될지 정하는 하나 이상의 컬럼으로 구성됩니다. 샤딩 키를 통해 올바른 데이터베이스에 질의를 보내어 데이터 조회나 변경을 처리하기 때문에 데이터를 고르게 분할 할 수 있도록 설정해야 합니다.

샤딩 도입 시 고려할 문제

샤딩은 데이터베이스 규모 확장을 실현하는 기술이지만, 완벽하진 않습니다. 그렇기에 샤딩을 도입하면 시스템 복잡성이 증가하고 다음과 같이 풀어야 할 새로운 문제도 발생합니다.

  • 데이터의 재 샤딩
    • 데이터가 너무 많아져 하나의 샤드로는 더 이상 감당하기 어렵거나 샤드 간 데이터 분포가 균등하지 못하여 특정 샤드만 공간이 부족한 경우를 샤드 소진 현상이라고 합니다.
    • 이 경우, 샤드 키를 계산하는 함수를 변경하고 데이터를 재배치하는 과정이 필요합니다.
  • 유명인사 문제
    • 핫스팟 키 문제라고도 부르는데, 특정 샤드에 질의가 집중되어 서버에 과부하가 걸리는 상황을 말합니다.
    • 만약, 한 샤드에 호출 빈도가 높은 데이터들이 집중 저장되어 있다고 가정하면, 결국 해당 샤드는 과부하가 발생할 수 있습니다.
    • 이 문제를 풀기 위해선, 호출 빈도를 고려하여 샤드에 할당해야 합니다.
  • 조인과 비정규화
    • 하나의 데이터베이스를 여러 샤드 서버로 분리하면, 여러 샤드에 분산되어 있는 데이터에 대한 Join 연산을 수행하기 어려운 상황이 발생할 수 있습니다.
    • 이를 해결하기 위해선, 데이터베이스를 비정규화하여 하나의 테이블에서 질의가 수행될 수 있도록 하는 것입니다.

샤딩을 적용한 아키텍처

백만 사용자, 그리고 그 이상

시스템 규모를 확장하는 것은 지속적이고 반복적인 과정입니다. 이번 장에서 다룬 내용을 반복하다 보면 원하는 규모의 시스템을 설계할 수 있습니다. 그러나 수백만 사용자 이상을 지원하려면 새로운 전략을 도입해야 하고 지속적인 시스템 개선이 필요합니다. 예를 들어, 시스템 최적화를 통해 더 작은 단위의 서비스로 분할하는 것이 있습니다.

이번 장에서 다룬 내용을 간단하게 요약하면 다음과 같습니다.

  • 웹 계층은 무상태 계층으로
  • 모든 계층에 대한 다중화 도입
  • 가능한 많은 데이터를 캐싱할 것
  • 여러 데이터 센터를 지원할 것
  • 정적 콘텐츠는 CDN을 통해 서비스할 것
  • 각 계층은 독립적인 서비스로 분할 할 것
  • 시스템을 지속적으로 모니터링하고 자동화 도구들을 활용할 것
profile
동료들의 시간과 노력을 더욱 빛내줄 수 있는 개발자가 되고자 노력합니다.

0개의 댓글