대규모시스템설계기초 ch14
대규모 시스템 설계 기초 ch14. 유튜브 설계¶
0단계. 가벼운 설계¶

1단계. 문제 이해 및 설계 범위 확정¶
- 요구사항
- 빠른 비디오 업로드
- 원활한 비디오 재생
- 재생 품질 선택 기능
- 낮은 인프라 비용
- 높은 가용성과 규모 확장성, 그리고 안정성
- 지원 클라이언트: 모바일 앱, 웹 브라우저, 스마트 TV
- 개략적 규모 측정
- DAU 5백만명
- 사용자 한명에 하루 평균 5개의 비디오 시청
- 10%의 사용자가 하루에 비디오 1개 업로드
- 비디오 평균 크기는 300MB
- 비디오 저장을 위해 매일 새로 요구되는 저장 용량
- 5백만 * 10% * 300MB = 150TB
- CDN 비용
- 클라우드 CDN을 통해 비디오를 서비스할 경우, 사용량에 따라 과금
- 아마존 CDN 솔루션으로 사용할 경우, 100% 트래픽이 미국에서 발생한다고 하면 1GB $0.02 요금
- 발생 요금: 5백만 * 5비디오 * 0.3GB * $0.02 = $150,000 (한화 약 2억이라고 합니다...)
2단계. 개략적 설계안 제시 및 동의 구하기¶
- 개요
- CDN과 BLOB 스토리지의 경우, 기존 클라우드 서비스 활용 (넷플릭스, 페이스북도 클라우드 서비스 활용)
- CDN: 비디오는 CDN에 저장. CDN으로부터 스트리밍
- API 서버: 비디오 스트리밍 제외한 모든 요청 API 서버 처리. 피드 추천, 비디오 업로드 URL 생성, 메타데이터 DB/Cache 갱신, 사용자 가입 등
- 비디오 업로드 절차

- 비디오 업로드)
- 1.비디오를 원본 저장소에 업로드
- 2.트랜스코딩 서버는 원본 저장소에서 해당 비디오를 가져와 트랜스코딩 시작
- 3.트랜스코딩 완료되면 아래 두 절차가 병렬적으로 수행
- 3a. 완료된 비디오를 트랜스코딩 비디오 저장소로 업로드
- 3a-1. 트랜스코딩이 끝난 비디오 CDN에 업로드
- 3b. 트랜스코딩 완료 이벤트를 트랜스코딩 완료 큐에 넣는다
- 3b-1. 완료 핸들러가 이벤트 데이터를 큐에서 꺼냄
- 3b-1-a/3b-1-b. 완료 핸들러가 메타데이터 데이터베이스와 캐시를 갱신
- 3b-1. 완료 핸들러가 이벤트 데이터를 큐에서 꺼냄
- 3a. 완료된 비디오를 트랜스코딩 비디오 저장소로 업로드
- 4.API 서버가 단말에게 비디오 업로드가 끝나서 스트리밍 준비가 되었음을 알림
- 메타데이터 갱신)
- 원본 저장소에 파일 업로드 되는 동안, 단말은 병렬적으로 비디오 메타데이터 갱신 요청을 API에 보냄
- 비디오 스트리밍 절차
- 스트리밍 프로토콜마다 지원하는 비디오 인코딩이 다르고 플레이어도 다ㅏ름
- 서비스의 용례에 맞는 프로토콜을 잘 고를 것
- ex)
- MPEG-DASH
- HLS (Apple)
- Microsoft Smooth Streaming
- Adobe HTTP Dynamic Streaming
- 스트리밍 프로토콜마다 지원하는 비디오 인코딩이 다르고 플레이어도 다ㅏ름
3단계. 상세 설계¶
- 비디오 트랜스코딩
- 비디오 녹화 시, 특정 포맷으로 저장됨. 순조롭게 여러 단말에서 재생되려면 타 단말과 호환되는 비트레이트/포맷으로 저장할 것
- 비트레이트: 비트가 얼마나 빨리 처리되어야 하는지를 나타내는 단위. 높을수록 고화질 비디오
- 비디오 트랜스코딩이 필요한 이유
- 가공되지 않은 비디오는 용량을 엄청 차지함
- 상당수 단말/브라우저는 특정 종류의 비디오 포맷만 지원. 여러 포맷으로 인코딩하는 것이 바람직
- 끊임 없는 비디오를 사용자에게 제공하기 위해서는 네트워크 환경에 따라 화질을 조절할 수 있어야 함
- 인코딩 포맷
- 컨테이너: 비디오/오디오/메타데이터 담는 바구니
- 코덱: 압축/압축해제 알고리즘. 비디오 화질 보존 + 파일 크기 줄이기에 사용
- 비디오 녹화 시, 특정 포맷으로 저장됨. 순조롭게 여러 단말에서 재생되려면 타 단말과 호환되는 비트레이트/포맷으로 저장할 것
- Directed Acyclic Graph (DAG) 모델 소개
- DAG: Acyclic(방향성, 특정 방향을 가짐) + Acyclic(비순환성, 자기 자신으로 못 돌아옴)
- 데이터 처리 파이프라인에 많이 사용
- 비디오 프로세싱 파이프라인 처리 과정의 병렬성을 높이기 위해, 각 작업을 단계별로 배열하여 순차/병렬 실행될 수 있도록 DAG를 사용하자.
- DAG: Acyclic(방향성, 특정 방향을 가짐) + Acyclic(비순환성, 자기 자신으로 못 돌아옴)
- 비디오 트랜스코딩 아키텍쳐
1. 전처리기- 비디오 분할: 비디오 스트림을 GOP(Group Of Pictures) 단위로 쪼갬.
- DAG 생성: 개발자가 작성한 파일에 따라 DAG 생성.
- 데이터 캐시: GOP와 메타데이터를 임시 저장소에 보관. 인코딩 실패시, 보관된 데이터를 기반으로 인코딩 재개 2. DAG 스케줄러

- DAG 그래프를 세부 스테이지로 분할, 해당 작업을 작업 큐에 publish
- ex)
- stage1. 비디오, 오디오, 메타데이터 분리
- stage2. 비디오 인코딩, 썸네일 추출, 오디오 인코딩 3. 자원 관리자

- 자원 배분을 효과적으로 수행하는 역할 담당 4. 작업 서버: 실제 작업 수행 5. 임시 저장소: 작업 서버가 빈번히 참조하는 작은 정보들. 프로세싱 후 삭제 요망 6. 인코딩된 비디오: 최종 결과물
- 시스템 최적화
- 속도 최적화
- 비디오 병렬 업로드: GOP를 병렬적으로 업로드
- 업로드 센터 사용자 근거리에 지정: CDN을 업로드 센터로 활용
- 모든 절차 병렬화
- 앞선 단계가 완료되어야 뒤의 절차를 진행할 수 있는 현재 구조를, MQ를 도입하여 시스템 결합도를 낮추자

- 안정성 최적화
- pre-signed 업로드 URL: URL이 가리키는 객체에 대해 접근 권한 선 부여, 해당 URL이 가르키는 위치에 업로드
- 비디오 보호: AES 암호화. 허락된 사용자만 암호화된 비디오 시청. 재생시에만 복호화
- 워커마크
- 비용 최적화
- 비디오 서비스는 롱테일 분포를 따름
- 인기 없는 비디오 인코딩하지마
- 특정 지역에서 인기있는 비디오는 지역에서만 캐싱
- ISP와 제휴
- 속도 최적화
-
쿠팡플레이 예시 w. GEMINI
[Request] Request URL https://vod02-cosmos.coupangstreaming.com/output/drm/2025/08/1a00cde8-5b71-4455-a294-39462a2fa9a3/avc/dash/1755266791/1b8a3f23415886d5c88918a77554201c08ff57aa-video-384_000000441.mp4 Request Method GET Status Code 200 OK Remote Address 162.128.170.47:443 Referrer Policy strict-origin-when-cross-origin [Response] accept-ranges bytes access-control-allow-methods * access-control-allow-origin * access-control-expose-headers cdn-tracking, via access-control-max-age 3600 cdn-tracking tencent content-length 237833 content-type video/mp4 date Sat, 16 Aug 2025 14:29:22 GMT eo-cache-status HIT eo-log-uuid 7940344221724878289 etag "a68623ecd91977e76fdf94bb3c0a3f4e" last-modified Fri, 15 Aug 2025 14:28:11 GMT server AmazonS3 vary Origin x-amz-cf-id A-NV0F0ubZZHe-VXcv9-__68tDP4OrCXJCxwJPtVKzufl6aBER7nwg== x-amz-cf-pop ICN57-P4 x-amz-meta-mediaconvert-jobid 1755266791252-2x5jis x-amz-server-side-encryption AES256 x-cache Miss from cloudfront- DRM (Digital Rights Management): 핵심적인 이유 🔒
- 영상 암호화: 쿠팡플레이의 원본 영상은 암호화된 상태로 서버(Amazon S3)에 저장됩니다. 요청 예시에서 받은 .mp4 파일은 단순한 영상 조각이 아니라, 암호가 걸려있는 영상 조각입니다.
- 재생 허가 및 복호화 키: 쿠팡플레이 앱이나 웹 플레이어에서 영상을 재생하면, 플레이어는 쿠팡플레이의 DRM 라이선스 서버에 "나 정식 사용자인데, 이 영상 재생하게 해줘"라고 요청을 보냅니다.
- 암호 해독: 라이선스 서버는 사용자의 로그인 정보와 기기 정보 등을 확인하고, 유효한 사용자일 경우에만 영상의 암호를 풀 수 있는 '복호화 키(Decryption Key)'를 보내줍니다. 이 키는 운영체제나 브라우저의 안전한 영역에서 처리되므로 사용자가 직접 가로챌 수 없습니다.
- 결론: 외부 다운로더로 영상 조각(.mp4)을 다운로드하더라도, 암호를 풀 수 있는 '키'가 없기 때문에 그냥 암호화된 데이터 덩어리일 뿐, 재생할 수 없습니다.
- DASH (Dynamic Adaptive Streaming): 조각난 파일 🧩
- 스트리밍 방식: URL에 포함된 /dash/는 이 비디오가 DASH 방식으로 스트리밍되고 있음을 나타냅니다. 이는 전체 비디오를 하나의 큰 파일로 보내는 것이 아니라, 수백, 수천 개의 아주 작은 .mp4 조각으로 쪼개서 전송하는 기술입니다.
- 다운로드의 어려움: 설령 모든 조각의 URL을 알아내서 다운로드하더라도, 이것들을 순서에 맞게 합치는 것은 매우 번거롭습니다. 더 중요한 것은 위에서 설명한 것처럼 이 조각들 하나하나가 모두 DRM으로 암호화되어 있다는 점입니다.
- 서명된 URL (Signed URL): 시간제한이 있는 주소 ⏱️
- 일회성 주소: URL의 1b8a3f23415886d5c88918a77554201c08ff57aa 와 같은 긴 문자열은 인증 토큰일 가능성이 높습니다. 이 토큰은 현재 로그인한 사용자에게만 특정 시간(예: 몇 분 또는 몇 시간) 동안만 유효하도록 생성됩니다.
- 재사용 불가: 따라서 시간이 지나거나 로그아웃하면 이 URL은 만료되어 더 이상 접근할 수 없게 됩니다. 다른 사람에게 이 URL을 공유해도 소용이 없습니다.
- DRM (Digital Rights Management): 핵심적인 이유 🔒
- 오류 처리
- 회복 가능 오류: 재시도
- 회복 불가능 오류: 클라이언트에게 적절한 오류 반환
4단계. 마무리¶
- 더 논의해보면 좋을 내용들
- API 무상태 서버 수평적 확장 가능
- 데이터베이스 계층 규모 확장성 확보 방안 (샤딩, 다중화)
- 라이브 스트리밍은 어떻게?
- 비디오 삭제: 저작권, 선정성, 불법적 어떻게?