[발 번역] YouPorn – 하루에 2억건의 뷰 이상을 목표로 하다.

해당 글은 http://highscalability.com/blog/2012/4/2/youporn-targeting-200-million-views-a-day-and-beyond.html 의 글을 발 번역한 것입니다. 오역에 주의하시길 바랍니다.(아 이거 번역하면 -_- 웬지 나중에 국내에서 차단당할꺼 같은 느낌이 드네요.)

YouPorn.com 의 리드 개발자인 Erick Pickup 는 ConFoo 컨퍼런스(올해 2월쯤에 캐나다에서 열렸습니다. 여러가지 인터넷 기술에 대한 컨퍼런스입니다.) 에서 Building a Website To Scale 라는 제목으로  YouPorn의 아키텍처에 대해서 발표했습니다. 예상하듯이, YouPron은 매 초마다 엄청난 수의 DVD를 스트리밍 하고, 초당 30만 쿼리를 처리하고 한시간에 15GB 의 로그 데이터를 생성합니다.( 역자 주: 한 시간에  15GB면 사실 많은 양은 아닙니다.  15GB * 12 = 180GB 정도라, 국내 게임들은 하루에 몇테라 수준의 로그를 생성합니다. 쿨럭…)
불행하게도, 발표 슬라이드가 기대한 만큼 기술적이지 않습니다. 비디오를 핸들링하는 예제에서도 뭔가 볼게 없었습니다. 그러나, 세세한 부분에서 재미난 부분을 찾았습니다.

YouPorn 에서 얻은 가장 흥미로운 점은 LAMP(Linux+Apache+Mysql+PHP) 에서 datapath를 저장하는 Mysql 을 NoSQL인 Redis 로 변경한 것입니다.( 역자 주: 아마도 동영상 경로등을 저장하고 있던 부분을 대체한 것으로 추측합니다. ) YouTube 의 사례를 떠올려보면 좋을듯 합니다.
두번째 흥미로운 점은 “큰 전환” 입니다. 일반적으로 절대로 기존걸 버리고 새로 만들지 마라라는 격언이 있는데, 2011년에 YouPorn 에서는 기존에 복잡한 Perl + Mysql 기반으로 만들어진 전체 사이트를 PHP + Redis 를 이용해서 완전히 새로 만들었습니다. 그리고 모든 계정은 잘 전환되었습니다.  6년의 레거시 코드가 다운 타임 없이 새로운 코드로 옮겨졌습니다. 사이트는 10% 빨라졌습니다.

YouPorn 아키텍처에 대해서 더 알아보도록 하겠습니다.

Stats

  • 2006에 시작되었고, 2011년에 갈아엎었다.
  • 2008년에는 하루에 1억건의 페이지 뷰가 발생함
  • 초당 30만 쿼리 요청
  • 초당 100Gb 이상의 3개의 풀 DVD가 스트리밍 됨
  • 시간당 8~15GB 정도의 로그가 생성됨

Stack

  • 처음에는 Perl 로 작성됨
  • 현재는 PHP-FPM (FastCGI Process Manager)  – PHP FastCGI의 대안
  • HAProxy
  • ActiveMQ
  • Varnish
  • Redis
  • Nginx
  • MySQL
  • Syslog-ng
  • Symfony2 – PHP Web Development Framework.

Architecture

  • “큰 전환” 2011년에 기존의 복잡한 Perl 대신에 PHP로, Mysql 대신에 Redis와 ActiveMQ로 전환
    • 하루에 2억건 이상의 리퀘스트를 처리하는 것이 목표
    • 6년된 레거시 코드를 다운타임 없이 이동
    • 새로운 사이트가 10% 더 빠름.
    • 예상했던 것보다 시간이 더 걸렸음:
      • 어떤 기술을 적용할지 고민해야 했음
      • 생각보다 더 긴 학습 곡선
      • Mysql에서 Redis로의 데이터 변환
      • 인력 구성
  • HAProxy – 로드 밸런싱, 헬스 체크, 지능적인 부하 분산을 제공
    • 두 개의 서버 풀을 운영. Write 풀은 Master 백업기능을 가지고, Read 풀은 마스터를 제외하고 서비스하는 서버
  • Varnish – 서버로드를 감소시키고, 서비스의 속도를 빠르게 해주는 reverse proxy 로 사용, 캐시 관리와, 웹서버의 헬스 체크,  ESI용도로 사용(역자 주: ESI는 http://en.wikipedia.org/wiki/Edge_Side_Includes 여기서 확인하세요. )
  • Syslog-ng – 페이지 뷰에 대한 데이터 수집과 뷰 카운터, 연관 비디오를 위해 사용합니다.
  • Nginx – PHP-FPM을 이용한 고성능 웹서버로 동작하고, 정적 파일( CSS, 이밎, JS ) 을 위한 외부 CDN으로 동작.
  • Symfony – 빠르고, 다양한 기능이 있는 라이브러리 집합(역자 주: PHP Web Framework 라네요).
    • Symfony2 + Redis 조합 고려중 = 빠른 개발 + 적절한 분배를 통한 확장성 있는 웹
    • dependency injection 을 사랑함
    • 웹프레임워크의 구조를 알고 적절하게 이용하는 것은 퍼포먼스를 해치지 않는다..
  • ActiveMQ – 큰 사이트를 위한 메시지 버스로 디자인 되었음, MYSQL과 Redis의 쓰기를 위한 용도로 사용
    • 지속적으로 개선해야 하는 사이트에서 개별적인 자바 인프라스트럭처를 유지하는 것은 어렵다.( 역자 주: 다른 것에서 쉽게 사용하기 위해서 큐 계층이 필요하다는 얘기인듯 합니다.)
    • 기술적인 부분보다는 개발자로 인해서 문제가 더 많이 발생
  • Redis – 빠른 오픈소스 Key-Value 저장소, 현재 주 저장소로 사용중
    • 실시간 업데이트
    • 리스트를 위한 Sorted-Set 사용
    • Pipelining, 성능을 위해서 하나의 명령으로 여러개의 redis 커맨드를 실행한다.
    • Reids  로 전환후에 Redis Node를 추가하자 Redis 자체는 부하가 없었는데, 네트웍 카드가 Redis의 성능을 견디지 못했다.
    • 요구사항으로 인해서 새로운 형태의 sorted-set을 만들어야 할 경우, Mysql을 사용했다.
    • 증분 백업을 위하여 Append-only-file (AOF) 을 사용한다.
    • 부하 감소와 성능 향상을 목적으로  Redis Persistent 계층 앞에 임시 Redis 캐시를 도입하는 것을 고려중
  • MySQL – Redis 저정소를 도와주는 역할을 함
    • 사이트에서 바로 호출되지 않으므로, 극도로 추상화 되어있음
    • 몇 개의 테이블은 1억 row가 넘음
    • Redis list 를 새로운 형태로 변환한 내용을  저장하는데 사용
  • GIT과  SVN을 동시에 사용중인데, 뭔가 잘 동작하지 않는다.
  • CMS 툴로 Doctrine 을 사용한다.개발 기간을 줄여주는 좋은 툴이다..

Related Articles