14장 : 유튜브 설계
1단계 : 문제 이해 및 설계 범위 확정
기능 및 요구사항 명세
빠른 비디오 업로드
원활한 비디오 재생
재생 품질 선택 기능
낮은 인프라 비용
높은 가용성과 규모 확장성, 그리고 안정성
지원 클라이언트 : 모바일 앱, 웹 브라우저, 그리고 스마트 TV
개략적 규모 추정
DAU 수는 5milion
한 사용자는 하루에 평균 5개의 비디오를 시청
10%의 사용자가 하루에 1비디오 업로드
비디오 평균 크기는 300MB
비디오 저장을 위해 매일 새로 요구되는 저장 용량 = 5백만 x 10% x 300MB = 150TB
CDN 비용
2단계 : 개략적 설계안 제시 및 동의 구하기
개략적으로 보면 이 시스템은 다음 세 개의 컴포넌트로 구성된다.
CDN : 비디오는 CDN에 저장한다. 재생 버튼을 누르면 CDN으로부터 스트리밍이 이루어진다.
API 서버 : 비디오 스트리밍을 제외한 모든 요청은 API 서버가 처리한다. 피드 추천, 비디오 업로드 URL 생성, 메타데이터 데이터베이스와 캐시 갱신, 사용자 가입 등이 API 서버가 처리하는 작업이다.
비디오 업로드 절차
비디오 스트리밍 절차
스트리밍 프로토콜은 비디오 스트리밍을 위해 데이터를 전송할 때 쓰이는 표준화된 통신방법이다. 널리 사용되는 스트리밍 프로토콜로는 다음과 같은 것이 있다.
MPEG-DASH.
애플(Apple) HLS.
마이크로소프트 스무드 스트리밍
어도비 HTTP 동적 스트리밍
비디오는 CDN에서 바로 스트리밍된다. 사용자의 단말에 가장 가까운 CDN 에지 서버(edge server)가 비디오 전송을 담당할 것이다. 따라서 전송 지연은 아주 낮다. 다음은 이 부분의 개략적 설계안이다.
3단계 : 상세 설계
비디오 트랜스코딩
비트레이트는 비디오를 구성하는 비트가 얼마나 빨리 처리되어야 하는지를 나타내는 단위다.
비디오 트랜스코딩은 다음과 같은 이유로 중요하다.
가공되지 않은 원본 비디오는 저장 공간을 많이 차지한다.
상당수의 단말과 브라우저는 특정 종류의 비디오 포맷만 지원한다.
사용자에게 끊김 없는 고화질 비디오 재생을 보장하려면, 네트워크 대역폭이 충분하지 않은 사용자에게는 저화질 비디오를, 대역폭이 충분한 사용자에게는 고화질 비디오를 보내는 것이 바람직하다.
모바일 단말의 경우 네트워크 상황이 수시로 달라질 수 있다. 비디오 화질을 자동으로 병경하거나 수동으로 변경할 수 있도록 하는 것이 바람직하다.
인코딩 포맷의 구성
컨테이너(container) : 비디오 파일, 오디오, 메타데이터를 담는 바구니 같은 것으로, 컨테이너 포맷은 .avi, .mov, .mp4 같은 파일 확장자를 보면 알 수 있다.
코덱(codec) : 비디오 화질은 보존하면서 파일 크기를 줄일 목적으로 고안된 압축 및 압축 해제 알고리즘이다. 가장 많이 사용되는 비디오 코덱으로는 H.264, VP9, HEVC가 있다.
유향 비순환 그래프(DAG) 모델
각기 다른 유형의 비디오 프로세싱 파이프라인을 지원하는 한편 처리 과정의 병렬성을 높이기 위해서는 적절한 수준의 추상화를 도입하여 클라이언트 프로그래머로 하여금 실행할 작업을 손수 정의할 수 있도록 해야한다.
아래 그림은 비디오 트랜스코딩을 위해 본 설계안이 채택한 DAG 모델이다.
원본 비디오는 일단 비디오, 오디오, 메타데이터의 세 부분으로 나뉘어 처리된다.
검사(inspection) : 좋은 품질의 비디오인지, 손상은 없는지 확인하는 작업이다.
비디오 인코딩(video encoding) : 비디오를 다양한 해상도, 코덱, 비트레이트 조합으로 인코딩하는 작업이다.
섬네일(thumbnail) :
워터마크 (watermark) :
비디오 트랜스코딩 아키텍처
본 설계안에서는 클라우드 서비스를 활용한 비디오 트랜스코딩 아키텍처를 다음과 같이 정의하였다.
전처리기 (preprocessor)
비디오 분할 (video splitting)
DAG 생성
데이터 캐시
DAG 스케줄러
DAG 스케줄러 DAG 그래프를 몇 개 단계로 분할한 다음에 그 각각을 자원 관리자의 작업 큐에 집어넣는다.
자원 관리자 (resource manager)
자원 배분을 효과적으로 수행한다.
작업 관리자는 작업 큐에서 가장 높은 우선순위의 작업을 꺼낸다.
작업 관리자는 해당 작업을 실행하기 적합한 작업 서버를 고른다.
작업 스케줄러는 해당 작업 서버에게 작업 실행을 지시한다.
작업 스케줄러 해당 작업이 어떤 서버에게 할당되었는지에 관한 정보를 실행 큐에 넣는다.
작업 서버 (resource worker)
DAG에 정의된 작업을 수행한다.
임시 저장소 (temporary storage)
인코딩된 비디오
시스템 최적화
속도 최적화 : 비디오 병렬 업로드
하나의 비디오는 작은 GOP들로 분할할 수 있다. 이렇게 분할한 GOP를 병렬적으로 업로드하면 설사 일부가 실패해도 빠르게 업로드를 재개할 수 있다.
속도 최적화 : 업로드 센터를 사용자 근거리에 지정
업로드 속도를 개선하는 또 다른 방법은 업로드 센터를 여러 곳에 두는 것이다.
속도 최적화 : 모든 절차를 병렬화
낮은 응답지연을 달성하기 위해 느슨하게 결합된 시스템을 만들어서 병렬성을 높이는 것이다. 메시지 큐를 도입해 시스템 결합도를 낮추자.
안정성 최적화 : 미리 사인된 업로드 URL
안정성 최적화 : 비디오 보호
디지털 저작권 관리 시스템 도입
AES 암호화
워터마크
비용 최적화
인기 비디오는 CDN을 통해 재생하되 다른 비디오는 비디오 서버를 통해 재생하는 것이다.
인기가 별로 없는 비디오는 인코딩 할 필요가 없을 수도 있다.
어떤 비디오는 특정 지역에서만 인기가 높다.
CDN을 직접 구축하고 인터넷 서비스 제공자(ISP)와 제휴한다.
오류 처리
시스템 오류에는 두 가지 종류가 있다.
회복 가능 오류
회복 불가능 오류
해결 방법
업로드 오류
비디오 분할 오류
트랜스코딩 오류
전처리 오류
DAG 스케줄러 오류
자원 관리자 큐에 장애 발생
작업 서버 장애
API 서버 장애
메타데이터 캐시 서버 장애
메타데이터 데이터베이스 서버 장애
4단계 : 마무리
API 계층의 규모 확장성 확보 방안
데이터베이스 계층의 규모 확장성 확보 방안
데이터베이스 계층의 규모 확장성 확보 방안
라이브 스트리밍(live streaming)
비디오 삭제
Last updated