대용량 트래픽 / 데이터 처리는 왜 어려울까?
- 하나의 서버 또는 데이터베이스로 감당하기 힘든 부하 → 다수의 서버와 데이터베이스를 마치 하나인 것처럼 동작시키기 위해 여러가지 기법들이나 최적화 방법들을 사용하게 되는 것임
- 하나의 서버로 감당하기 힘들어 대부분 여러개의 서버 또는 데이터베이스를 사용함
- 여러개의 서버에서 유입되는 데이터의 일관성을 보장할 수 있어야 함
- 웹 서비스들은 24시간 무중단(언제든지 사용할 수 있어야 함) → 잘못된 코드 한 줄이 미치는 영향의 범위가 크다
- 코드 한 줄이 데이터에 미치는 영향범위가 굉장히 커짐
- 여러 마이크로 서비스들이 복잡한 의존 관계를 가짐 → 하나의 서버에서는 단순히 join도 가능하고 여러 transaction 보장들이 쉽게 되지만, micro service architecture의 분산 환경에서는 이것조차도 굉장히 난이도가 높아지게 됨
- 여러 서비스들이 얽혀있어, 시스템 복잡도가 상당히 높음
그렇다면 대용량 시스템 어떠해야 하는가?
아래 3가지는 반드시 갖춰야 한다.
고가용성
- 언제든 서비스를 이용할 수 있어야 한다.
확장성
- 시스템이 비대해짐에 따라 증가하는 데이터와 트래픽에 대응할 수 있어야 한다.
관측가능성
- 문제가 생겼을 때 빠르게 인지할 수 있어야 하고 문제의 범위를 최소화 할 수 있어야 한다.
시스템 발전시켜보기
대용량 시스템의 아키텍처는 어떤 모습을 하고 있는지, 점진적으로 시스템을 발전시켜 보자
가장 간단한 모델
클라이언트. 서버, 데이터베이스 3개의 layer를 두고 시작해보자.
- 사용자가 적을 때 : 이런 간단한 모델에서는 적절한 응답을 줄 수 있음
- 사용자가 점점 많아진다면? 서버의 응답 속도가 느려짐 → 어떻게 해야할까?
서버의 스케일 아웃 적용해보기
서버의 대수를 늘려서 하나의 서버가 받는 요청량을 줄이기
스케일 아웃을 적용할 때 중요한 점은 부하분산을 어떻게 할 것인가?
만약 서버를 3대나 늘렸는데, 1대에만 요청이 몰리면 의미가 없어짐 → 따라서 Nginx와 같은 로드 밸런서를 앞단에 두게 된다.
- 로드밸런스가 클라이언트의 요청을 받게 되고, 어떤 서버로 보낼지 결정하게 됨
- 대부분은 round robin 알고리즘을 많이 사용하게 됨
- 서비스의 특징에 따라서 LRU를 사용할 수도 있다.
- 여러가지를 혼합해서 로드밸런싱을 할 수 있음
스케일 아웃과 로드밸런서를 서버에 적용했더니 이제는 응답속도가 안정적으로 나오기 시작함 그런데 이제는 서버를 아무리 늘려도 데이터베이스의 응답속도가 느려 결국 전체 서비스의 응답 속도가 느려지는 현상이 발생 → 어떻게 해야하나?
- 가장 먼저 생각해볼 수 있는 것은 캐싱이다.
캐싱 적용하기
캐시를 적용할 때는 글로벌 캐시를 적용할 것인지, 로컬 캐시를 적용할 것인지부터 고민이 시작된다.
- 로컬 캐시 : 각 서버의 메모리에 데이터를 캐싱
- 글로벌 캐시 : 레디스 서버와 같은 여러 서버들이 하나의 캐시를 공유할 수 있도록 해주는 것
다음으로는 캐시의 주기를 어떻게 가져갈 것인가, 만료 정책은 어떻게 할 것인가? (캐시를 도입할 때 중요한 요소들)
위의 사항들을 잘 적용을 하니 데이터베이스의 속도가 안정적으로 돌아옴 → 하지만 모든 것이 해결된 것은 아님
서버가 점점 커짐에 따라 email이나 알림과 같은 서버 내부에서 해결할 수 없는 대외기관과의 연동이 필요해지기 시작
더군다나, 내부의 서버는 스케일 아웃이나 캐시로 인해서 충분한 응답속도를 가지고 있지만, 대외기관과의 연동에서 응답속도가 느려지기 시작함 → 어떻게 해야하나?
비동기큐 사용
비동기 큐는 kafka와 RabbitMQ와 같은 기술 사용 가능, 하나의 서버 내에서 thread pool을 이용해서 비동기 큐를 사용할 수 있음
비동기 큐를 사용함으로써 클라이언트 요청 중, 대외기관과 연동되는 부분의 트랜젝션을 클라이언트 요청에서 제외하는 것
- 클라이언트는 요청을 보낼 때 서버의 데이터에만 의존하게 되고, 대외기관 연동은 비동기 thread로 간다. 따라서 더 이상 클라이언트는 대외기관의 느린 응답을 기다리지 않아도 된다.
- 또한, 대외기관의 응답속도에 맞춰 서버의 요청량도 적절히 설정할 수 있음
2023 KAKAO Tech Campus_BackEnd 필수 과정
DB(MySQL) 강의 정리 내용입니다.
'CS > 데이터베이스' 카테고리의 다른 글
MySQL 소개 - 02. MySQL 아키텍처 소개 (0) | 2023.06.04 |
---|---|
MySQL 소개 - 01. MySQL을 학습하는 이유 (0) | 2023.06.04 |
대용량 시스템에 대한 이해 - 02. 왜 데이터베이스가 병목일까? (0) | 2023.06.04 |
대용량 시스템에 대한 이해 - 01. 웹의 기본 아키텍처 (0) | 2023.06.04 |
실습 환경 구축하기 (MySQL, Intellij) (0) | 2023.06.04 |