이 글은 http://leandromoreira.com.br/2015/04/26/fifa-2014-world-cup-live-stream-architecture/ 의 번역본임.
번역이 다소 부자연스럽더라도 이해 바랍니다. 부족한 부분의 번역은 댓글로 남겨주심 수정할 용의 있음요.^^
우리는 피파14 월드컵 스트림을 위한 작업이 주어졌고 나는 경험을 공유할 가치가 있다고 생각한다. 이것은 아키텍쳐, 컴포넌트, the pain, 학습, 오픈 소스 등에 관한 quick 개요이다.
● 수치들
- 독일:브라질(7:1) (ㅎㅎ 자랑은 아닙니다)
- 0.5M 동접@단일 게임 - 아르헨티나 vs 스위스
- 580Gbps@단일 게임 - 아르헨티나 vs 스위스
- =~ 1600 watched years@전체 이벤트
● 핵심 개요
프로젝트는 입력 스트림을 받는것, 수천 수백의 HLS 출력 스트림을 생성하고 최종 사용자의 좋은 경험을 제공하는 것이었다.
1. RTMP 입력 스트림을 수행
2. HLS를 생성하고 Cassandra에 HLS를 보내기
3. Cassadra에서 바이너리와 메타 데이터를 가져오기와 Nginx+lua로 HLS 플레이리스트를 재생성
4. 확장 가능한 방식으로 라이브 컨텐츠 제공과 캐쉬
5. 플레이어 디자인과 구현
여러분은 우리가 왜 HLS를 선택했는지 이해하려면 프리젠테이션을 참고하라.
● 입력
라이브 스트림은 RTMP로 서버로 입력되고 우리는 입력 스트림을 받고 지정한 폴더로 HLS 생성을 위해 EvoStream(현재는 nginx-rtmp로 이전)을 사용했다. 그때 우리는 동일한 서버에서 구동중인 지정한 폴더를 감시하고 m3u8을 파싱하고 Cassandra에 데이터를 입력하는 몇개의 python daemons이 있다.
수정된 파일들을 감시하고 이런 이벤트들을 알려주기 위해, 우리는 첫번째로 watchdog을 시도했지만 몇가지 이유로 우리는 우리가 예상했던 만큼 빠르게 작업을 할수 없었고 우리는 pynotify로 변경했다.
우리가 극복해야하는 또다른 문제점은 x의cpu 코어에 파이썬 프로그램을 만드는 것이었다. 우리는 멀티 파이썬 프로세스를 생성하고 카산드라의 비동기 실행을 사용함으로 끝냈다.
팁:아마 최고의 언어와 툴은 다른 성안에 있을 것이다.(농담ㅋㅋㅋㅋㅋ)
● 스토리지
우리는 이전에 라이브 스트림 데이터를 저장하기 위해 Redis를 사용했지만 카산드라가 쉽게 DVR 기능을 제공하기 위해 필요하다고 생각했다(물론 우리는 아직 많은 곳에 Redis를 사용한다). 카산드라 응답 시간은 클라이언트들이 타임아웃이 시작되고 비디오 플레이백이 완전히 정지되는 특정한 지점에 부하를 증가 시켰다.
우리는 anti-pattern을 제거하는 Queue-like로 사용했다. 우리는 데이터를 비정규화 했고 LeveledCompactionStratege를 변경했고 뿐만아니라 durable_writes를 false로 셋팅했다. 이후 우리는 임시 데이터로 라이브 스트림을 처리했다. (We were using it as Queue-like which turns out to be a anti-pattern. We then denormalized our data and also changed to LeveledCompactionStrategy as well as we set durable_writes to false, since we could treat our live stream as ephemeral data.)
최종적으로, 가장 중요한 것은, 플레이리스트가 갖고 있는 최대 사이즈를 알고 있기 때문에, 우리는 시작 컬럼( id > minTimeuuid(now – playlist_duration)로 필터링)을 지정했다. 이것은 정말 읽기를 위한 삭제 표시의 효과가 완화되었다. 이것을 변화 시킨 후에, 우리는 99%로 10ms의 순으로 대기 시간을 달성할 수 있었다.
팁:여러분의 쿼리를 제한 + 여러분의 데이터를 비정규화 + graphite에 계측 데이터를 보내라 + SSD를 사용하라
● 결과
모든 데이터와 메타 데이터를 갖고 우리는 HLS manifest 를 생성할 수 있었고 비디오 청크를 제공했다. 우리가 어려움을 겪었던 유일한 것은 manifests 를 실행하고 생성하는 별도의 서버를 추가하지 않기를 바랬다는 것이다.
우리는 이미 Nginx+Lua에 많은 노력을 투자해왔고, 우리는 manifest를 수행하고 생성하는 것을 Lua를 사용하는 것으로 가능할 것이라 생각했다. 그것은 cassandra용 드라이버를 만들고 사용하는 것에 문제가 있었다. 이것을 접근하는(manifest를 재생성하는) 한가지 좋은 점은 결국엔 우리는 DASH(Dynamic Adaptive Streaming over HTTP)를 제공할 준비가 되었다는 것을 깨달았을 때였다.
팁:여러분의 lua스크립트를 테스트 + lua 글로벌 변수를 체크 + 여러분의 캐슁 설정을 체크
● 플레이어
보다 나은 경험을 제공하기 위해, 우리는 확장성있는 오픈소스 HTML5 비디오 플레이어인 Clappr을 빌드하는 것을 선택했다. PiP(Picture in Picture)와 멀티 화면 리플레이와 같은 몇가지 커스터마이징된 확장성을 가진 Clappr로 우리는 우리의 사용자에게 훌륭한 경험을 제공할 수 있었다.
● the sauron
모든 이 시스템을 한눈에 보기위해, 우리는 흔히 사용하는 오픈소스 프로젝트를 사용하여 모니터링 대쉬 보드를 만들었다.(logstash, elastic search, graphite, graphana, kibana, seyren, angular, mongo, redis, rails 그리고 많은 것들)
팁: graphite와 elasticsearch를 위해 ssd를 사용하라
● the bonus round
우리는 비록 전체 솔루션을 오픈 소스화하지 않았지만, 여러분은 대부분의 것들을 체크할 수 있습니다.
- Python HLS manifest parser / utility
- Pure lua Cassandra client driver
- Clappr
- Audio only from HLS nginx module
'IT Story' 카테고리의 다른 글
IT맨, 내가 사직서를 쓴 이유 (0) | 2007.06.11 |
---|