독서

[웹 개발자를 위한 대규모 서비스를 지탱하는 기술] 1장. 대규모 서비스의 전체 그림 파악하기

오렌지색 귤 2022. 3. 16. 21:12
반응형

세 줄 요약

 

대규모 서비스를 개발하면 확장성 및 부하 분산, 다중성, 효율적 운용과 협업 등의 다양한 문제에 직면하게 된다

 

이를 해결하기 위해서는 서버 용도에 맞는 하드웨어, 로드밸런서와 가동감시 기능을 갖춘 소프트웨어를 도입하고, 서버 정보관리 시스템을 개발하는 시도를 지속해야 한다

 

서버/인프라 측면의 시스템 구성뿐만 아니라 애플리케이션의 각종 로직이나 DB 스키마 등도 재검토해서 비효율적인 부분을 서서히 배제하는 등의 노력도 뒤따라야 한다

 

 

 

 


대규모 서비스

 

1. 확장성 확보, 부하분산 필요

 

대량의 액세스가 있는 서비스에서는 서버 1대로 처리할 수 없는 부하를 어떻게 처리할 것인지가 가장 큰 문제다

 

이 문제에 대한 전략의 기초는 스케일아웃 이다

 

스케일아웃 : 서버를 횡으로 전개, 즉 서버의 역할을 분담하거나 대수를 늘림으로써 시스템의 전체적인 처리 능력을 높여서 부하를 분산하는 방법

스케일업 : 하드웨어의 성능을 높여 처리능력을 끌어올리는 방법

 

 

 

스케일아웃 전략을 채용한 경우는 비용이 절감되는 반면에 다양한 문제가 발생한다

 

  • 사용자로부터의 요청을 어떻게 분배할 것인가?
    • 해답으로는 로드밸런서를 사용한다
    • 다만, 서버가 1대일 때는 애초에 고민하지 않았을 문제이다

 

  • 데이터 동기화는 어떻게 할 것인가?
    • DB를 분산시켰을 때 한쪽에 저장된 갱신 내용을 다른 DB가 알지 못한다면 문제가 발생한다

 

  • 네트워크 통신의 지연시간은 어떻게 생각해볼 수 있을까?
    • 작은 데이터라도 이더넷을 경우해서 통신한 경우는 ms 단위의 지연시간이 있다

 

 

 

2. 다중성 확보

 

시스템은 다중성을 지닌 구성, 즉 특정 서버가 고장 나거나 성능이 저하되더라도 서비스를 계속할 수 있는 구성으로 할 필요가 있다

 

스케일아웃 → 서버 대수 늘어남 → 서버의 고장률 올라감 → 문제 발생 시 서비스가 전부 정지

 

위의 설계가 아닌 서버가 고장나거나 급격하게 부하가 올라가는 경우에도 견딜 수 있는 시스템을 구성해야 한다

 

 

911 당시 사람들이 일제히 야후에 액세스해서 다운되어버리는 사태가 일어났다

 

야후는 이때 CDN 서비스인 Akamai에 컨텐츠를 캐싱해서 트래픽을 우회시킴으로써 장애를 복구했다

 

 

 

3. 효율적 운용 필요

 

서버 대수가 많아지면 각 서버의 역할, 상황을 파악하는 것이 힘들다

 

감시용 소프트웨어를 사용하고 정보관리를 위한 툴을 사용하는 등 자동화를 하게 되는데, 이 과정에서도 결국 일손을 거치므로 최대한 효율적인 운용을 수행해야 한다

 

 

 

4. 개발자 수, 개발방법의 변화

 

대규모 서비스가 되면 여러 기술자가 역할을 분담하게 된다

 

  • 개발 표준화는 어떻게 할 것인가?
    • 프로그래밍 언어, 라이브러리, 프레임워크 통일
    • 코딩 규약 정하고 소스코드 관리를 버전관리 시스템으로 제대로 하기

 

 

 

 

대규모 데이터량에 대한 대처

 

문제

 

데이터의 이동 : 디스크 → 메모리 → 캐시 메모리 → CPU

 

각 단계 간에는 속도차가 매우 크게 나는 것이 현대 컴퓨터의 특징

 

그 이유는 하드 디스크에서 데이터를 읽어들이는 데에는 그 특성상 헤드 이동이나 디스크 원반의 회전이라는 물리적 동작이 수반된다

 

따라서 전기적으로 읽어들이기만 하면 되는 메모리나 캐시 메모리와 비교하면 10^6 ~ 10^9배나 되는 속도차가 난다

 

 

해결

 

디스크로부터 읽어들인 데이터를 메모리에 캐싱해둠으로써 전반적으로 디바이스간 속도차가 체감속도에 영향을 주지 않도록 한다

 

DB를 비롯한 미들웨어도 기본적으로 이러한 속도차를 의식한 데이터 구조, 구현을 채용하고 있지만 한계가 존재한다

 

데이터량이 많아지면 처음부터 캐시 미스가 많이 발생하고 그 결과 저속의 디스크로 I/O가 많이 발생하여 시스템 전체의 속도저하를 초래한다

 

 

 

 

 

 


성장하는 서비스와 대규모화의 벽

 

부하 처리

 

기존 시스템의 부하상황을 정리하고 각 서비스의 구성 중에 병목지점을 측정, 판정한다

 

I/O 부하가 높은 서버는 메모리, CPU 부하가 높은 서버는 CPU를 중시하는 형태로 서버 용도에 맞게 최적의 구성을 갖는 하드웨어를 준비했다

 

 

 

다중화

 

로드밸런서 + 가동감시 기능을 갖춘 소프트웨어 도입

 

 

 

서버 교체

 

OS 가상화 진행해서 서버 가동률을 높임과 동시에 유지보수성을 높인다

 

 

 

서버의 정보관리

 

독자적인 웹 기반 서버 정보관리 시스템 개발

 

서버의 용도나 부하상태와 같은 각종 정보에 액세스하기 쉬워져서 시스템 전체를 파악하기 용이해졌다

 

 

 

기타

 

서버/인프라 측면의 시스템 구성뿐만 아니라 애플리케이션의 각종 로직이나 DB 스키마 등도 재검토해서 비효율적인 부분을 서서히 배제

 

필요에 따라 검색 엔진 등의 서브시스템을 독자 개발

 

 

 

 

 


PS

웹 개발자를 위한 대규모 서비스를 지탱하는 기술, 제이펍, 이토 나오야 저

반응형