본문 바로가기
CS/데이터베이스

대용량 시스템에 대한 이해 - 03. 대용량 시스템 아키텍처 맛보기

by 컴쏘 2023. 6. 4.

대용량 트래픽 / 데이터 처리는 왜 어려울까?

  • 하나의 서버 또는 데이터베이스로 감당하기 힘든 부하 → 다수의 서버와 데이터베이스를 마치 하나인 것처럼 동작시키기 위해 여러가지 기법들이나 최적화 방법들을 사용하게 되는 것임
    • 하나의 서버로 감당하기 힘들어 대부분 여러개의 서버 또는 데이터베이스를 사용함
    • 여러개의 서버에서 유입되는 데이터의 일관성을 보장할 수 있어야 함
  • 웹 서비스들은 24시간 무중단(언제든지 사용할 수 있어야 함) → 잘못된 코드 한 줄이 미치는 영향의 범위가 크다
    • 코드 한 줄이 데이터에 미치는 영향범위가 굉장히 커짐
  • 여러 마이크로 서비스들이 복잡한 의존 관계를 가짐 → 하나의 서버에서는 단순히 join도 가능하고 여러 transaction 보장들이 쉽게 되지만, micro service architecture의 분산 환경에서는 이것조차도 굉장히 난이도가 높아지게 됨
    • 여러 서비스들이 얽혀있어, 시스템 복잡도가 상당히 높음

그렇다면 대용량 시스템 어떠해야 하는가?

아래 3가지는 반드시 갖춰야 한다.

고가용성

  • 언제든 서비스를 이용할 수 있어야 한다.

확장성

  • 시스템이 비대해짐에 따라 증가하는 데이터와 트래픽에 대응할 수 있어야 한다.

관측가능성

  • 문제가 생겼을 때 빠르게 인지할 수 있어야 하고 문제의 범위를 최소화 할 수 있어야 한다.

시스템 발전시켜보기

대용량 시스템의 아키텍처는 어떤 모습을 하고 있는지, 점진적으로 시스템을 발전시켜 보자

가장 간단한 모델

클라이언트. 서버, 데이터베이스 3개의 layer를 두고 시작해보자.

  • 사용자가 적을 때 : 이런 간단한 모델에서는 적절한 응답을 줄 수 있음
  • 사용자가 점점 많아진다면? 서버의 응답 속도가 느려짐 → 어떻게 해야할까?

서버의 스케일 아웃 적용해보기

서버의 대수를 늘려서 하나의 서버가 받는 요청량을 줄이기

스케일 아웃을 적용할 때 중요한 점은 부하분산을 어떻게 할 것인가?

만약 서버를 3대나 늘렸는데, 1대에만 요청이 몰리면 의미가 없어짐 → 따라서 Nginx와 같은 로드 밸런서를 앞단에 두게 된다.

  • 로드밸런스가 클라이언트의 요청을 받게 되고, 어떤 서버로 보낼지 결정하게 됨
    • 대부분은 round robin 알고리즘을 많이 사용하게 됨
    • 서비스의 특징에 따라서 LRU를 사용할 수도 있다.
    • 여러가지를 혼합해서 로드밸런싱을 할 수 있음

스케일 아웃과 로드밸런서를 서버에 적용했더니 이제는 응답속도가 안정적으로 나오기 시작함 그런데 이제는 서버를 아무리 늘려도 데이터베이스의 응답속도가 느려 결국 전체 서비스의 응답 속도가 느려지는 현상이 발생 → 어떻게 해야하나?

  1. 가장 먼저 생각해볼 수 있는 것은 캐싱이다.

캐싱 적용하기

캐시를 적용할 때는 글로벌 캐시를 적용할 것인지, 로컬 캐시를 적용할 것인지부터 고민이 시작된다.

  • 로컬 캐시 : 각 서버의 메모리에 데이터를 캐싱
  • 글로벌 캐시 : 레디스 서버와 같은 여러 서버들이 하나의 캐시를 공유할 수 있도록 해주는 것

다음으로는 캐시의 주기를 어떻게 가져갈 것인가, 만료 정책은 어떻게 할 것인가? (캐시를 도입할 때 중요한 요소들)

위의 사항들을 잘 적용을 하니 데이터베이스의 속도가 안정적으로 돌아옴 → 하지만 모든 것이 해결된 것은 아님 

서버가 점점 커짐에 따라 email이나 알림과 같은 서버 내부에서 해결할 수 없는 대외기관과의 연동이 필요해지기 시작

더군다나, 내부의 서버는 스케일 아웃이나 캐시로 인해서 충분한 응답속도를 가지고 있지만, 대외기관과의 연동에서 응답속도가 느려지기 시작함 → 어떻게 해야하나?

비동기큐 사용

비동기 큐는 kafka와 RabbitMQ와 같은 기술 사용 가능, 하나의 서버 내에서 thread pool을 이용해서 비동기 큐를 사용할 수 있음

비동기 큐를 사용함으로써 클라이언트 요청 중, 대외기관과 연동되는 부분의 트랜젝션을 클라이언트 요청에서 제외하는 것

  • 클라이언트는 요청을 보낼 때 서버의 데이터에만 의존하게 되고, 대외기관 연동은 비동기 thread로 간다. 따라서 더 이상 클라이언트는 대외기관의 느린 응답을 기다리지 않아도 된다.
  • 또한, 대외기관의 응답속도에 맞춰 서버의 요청량도 적절히 설정할 수 있음

앞에 있는 모듈들이 모여서 이런 시스템 구성을 만드는 것


2023 KAKAO Tech Campus_BackEnd 필수 과정
DB(MySQL) 강의 정리 내용입니다.