정기간행물/daily

유튜브 설계 (대시설기)

:)jun 2023. 10. 8. 18:14

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

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

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

주요 컴포넌트 3개

  • 단말
  • CDN: 비디오는 CDN에 저장한다.
  • API 서버: 비디오 스트리밍을 제외한 모든 요청 처리(피드 추천, 비디오 업로드 URL 생성, 메타데이터 데이터베이스, 캐시 갱신, 사용자 가입)

설계 영역 2가지

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

비디오 업로드 절차

  • 사용자
  • 로드밸런서
  • API 서버
  • 메타데이터 데이터베이스
  • 메타데이터 캐시: 비디오 메타데이터와 사용자 객체는 캐시한다.
  • 원본 저장소: 원본 비디오를 보관할 대형 이진 파일 저장소(BLOB, Binary Large Object storage) 시스템이다.
  • 트랜스코딩 서버: 비디오 트랜스코딩은 비디오 인코딩이라 부르기도 하는 절차로, 비디오의 포맷(MPEG, HLS 등)을 변환하는 절차. 단말이나 대역폭 요구사항에 맞는 최적의 비디오 스트림을 제공하기 위해 필요
  • 트랜스코딩 비디오 저장소
  • CDN: 비디오를 캐시하는 역할
  • 트랜스코딩 완료 큐
  • 트랜스코딩 완료 핸들러: 트랜스코딩 완료 큐에서 이벤트 데이터를 꺼내어 메타데이터 캐시와 데이터베이스를 갱신할 작업 서버

다음의 두 프로세스가 병렬적으로 수행된다.

  1. 비디오 업로드
  2. 비디오 메타데이터 갱신

비디오 업로드

  1. 비디오를 원본 저장소에 업로드
  2. 트랜스코딩 서버는 원본 저장소에서 비디오를 가져와 트랜스코딩 시작
  3. 트랜스코딩이 완료되면 다음 2개의 절차가 병렬적으로 처리됨
    1. 완료된 비디오를 트랜스코딩 비디오 저장소로 업로드 → 트랜스 코딩된 비디오를 CDN에 올린다.
    2. 트랜스코딩 완료 이벤트를 트랜스코딩 완료 큐에 넣는다. → 완료 핸들러가 이벤트 데이터 꺼내서 메타데이터 데이터베이스와 캐시를 갱신한다.
  4. API 서버가 단말에게 스트리밍 준비가 되었음을 알린다.

메타데이터 갱신

원본 저장소에 파일이 업로드되는 동안, 단말은 병렬적으로 비디오 메타데이터 갱신 요청을 API 서버에 보낸다. 이 정보로 메타데이터 데이터베이스와 캐시를 업데이트한다.

비디오 스트리밍 절차

스트리밍 프로토콜: 비디오 스트리밍을 위해 데이터를 전송할 때 쓰이는 표준화된 통신방법

  • MPEG-DASH
  • 애플 HLS
  • Microsoft Smooth Streaming
  • Adobe HTTP Dynamic Streaming(HDS)

프로토콜마다 지원하는 비디오 인코딩이 다르고 플레이어도 다르다.

비디오는 CDN에서 바로 스트리밍된다.

3단계 상세 설계

비디오 트랜스코딩

비디오를 녹화하면 단말은 해당 비디오를 특정 포맷으로 저장한다. 이 비디오가 다른 단말에서도 순조롭게 재생되려면 다른 단말과 호환되는 비트레이트와 포맷으로 저장되어야 한다.

비디오 트랜스코딩이 중요한 이유

  • 가공되지 않은 원본 비디오는 저장 공간을 많이 차지한다.
  • 단말은 특정 종류의 비디오 포맷만 지원한다.
  • 네트워크 대역폭에 따라 저화질, 고화질 비디오를 보내야 한다.
  • 모바일 단말일 경우 네트워크 상황이 수시로 달라진다.

인코딩 포맷 2가지

  • 컨테이너: 비디오 파일, 오디오, 메타데이터를 담는 바구니 (.avi, .mov, mp4)
  • 코덱(codec): 비디오 화질은 보존하면서 파일 크기를 줄일 목적으로 고안된 압축 및 압축 해제 알고리즘(H.264, VP9, HEVC)

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

트랜스코딩은 컴퓨팅 자원과 시간을 많이 소모하는 작업니다. 각기 다른 유형의 비디오 프로세싱 파이프라인을 지원하는 한편 처리 과정의 병렬성을 높이기 위해 적절한 수준의 추상화를 도입하여 클라이언트 프로그래머로 하여금 작업을 손수 정의할 수 있도록 해야 한다.

시스템 최적화

속도 최적화: 비디오 병렬 업로드 → 하나의 비디오는 작은 GOP들로 분할할 수 있다.

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

속도 최적화: 모든 절차를 병렬화 → 결합도를 낮추기 위해 메시지 큐를 도입

안전성 최적화: 미리 사인된 업로드 URL → 허가받은 사용자만이 올바른 장소에 업로드할 수 있도록 하기 위해 pre-signed URL을 이용한다.

안전서 최적화: 비디오 보호 → 디지털 저작권 관리(DRM), AES 암호화, 워터마크

비용 최적화

  1. 인기 있는 비디오는 CDN을 통해 재생하되 다른 비디오는 비디오 서버를 통해 재생
  2. 짧은 비디오라면 필요할 때 인코딩하여 재생
  3. 어떤 비디오는 특정 지역에서만 인기가 높다. 특정 지역에만 비디오 업로드
  4. CDN을 직접 구축하고 ISP와 제휴한다.

오류 처리

시스템 오류 2가지

  1. 회복 가능 오류: 트랜스코딩 실패
  2. 회복 불가능 오류: 비디오 포맷이 잘못됨

오류 해결 방법

  • 업로드 오류: 재시도
  • 비디오 분할 오류: 클라이언트가 GOP 경계에 따라 분할하지 못하는 경우에는 비디오를 서버로 전송하고 비디오 분할을 처리하도록 함
  • 트랜스코딩 오류: 재시도
  • 전처리 오류: DAG 그래프를 재생성
  • DAG 스케줄러 오류: 작업 재스케줄링
  • 자원 관리자 큐에 장애 발생: 사본 이용
  • 작업 서버 장애: 다른 서버에서 작업 재시도
  • API 서버 장애: 다른 서버로 우회
  • 메타데이터 캐시 서버 장애: 다른 노드에서 가져온다.
  • 메타데이터 데이터베이스 서버 장애: 부 서버를 주 서버로 교체한다.