Post

가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 사용자 수에 따른 규모 확장성_01

https://contents.kyobobook.co.kr/sih/fit-in/458x0/pdt/9788966263158.jpg

이번 장에서는 규모 확장성과 관련된 설계 지식을 알 수 있다.

단일 서버

천 리 길도 한 걸음 부터

웹앱, DB, 캐시 등이 전부 서버 한 대에서 실행 된다.

웹 모바일 트래픽 서버 / 데이터베이스 서버 분리

사용자가 늘면 서버 하나로는 충분하지 않아서 여러 서버를 두어야한다.

웹 계층과 데이터 계층을 분리하면 그 각각을 독립적으로 확장해 나갈 수 있게 된다.

No SQL 이 바람직한 경우

  • 아주 낮은 응답 지연시간(latency)가 요구됨.
  • 다루는 데이터가 비정형(unstructured)이라 관계형 데이터가 아님
  • 데이터를 직렬화 하거나 역직렬화 할 수 있기만 하면 됨.
  • 아주 많은 양의 데이터를 저장할 필요가 있음 (빅데이터)
  • 직렬화(Serialized) 자바 개발에 최적화된 자바 고유 기술. 클래스, 인터페이스 등 자바만의 객체들을 별다른 작업 없이 외부로 export, import 할 수 있게 해준다.

수직적 규모 확장

Scale up, Vertical Scaling

  • 서버로 유입되는 트래픽의 양이 적을 때 - 좋은 방식
  • 단순함
  • 한계가 있음. 한대에 서버에 cpu랑 메모리를 무한대로 붙일 순 없잖아요
  • 장애에 대한 자동복구 방안이나 다중화 방한을 제시하지 않는다. 서버에 장애가 발생하면 앱이 완전히 중단된다.

수평적 규모 확장

웹서버 로드 밸런서

서버를 여러 개 띄워놓고 로드밸런싱 알고리즘을 이용해 적절하게 트래픽을 분산해서 보내준다.

예를 들어 임영웅 콘서트를 예매하는 것 처럼 엄청난 양의 사용자가 몰려드는 경우, 서버가 하나만 있다면 처리 용량을 넘어 섰을 때 서버가 멈춰버린다.

단일 서버

하지만 로드밸런서가 있다면 우아하게 돌아가는 서버에 부하를 나누거나 새로운 서버를 추가해서 가용성(availability)을 향상할 수 있다.

로드밸런서
  • 하드웨어 로드밸런서 : 전용 장비로 대규모 트래픽을 분산시킨다.

  • 소프트웨어 로드밸런서 : 가상화 환경에서 가상 ip 주소, 포트 포워딩, 세션 관리 등으로 로드 밸런싱

데이터베이스 다중화

Master - Slave 로 데이터베이스 서버 간 관계를 설정해둔다.

쓰기 연산은 Master DB에서만 진행하고, Slave DB 에서는 그 사본을 전달받아 읽기 연산만 처리한다.

대부분의 앱은 읽기 요청 비중이 훨씬 높기 때문에 Slave DB의 갯수가 훨씬 많다.

이렇게 DB를 다중화 하면 아래와 같은 장점이 있다.

  1. 병렬로 처리할 수 있는 쿼리의 수가 늘어나므로 성능이 좋아진다.
  2. 자연 재해등의 이유로 DB 중 일부가 파괴되어도 데이터는 보존될 것이다. 다른 장소에 백업해둘 수 있으니까 안정성이 높아진다.
  3. 데이터를 여러 지역에 복제해둠으로써 하나의 DB서버에 장애가 발생해도 다른 서버에 있는 데이터를 가져와 계속 서비스하면 되니까 가용성이 높아진다.

혹시나 Master DB가 다운되면 원래 있던 Slave DB가 승진한다. 그리고 새로운 서버를 추가하면 된다. 부 서버에 있던 데이터가 최신이 아닐 수 있기 때문에 복구 스크립트를 돌려 추가 하면 된다. (다중 마스터나 원형 다중화 방식을 도입하면 도움이 될 수 있으나 훨씬 복잡하기때문에 따로 찾아보길 바란다.)

This post is licensed under CC BY 4.0 by the author.