그랑 블루 판타지를 뒷받침하는 인프라 기술

일본의 데브서밋 컨퍼런스에서

그랑 블루 판타지에 대해서

특징

  • 스마트 폰 RPG
  • 브라우저 게임
  • 협력 플레이, 멀티 플레이

시스템 규모

  • 등록 유저 수 1400만명
  • 월간 300억 PV
  • 100만 query/sec
  • 8만 req/sec
  • 트래픽 12Gbps(CDN 제외)

시스템 구성

  • LB는 BIG-IP
  • CDN은 Akamai
  • HTTP/WebSocket이 프런트 인터페이스

  • Web:Apache+mod_php+mysqli
  • Node:Node.js+twemproxy
  • DB:MySQL+MHA

on-premises, 가상화 환경은 사용하지 않는다

  • 네트워크 통신량이 매우 많다
  • 저 레이턴시를 요구되고 있다
  • 하이 퍼포먼스를 실현하기 위해
    • NVMe SSD나 Fusion-io를 채용
    • 네트워크 IRQ의 멀티 코어 스케일링에 대응한 NIC을 채용

로그 데이터의 대처

소셜 게임과 로그

  • CS 대응, 보충 대응 등의 유저 대응
    • CS 최우선, 몇달 전의 로그를 조사할 필요 있다
  • KPI 지표 취득
  • 시스템 오류 조사
    • 오류 로그 및 SQL 로그
  • 백업
    • 문제 발생 시의 재현(스냅 샷 복원)

로그 데이터의 양은 5TB/day

  • 텍스트 로그(4.8TB/day)
  • DB 인서트 로그(180GB/day)

로그 비대화에 따른 문제

  • 당초는 로그 집약 서버에 전송하고, 로그 저장소에 심야에 rsync를 했었다
  • 로그 비대화로 로그 집약 서버를 분산했지만 로그 전달이 지연되고 CS 대응에 차질을 빚기 시작했다
  • DB에서도 로그가 비대화하여 디스크 용량이 고갈되거나 삽입 처리가 지연

로그 시스템 개선

  • Amazon S3에 로그를 집약
  • 자체 로그 전송 에이전트를 개발
    • 텍스트 로그 전송
      • 1행으로 전송할 수 있는 사이즈 제한을 걷어치우기 위해
      • S3 객체의 프레 픽스를 달다
    • 비동기 MySQL 로그 전송
      • TSV를 S3에 전송, SQS에 메시지 큐를 작성, EC2의 아그리게이터를 모아서 Aurora로

로그를 활용

  • 로그 전송 에이전트 => S3 => BQ, Mackerel, Kibana, Aurora, DWH 분석 등

Kibana

  • 액세스 로그, AP 로그, 오류 로그에서 통계 정보를 비주얼화
    • 응답 시간이나 느린 URL이나 오류 수 등
    • 특정 지역별 오류를 가시화
      • 특정 구역의 통신 장애 등을 특정시키기 위해

Mackerel

  • Apache 응답 시간을 집계
    • 2초 이상의 분포를 가시화
    • twitter의 키워드 검색도 가시화
      • “그랑 불루 무거운 “등의 tweet

로그 데이터의 대처 정리

  • Amazon S3에 집약
  • 비동기 마이크로 서비스화
    • 비동기 처리로 게임 시스템과는 분리
  • 독자 에이전트의 개발
    • 핵심 기술은 자체적으로 개발하는 정책

실시간 통신 고속화

쌍방향 실시간 통신이 필요한 곳

  • 채팅에서 메시지 교환
  • 멀티 배틀에서의 파라미터 반영

쌍방향 실시간 통신

  • WebSocket 도입
  • Node.js로 구현

실시간 통신 서버 구성

  • 서버에서는 복수 Room이 붙어 있다
    • 클라이언트는 Room 단위로 그룹화
  • 아키텍처
    • 밸런싱 관리 서버 모델
    • Pub/Sub 메시지 모델

밸런싱 관리 서버 모델

  • 관리 서버가 클라이언트나 Room의 이력을 관리
  • 관리 서버의 redundancy를 고려해야 해서 복잡해진다

Pub/Sub메시지 모델

  • 메시지 큐를 통해서 서버 간에 교환
  • 메시지 큐가 보틀 넥이 되기 쉽다
  • 브로드캐스트에 의한 통신량 증가
  • Redis Pub/Sub가 보틀 넥이 되었다. 또 스케일 아웃에 과제
    • 세트 구성으로 스케일 하도록 8세트까지 증대

Room 대응 L7 로드밸런스를 개발

  • 애플리케이션은 RoomID를 URL 쿼리 문자열에 붙인다
  • RoomID의 해시 값을 사용하여 분산

Nginx L7로드 밸런서+Lua

  • Nginx는 WebSocket의 LB
  • RoomID에서 Node.js프로세스로 라우팅
  • Lua로 분산 로직 구현
  • Consistent Hashing을 활용
  • Node의 헬스 체크도 한다(자동 분리)

Nginx 자원 상황

  • 동시 19,000 TCP 세션으로 서버의 CPU 사용률은 3% 정도
  • 부하 낮아서 집약한 결과, 포토 고갈로
  • 커널 파라미터 조정하거나 TIME_WAIT의 잔류 시간을 짧게 하기 위해서 커널 리빌드를 해도 따라잡지 못했다
  • 서버에 복수의 IP 주소를 부여하고, 많은 포토를 사용할 수 있도록 하였다
  • 현재는 12만 세션/1대를 다루도록 되어 있다

Cygames 인프라가 중요하게 여기는 것

  • 당연한 것을 당연하게 한다
    • 보틀넥을 만들지 않는 시스템 설계
    • 마른 기술(검증된 기술)을 채용하여 안정화를 목표로
  • 어플리케이션 로직을 추상화한다
    • redundancy, 분산 등의 로직은 시스템에서 흡수·추상화
    • 다른 프로젝트에 대한 전개를 용이하게 한다
  • 핵심 기술은 자신들이 구현한다



출처: http://d.hatena.ne.jp/rx7/20170216/p1


이 글은 2017-07-05에 작성되었습니다.