대규모 시스템 설계 기초 책 정리하기 : 1 - 2 사용자 수에 따른 규모 확장성

laply park·2024년 12월 8일
0
post-thumbnail

읽을때 마다 새로운 지식을 알게되는 책이지만, 다음 챕터로 넘어 갈수록 너무 어려워져서 손이가지 않는 책으로 최대한 많이 이해하고 완독을 목표로 정리를 하기위해서 글을 작성하게 되었다.

처음에는 2부 부터 읽다가 왜 1을 읽지 않느냐는 질문을 받고 1부를 읽게되었고 1부 부터 읽는게 필수라고 할정도로 난이도 차이가 있다.

잘근잘근 씹어먹듯, 많은 지식을 남길 수 있도록 열심히 정리해보자!

사용자 수에 따른 규모 확장성

콘텐츠 전송 네트워크 CDN

CDN(Content Delivery Network) 은 정적 콘텐츠를 전송하는데 쓰이는 지리적으로 분산된 서버의 네트워크이다. 웹 컨텐츠의 복사본을 가까운 곳에 두어, 웹 성능 및 속도를 향상할 수 있게 합니다. 이미지, 비디오, css, js 파일등을 캐시할 수 있다.

계략적으로 정리하면, 사용자가 웹사이트에 방문하면, 사용자에게 가장 가까운 CDN 서버가 정적 콘텐츠를 전달하게 된다.

캐시와 마찬가지로 적절한 만료 시한이 필요하고, 비용과 관련되어 CDN 으로 들어가고 나가는 데이터 전송량에 따라 요금을 내게되어, 적절한 컨텐츠를 캐싱하는것이 중요하다. 또한 CDN 이 죽었을때의 케이스도 고려가 필요하다.


해당하는 이미지는 CDN 이 추가된 설계인데, 정적콘텐츠가 더이상 웹서버를 통해 서비스 되지 않으며, CDN으로 제공하여 더 나은 성능을 보장한다.

무상태(stateless) 웹 계층

웹 계층을 수평적 확장하는 방법, 상태정보(사용자 세션 데이터 등)를 웹 계층에서 제거해야한다. 상태정보는 관계향 데이터 베이스나, NoSql 같은 지속성 저장소에 보관하고, 필요할때 처리 그리고 필요할때 가져오는 것이다.

해당하는 무상태 웹 계층을 만들기 위해서는 다음과 같은 방법이 있을 수 있다.

  1. 로드 밸런서의 고정 세션
  • 사용자의 세션이 있는 서버로 로드밸런서가 연결해 주는것이다. 첫 요청을 통해 세션이 저장된 서버로 계속 요청이 갈수 있도록 적용
  • 단점으로는 특정 서버에만 트레픽이 몰리거나, 특정서버가 죽으면, 세션이 모두 사라질 수 있다.
  1. 세션 클러스터링
  • 세션이 생성되면, 다른 웹서버에 세션을 공유해 전파해서 세션관리가 이루어지는 방식이다. 해당 방법으로 적용하면, 트레픽이 몰리거나 특정 서버가 죽어도 문제가 생기지 않는다.
  • 다만, 세션 전파시 서버수에 비례하여 트레픽이 발생할 수 있고 모든 세션을 모든 서버가 복제해 갖고있어서 메모리 관리가 비효율적으로 관리될 수 있다.
  1. 세션 저장소 분리
  • 세션 저장소를 분리하는 방법으로 1, 2번에서 발생했던 문제가 발생하지 않는다.
  • 이 공유저장소는 관계형 데이터베이스, NoSql, Memcached/Redis 와 같은 캐시 시스템으로 생성할수 있다.

메시지 큐 / 로그, 메트릭 그리고 자동화

메시지 큐

메시지큐는 메시지의 무손실을 보장 하는 비동기 통신을 지원하는 컴포넌트다.

  • 기본 아키텍처는 다음과 같다. 생산자/발행자 -> 메세지 큐에 발행 -> 소비자/구독자 라고 분리는 서비스 혹은 서버가 메시지를 받아 그에 맞는 동작을 수행하는 역할을 한다.

메세지 큐를 이용하면 서비스, 또는 서버 간 결합이 느슨해져서, 규모 확장성이 보장되어야 하는 안정적 애플리케이션을 구성하기 좋다.

로그, 메트릭 그리고 자동화

로그

  • 에러로그를 모니터링하는 것은 시스템의 오류와 문제들을 보다 쉽게 찾아낼 수 있게 한다.
    메트릭
  • 메트릭을 잘 수집하면 사업 현황에 관한 유용한 정보를 얻을 수 있고, 시스템의 현재 상태를 손쉽게 파악할 수있다.
  • 메트릭은 하드웨어나 소프트웨어에 대한 성능 측정을 위한 측정 수치 값으로 볼수 있다.

자동화

  • 시스템이 크고 복잡해지면 생산성을 높이기 위해 자동화 도구를 활용해야한다. CI / CD 등 빌드, 테스트, 배포 등의 절차를 자동화 해 둔다면, 개발 생산성을 크게 향상시킬수 있다.

메세지 큐와 로그, 모니터링, 메트릭, 자동화 등을 적용한 설계안.

데이터 계층의 수직적 확장

저장 할 데이터가 많아지면 DB 의 부하가 늘어난다. 데이터베이스의 규모를 늘려야하는 데 두가지 방법이 있다.

  1. 수직적 확장
    기존 서버에 더 많은, 고성능의 자원을 증설하는 방법이다. 해당 방법에는 심각한 약점이 있는데, 비용이 많이들고, 무한 증설이 어렵고, SPOF (Single Point Of Failure) 로 인한 위험성이 크다.

  2. 수평적 확장
    수평적 확장은 샤딩(sharding)이라고 부르는데, 더많은 서버를 추가하므로써 성능을 향상시킬수 있도록 하는 방법이다.

    샤딩은 대규모 DB 를 샤드라고 부르는 작은 단위로 분할하는 기술을 일컫는다. 모든 샤드는 같은 스키마를 쓰지만, 데이터는 중복이없다.

    가장 중요한 고려사항은 샤딩키(파티션키)를 어떻게 정하느냐 하는것, 데이터를 고르게 분할 할 수 있도록 하는게 가장 중요하다. 다만, 샤딩이 도입되면, 시스템이 복잡해지고 풀어야할 문제도 많이 생긴다.

  • 데이터 의 재 샤딩 : 데이터가 많아져서 하나의 샤드로는 감당이 안되거나, 데이터간 분포가 균등하지 못해서 특정 샤드의 할당 공간이 다른 샤드보다 빨리 진행될때 샤드키를 계산하는 함수를 변경하고 데이터 재배치가 필요하다.

  • 유명인사 문제 : 특정 샤드에 질이가 집중되어 서버에 과부하가 걸리는 문제

  • 조인과 비정규화 : 샤드 서버로 쪼개고 나면, 여러 샤드에 걸친 데이터를 조인하기가 힘들어진다. 데이터 베이스를 비정구화 하여 하나의 테이블에서 질이가 수행될 수 있도록 하는 방법으로 해결해야한다.

마무리

시스템 규모를 확장하는 방법을 각각의 서비스 단에서 어떤방법이 있을지 방법을 확인해보면서 작업했다. 기존에 알고있었던 방법과 새로 공부한 방법 또 제대로 이해하지 못했던 방법 등 많은 방법을 정리하고 이해할 수 있었다.

해당 방법들을 이용한다면, 서비스들을 잘 확장해 나갈 수 있을것이다.

profile
선한 의지를 기반으로 많은 사람에게 행복을 전해줄 수 있는 사람이 되기를 꿈꿉니다.

0개의 댓글