로고jiohh blog

14장 - 유튜브 설계

1단계 문제 이해 및 설계 범위 확정

유튜브는 비디오시청 말고 댓글, 비디오공유, 좋아요, 재생목록 저장등을 할 수 있다.
이를 시간내에 모두 설명하는 것은 불가능 하다. 질문을 통해 설계 범위를 좁히는 것이 중요하다.

  • 기능
  • 어떤 클라이언트?
  • 능동 사용자 수는?
  • 평균적으로 소비하는 시간?
  • 다국어 지원의 필요?
  • 어떤 비디오 해상도를 지원해야하는지
  • 암호화가 필요한지?
  • 비디오 파일크기의 제한
  • 타사 클라우드 서비스를 활용할 수 있는지?

위의 질문들로 아래의 기능을 도출할 수 있다.

  • 빠른 비디오 업로드
  • 원활한 비디오 재생
  • 재생 품질 선택 기능
  • 낮은 인프라 비용
  • 높은 가용성과 규모 확장성, 그리고 안정성
  • 지원 클라이언트 : 모바일 앱, 웹 브라우저, 스마트 TV

개략적 규모 추정

다음 계략적인 수를 추정해서 면접관에게 알림으로 시작

  • 일간 능동 사용자 : 5백만
  • 한 사용자는 하루에 5개 비디오 시청
  • 10%의 사용자가 하루에 1비디오 업로드
  • 비디오 평균 크기느 300MB
  • 비디오 저장을 위해 매일 새로 요구되는 저장 용량 = 5백만 X 10% X 300MB
  • CDN 비용 가정 : 1GB당 0.02$의 요금
    5백만 X 5 X 0.3GB X 0.02 = 하루에 $150,000

2단계 개략적 설계안 제시 및 동의 구하기

설계안으로 CDN과 BLOB스토리지의 경우에는 기존 클라우드를 활용할 것이다.

  • Blob 스토리지란?
    Blob storage : "blob"은 파일 형식을 반드시 따를 필요는 없는 이진 형식의 데이터 덩어리
    이진 데이터 형태로 그대로 저장하는 스토리지를 의미하는 듯

시스템 설계 면접은 모든 것을 만드는 것보다 주어진 시간 안에 적절한 기술을 골라 설계를 마치는 것이 중요하다.
-> 비디오를 저장하기 위해 BLOB저장소를 쓸 것이라면 그 사실만 언급해도 충분하다.

규모 확장이 쉬운 BLOB이나 CDN을 만드는 것은 매우 복잡하다. 실제로도 구축하지 않기 때문

위의 두가지 이유로 클라우드 서비스를 이용한다.


개략적인 시스템의 컴포넌트는 다음과 같이 세개로 구성된다.

  • 단말 : 컴퓨터, 모바일, 스마트 tv등 시청가능
  • CDN : 비디오는 CDN에 저장한다.
  • API서버 : 비디오 스트리밍을 제외한 모든 요청은 API서버가 처리(피드 추천, 비디오 업로드, 메타데이터 베이스 등)

면접관이 다음의 두 영역을 설계해 줄 것을 요청하였다고 가정하자.

  • 비디오 업로드 절차
  • 비디오 스트리밍 절차

비디오 업로드 절차

  • API 서버 : 비디오 스트리밍을 제외한 다른 모든 요청을 처리
  • 원본저장소 : 원본 비디오를 보관할 대형 이진 파일 저장소(BLOB)
  • 트랜스코딩 서버 : 비디오 트랜스코딩 = 비디오 인코딩, 단말이나 대역폭 요구사항에 맞는 최적의 빋오 스트림을 제공
  • 트랜스코딩 비디오 저장소 : 트랜스코딩이 완료된 비디오를 저장하는 BLOB 저장소
  • 트랜스코딩 완료 큐 : 비디오 트랜스코딩 완료 이벤트들을 보관할 메시지 큐
  • 트랜스코딩 완료 핸들러 : 완료 큐에서 이벤트 데이터를 꺼내 메타 데이터 캐시와 데이터베이스르 갱신할 작업 서버들

업로드 절차는 다음의 두 프로세스가 병렬적으로 수행된다.

a. 비디오 업로드
b. 비디오 메타데이터 갱신

프로세스 a: 비디오 업로드

  1. 비디오를 원본 저장소에 업로드
  2. 트랜스 코딩 서버는 원본 저장소 비디오를 트랜스 코딩
  3. 트랜스코딩이 완료되면 두 절차가 병렬적으로 수행
    a. 완료된 비디오를 트랜스코딩 비디오 저장소에 업로드
    b. 트랜스코딩 완료 이벤트를 트랜스코딩 완료 큐에 넣는다. -> 완료 핸들러가 메타데이터를 이용해 갱신한다.
  4. API 서버가 단말에게 비디오 업로드가 끝나서 스트리밍 준비가 되었음을 알림

프로세스 b : 메타데이터 갱신

원본 저장소에 파일이 업로드되는 동안, 단말은 병렬적으로 메타데이터 갱신 요청을 API 서버로 보냄

비디오 스트리밍 절차

스트리밍은 장치가 원격지의 비디오로부터 지속적으로 비디오 스트림을 전송 받아 영상을 재생하는 것을 말한다.

스트리밍 프로토콜은 비디오 스트리밍을 위해 데이터를 전송할 떄 쓰이는 표준화된 통신방법이다.
프로토콜마다 지원하는 비디오 인코딩이 다르고 플레이어도 다르다.
비디오 스트리밍서 서비스를 설계할 때 알맞는 프로토콜을 잘 골라야한다.

비디오는 가장 가까운 CDN에서 바로 스트리밍되므로 전송 지연은 아주 낮다.

3단계 설계단계

개략적인 설계에서 업로드와 스트리밍으로 구분하였는데 이를 좀더 다듬고 오류처리 메커니즘에 대해 소개해보자

비디오 트랜스코딩

트랜스코딩은 다음과 같은 이유로 중요하다

  • 가공되지 않은 원본 비디오는 저장공간을 많이 차지한다.
  • 상당수의 단말과 브라우저는 특정 종류의 비디오 포맷만 지원한다.
  • 대역폭에 따라 다른 품질을 제공해야 끊김없는 비디오 재생을 보장할 수 있다.
  • 모바일 단말의 경우 네트워크 상황이 수시로 달라짐

인코딩 포맷은 아주 다양하나 다음 두부분으로 구성되어 있다.

  • 컨테이너 : 비디오파일,오디오,메타데이터들이 컴퓨터 파일안에서 같이 있을 수 있는 것 컨테이너 포맷은 같이 있을 수 있는 방법을 포맷
  • 코덱 : 비디오 화질은 보존하면서 파일 크기를 줄일 목적으로 고안된 압축 및 압축 해제 알고리즘

유향 비순환 그래프(DAG) 모델

콘텐츠마다 각기 다른 비디오 프로세싱 요구사항을 갖고 있다.
각기 다른 유형의 비디오 프로세싱 파이프라인을 지원하는 한편 처리 과정의 병렬성을 높이기 위해서는 적절한 수준의 추상화를 도입하여 클라이언트 프로그래머로 하여금 실행할 작업을 손수 정의할 수 있도록 해야한다.

DAG(Directed Accyclic Graph)프로그래밍 모델을 도입, 작업을 단계별로 배열할 수 있도록하여 해당 작업들이 순차적, 병렬적으로 실행될 수 있도록 함
DAG를 정점의 방문 순서를 선형으로 결과를 출력 = 위상정렬

비디오 트랜스코딩 아키텍처

클라우드 서비스를 활용하여 다음과 같은 비디오 트랜스코딩 아키텍처를 정의하였다.

전처리기

  • 비디오 분할 : 비디오 스트림은 GOP라고 불리는 단위로 쪼갠다.
    독립적으로 재생가능하며, 길이는 보통 몇 초 정도

  • DAG 생성 : 클라이언트 프로그래머가 작성한 설정 파일에 따라 DAG 생성

  • 데이터 캐시 : 비디오의 데이터를 임시저장소에 보관한다. -> 인코딩 실패시 재활용

DAG 스케줄러

DAG 그래프를 몇개 단계로 분할 후 그 각각을 자원 관리자의 작업 큐에 집어 넣는다.

자원 관리자

자원관리자는 자원 배분을 효과적으로 수행하는 역할을 담당한다. 세 개의 큐와 작업 스케줄러로 구성된다.

  • 작업 큐 : 실행할 작업이 보관되어 있는 우선순위큐
  • 작업 서버 큐 : 작업 서버들이 보관되어 있는 우선순휘큐
  • 실행 큐 : 실행 중인 작업서버정보가 보관 되어 있는 큐
  1. 작업 큐에서 작업을 꺼냄
  2. 작업서버 큐에서 적합한 작업 서버를 꺼냄
  3. 해당 작업서버에게 작업 지시
  4. 실행 큐에 작업 내용을 넣음
  5. 작업 종료시 실행 큐에서 제거

작업 서버

작업에 종류에 따라 구분되며 DAG에 정의된 작업을 수행한다.

임시 저장소

임시저장소는 여러 저장소 시스템을 활용 할 수 있다.
저장할 데이터의 유형, 크기, 이용 빈도, 데이터 유효기간등에 따라 달라짐

비디오/오디오 데이터로 BLOB를 사용한다.

시스템 최적화

속도 최적화 : 비디오 병렬 업로드

분할한 GOP를 병렬로 업로드 하면 일부가 실패해도 빠르게 업로드 재개가능, GOP 경계에 맞춰 분할하는 작업을 단말이 수행하게 함으로 업로드 속도를 높일 수 있다.

속도 최적화 : 업로드 센터를 사용자 근거리에 지정

업로드 센터를 근거리에 여러 곳에 두는 것으로 속도 개선

속도 최적화 : 모든 절차를 병렬화

비디오를 원본 저장소에서 CDN으로 옮기는 절차를 병렬성이 높게 변경한다.

메시지 큐를 도입하여 이전 모듈의 작업이 끝나기를 기다리지 않도록하여 속도를 최적화한다.

안전성 최적화 : 미리 사인된 업로드 URL

허가 받은 사용자만이 올바른 장소에 비디오를 업로드할 수 있도록 해야한다.

미리 사인된 업로드를 이용한다.
HTTP 서버에 POST요청을 하여 미리 사인된 URL을 받고 이 위치에 업로드를 하게된다.

안전성 최적화 : 비디오 보호

  • 디지털 저작권 관리(DRM) 시스템 도입
  • AES 암호화
  • 워터마크

비용 최적화

CDN은 이 장의 시스템의 핵심 부분이다. 하지만 비싸다.

유튜브의 비디오 스트리밍은 롱테일 분포, 즉 인기 있는 비디오가 번번히 재생됨을 이용하자

  • 인기 비디오는 CDN이용, 다른 비디오는 비디오 서버 이용
  • 인기 없는 비디오는 인코딩 X, 짧은 비디오는 필요할 떄 인코딩
  • 어떤 비디오는 특정 지역에서만 인기있음
  • CDN을 직접 구축 인터넷 서비스 제공자와 제휴

오류 처리

두가지 오류로 분리가능하다.

  • 회복 가능 오류
    • 비디오 세그먼트의 트랜스 코딩 실패 등
    • 재시도로 해결, 계속 실패 시 오류 코드 반환
  • 회복 불가능 오류처리
    • 비디오 포맷이 잘못됨 등
    • 즉시 중단 및 오류 코드 반환

해결방법

  • 업로드 오류 : 몇 회 재시도
  • 비디오 분할 오류 : GOP 비디오 분할 문제시 전체 비디오를 서버로 전송, 서버에서 분할처리
  • 트랜스코딩 오류 : 재시도
  • 전처리 오류 : DAG 그래프 재생성
  • DAG 스케줄러 오류 : 작업을 다시 스케줄링
  • 자원 관리자 큐 장애 : 사본을 이용
  • 작업 서버 장애 : 다른 서버에서 재시도
  • API 서버 장애 : 신규 요청을 다른 서버로
  • 메타 데이터 캐시 서버 장애 : 다른 노드 및 서버 교체
  • 메타데이터 데이터베이스 서버 장애 : 부서버로 교체

4단계 마무리

추가로 다음과 같은 이야기를 논의할 수 있다.

  • API 계층의 규모 확장성 확보 방안

  • 데이터 베이스 계층 규모 확장성 확보 방안

  • 라이브 스트리밍 요구사항

    • 라이브 스트리밍은 응답지연이 좀 더 낮아야함 -> 스트리밍 프로토콜 선정에 유의
    • 병렬화 필요성이 떨어짐 -> 작은 단위의 데이터를 실시간으로 처리해야함
    • 오류 처리 방법을 달리해야함 -> 시간이 걸리는 방안 X
  • 비디오 삭제 : 문제가 있는 비디오의 삭제 여부