$30 off During Our Annual Pro Sale. View Details »

グランブルーファンタジーを支えるインフラの技術

Cygames
February 24, 2017

 グランブルーファンタジーを支えるインフラの技術

2017/02/16 Developers Summit 2017

Cygames

February 24, 2017
Tweet

More Decks by Cygames

Other Decks in Technology

Transcript

  1. © Cygames, Inc.
    tお

    View Slide

  2. © Cygames, Inc.

    View Slide

  3. © Cygames, Inc.

    View Slide

  4. © Cygames, Inc.

    View Slide

  5. © Cygames, Inc.

    View Slide

  6. © Cygames, Inc.
    本⽇日お話したいこと
    •  グランブルーファンタジーについて
    •  ログデータの取り組み
    •  5TB/⽇日のログデータの保存とデータ活⽤用⽅方法
    •  リアルタイム通信の⾼高速化
    •  Nginx と  Luaスクリプトを⽤用いたL7 ロードバランサシステム
    •  タグシステムと運⽤用
    •  サーバ情報のインベントリシステムと運⽤用事例例

    View Slide

  7. © Cygames, Inc.
    グランブルーファンタジー
    • スマホで遊べる本格RPG
    • ブラウザゲーム
    • 協⼒力力プレイ,  マルチプレイ

    View Slide

  8. © Cygames, Inc.
    ⼤大規模環境  –  ユーザ数
    登録ユーザ数
    1,400万⼈人
    PV
    ⽉月間300億PV

    View Slide

  9. © Cygames, Inc.
    ⼤大規模環境  –  システム
    クエリ数
    100万qps
    秒間アクセス数
    約8万/秒
    トラフィック
    12Gbps
    ※CDN除く

    View Slide

  10. © Cygames, Inc.
    ⼤大規模環境  –  トラフィック量量推移

    View Slide

  11. © Cygames, Inc.
    Web Server 1
    twemproxy
    memcached 1

    Application
    Servers
    Cache
    Servers
    Database
    Servers
    Master
    mysqli
    MySQL MHA Cluster 1
    Apache + mod_php
    Node Server 1
    Layer4  Load  Balancer(BIG-‐‑‒IP)
    Client N

    Web(HTTP) static data access
    Memcached
    Servers
    Client (Apps or Web Browser) 1
    Akamai
    CDN

    Nginx  1

    Application Load Balancers
    WebSocket
    (WS)
    Nginx  N
    Redis 1

    Redis
    Servers
    Redis N
    10G Ethernet 10G Ethernet
    Node
    Server N
    Web Server
    N

    WebSocket (WS)
    Web(HTTP)
    Access
    Load
    Balancer /
    Proxy
    Sharding (⽔水平分割)
    …N
    Node.js
    twemproxy
    memcached N
    Slave
    1
    Slave
    2
    MySQL MHA Cluster 2 MySQL MHA Cluster 3
    構成と技術スタック
    Master
    Slave
    1
    Slave
    2
    Master
    Slave
    1
    Slave
    2

    View Slide

  12. © Cygames, Inc.
    オンプレミス環境
    •  ネットワーク通信量量
    •  安定したトラフィック
    •  低レイテンシ
    •  バーストトラフィック,  スパイクがない
    •  ハイパフォーマンス
    •  I/Oアクセラレータ(NVMe規格  SSD, Fusion-IO)
    •  ネットワークIRQのマルチコアスケーリング

    View Slide

  13. © Cygames, Inc.
    ログデータの取り組み      

    View Slide

  14. © Cygames, Inc.
    ソーシャルゲームとログ
    •  CS対応
    •  CS最優先
    •  お問い合わせで数ヶ⽉月前のログを調査
    •  補填対応
    •  不不具合発⽣生時の補填
    •  KPI指標の取得
    •  システム不不具合の調査
    •  エラーログ, sqlログ
    •  バックアップ
    •  不不具合発⽣生時の再現(スナップショット復復元)

    View Slide

  15. © Cygames, Inc.
    データの種類と量量
    •  テキストログ
    •  アクセスログ, ⾏行行動ログ, バトルログ, SQLログ…
    •  データベース  インサートログ
    •  課⾦金金ログ,  アイテムログ
    テキストログ
    4.8TB/⽇日
    (圧縮時625GB/⽇日)
    データベース  インサート
    180GB/⽇日
    約5TB/⽇日

    View Slide

  16. © Cygames, Inc.
    リリース当初のログシステム  –  テキストログ
    •  テキストログ収集
    •  ログ集約サーバに転送
    •  rsyncでログストレージに転送
    Web Server 1
    Web Server 2
    Web Server N
    Storage
    Array
    Log Aggregation
    Server
    Access log
    SQL log
    Error log
    KPI log
    ...
    Real Time
    rsync
    深夜1回

    View Slide

  17. © Cygames, Inc.
    ログ肥⼤大化による問題  –  テキストログ
    •  ディスク容量量枯渇
    •  ログ集約サーバを分散
    •  ログ転送遅延
    •  CS対応, 補填対応に遅延
    Web Server 1
    Web Server 2
    Web Server N
    Storage Array
    Log Server 1  
    Access log
    SQL log
    Error log
    KPI log
    ...
    rsync
    深夜1回
    Log Server 3
    Log Server 2

    View Slide

  18. © Cygames, Inc.
    ログ肥⼤大化による問題  –  データベースログ
    •  ディスク容量量枯渇
    •  恒常的にディスク使⽤用率率率監視でアラート
    •  レスポンス遅延
    •  MySQL Insert処理理の遅延
    Web Server 1
    Web Server 2
    Web Server N
    Payment Log
    ...
    MySQL Server  
    Item Log
    Insert
    /同期処理理

    View Slide

  19. © Cygames, Inc.
    ログシステムの改善
    •  Amazon S3 にログを集約  
    •  独⾃自ログ転送エージェントの開発
    •  Stalker: テキストログ転送
    •  ⼀一⾏行行で送信できるサイズ制限のため、OSSのログコレク
    ターから  Go⾔言語製のS3ログ転送エージェントを開発
    •  S3  オブジェクト名の先頭4⽂文字にハッシュ⽂文字列列追加
    •  オブジェクト名のインデックスを複数のパーティションに均等に配置
    •  Porter: ⾮非同期  mysqlログ転送
    •  TSVファイルをS3に転送, SQSサービスでメッセージを
    キュー化
    •  Batchシステムでキューを取得し  Amazon Auroraに INSERT

    View Slide

  20. © Cygames, Inc.
    Porter と  ⾮非同期ログシステム
    Porter
    Game
    servers(WEB)
    Amazon
    S3
    Amazon
    SQS
    TSV
    Loader (EC2)
    TSV Files
    TSV Files
    TSV Files
    TSV Files
    TSV Files
    TSV Files
    Log Database
    (Amazon
    Aurora)
    Insert
    Select
    データ解析
    CS対応
    ファイル転送
    メッセージキュー作成
    キューを取得し,
    Insert処理理実⾏行行

    View Slide

  21. © Cygames, Inc.
    ログ活⽤用
    ログ転送エージェント
    Porter, Stalker
    Google
    BigQuery
    Amazon S3
    Mackerel Kibana
    Amazon
    Aurora
    DWH分析
    (Redshift, Netezza)

    View Slide

  22. © Cygames, Inc.
    Kibana

    View Slide

  23. © Cygames, Inc.
    Kibana
    レスポンスタイム 5秒以上のアクセス数

    View Slide

  24. © Cygames, Inc.
    Kibana
    HTTPステータス 500 のアクセス数

    View Slide

  25. © Cygames, Inc.
    Kibana
    レスポンスタイム 5秒以上のURLと件数

    View Slide

  26. © Cygames, Inc.
    Kibana

    View Slide

  27. © Cygames, Inc.
    Mackerel
    Apacheレスポンスタイム 2秒以上の分布

    View Slide

  28. © Cygames, Inc.
    ログデータの取り組み
    •  ログ保存場所の集約
    •  S3に集約したことでツール連携が容易易に
    •  ⾮非同期・マイクロサービス化
    •  ⾮非同期処理理でゲームシステムと分離離
    •  独⾃自エージェントの開発
    •  コアとなる技術は⾃自前で開発

    View Slide

  29. © Cygames, Inc.
    リアルタイム通信の⾼高速化      

    View Slide

  30. © Cygames, Inc.
    双⽅方向リアルタイム通信  –  チャット
    ロビーやバトルの
    チャットのメッセージ交換

    View Slide

  31. © Cygames, Inc.
    双⽅方向リアルタイム通信  –  ダメージ・効果
    マルチバトルでのダメージ等の
    パラメータの反映
    特殊効果ステータス共有

    View Slide

  32. © Cygames, Inc.
    双⽅方向リアルタイム通信
    •  WebSocket の導⼊入
    •  クライアント – サーバ間に持続的接続を確⽴立立
    •  クライアント – サーバ間で双⽅方向にデータ送受信
    •  複数クライアントにデータをリアルタイムで送受信
    •  更更新なしにリアルタイムでメッセージが反映
    •  Node.js で  WebSocket 通信, データ送受信を実装

    View Slide

  33. © Cygames, Inc.
    リアルタイム通信のサーバ構成  
    Room 1
    Server
    Room 3
    Room 2
    Client 1
    Room1
    Client 2
    Room2
    Client 3
    Room1
    Client 4
    Room3
    •  クライアントはRoomという単位でグループ化され,  メッセージが
    共有される
    •  同じRoomIDを持つクアイアント同⼠士でメッセージを共有する仕組
    みを持つ
    •  分散リアルタイム通信のサーバ構成
    •  バランシング管理理サーバモデル
    •  Pub/Subメッセージモデル

    View Slide

  34. © Cygames, Inc.
    リアルタイム通信の分散  – バランシング管理理サーバ  
    Server 1
    Room 1
    Server 2 Server 3
    Room 3
    Room 2
    グローバルIPを持ち、
    クライアントと直接
    通信
    Client 1
    Room1
    Client 2
    Room2
    Client 3
    Room1
    Client 4
    Room3
    各クライアントに
    接続先情報を通知
    管理理サーバ
    (Load Balancing)
    •  管理理サーバを通して接続先情報をクライアントに通知
    •  各サーバにグローバルIPを付与, クライアントと直接通信
    •  スケールアウトしやすい
    •  各サーバにグローバルIPが必要であり, 管理理が煩雑
    •  管理理サーバの冗⻑⾧長性を考慮する必要がある

    View Slide

  35. © Cygames, Inc.
    リアルタイム通信の分散  – Pub/Subメッセージモデル
    Layer4 Load Balancer
    Server 1
    Room 1
    Room 1
    Room 2
    Room 3
    Pub/Subを介して分散
    されたサーバ間でメッ
    セージが共有される
    Client 3
    Room1
    Client 1
    Room1
    Client 2
    Room2
    Client 4
    Room3
    Server 2
    Room 2 Room 1
    Room 3
    Server 3
    Pub/Sub
    メッセージキュー
    •  メッセージキューを介してサー
    バ間でメッセージをやりとり
    •  クライアントのリクエストは
    Room IDに関係なく分散される
    •  ⽐比較的容易易に実装が可能でス
    ケールアウトしやすい
    •  メッセージキューのボトルネック
    •  メッセージ・ブロードキャストに
    よる負荷
    •  スケールアウトに限界がある

    View Slide

  36. © Cygames, Inc.
    Pub/Subメッセージングモデルの課題
    •  負荷上昇と遅延
    •  Nodeサーバ CPU上昇
    •  Redisに集中し遅延が発⽣生
    •  単⼀一障害点(SPOF)  
    •  Redis pub/sub がボトルネック
    •  スケールアウトの課題
    •  セット構成でスケール
    •  セット数/サーバ台数の増加
    •  管理理⼯工数の増⼤大
    •  8セットまで増⼤大
    Layer4 Load Balancer
    Node 1
    Room 1
    Room 1
    Room 2
    Room 3
    Client 3
    Room1
    Client 1
    Room1
    Client 2
    Room2
    Client 4
    Room3
    Node 2
    Room 2 Room 1
    Room 3
    Node 3
    Redis Pub/Sub

    View Slide

  37. © Cygames, Inc.
    Room対応 L7ロードバランサの開発
    •  ボトルネックがなく、スケール
    アウトが動的に⾏行行える
    •  アプリケーションは  RoomID を
    URLクエリストリングに付与
    •  RoomID のハッシュ値と
    Node.jsプロセス数を元に接続
    先ノードを決定
    •  同⼀一RoomID のリクエストを同
    ⼀一のNode.jsプロセスに動的に
    ルーティング
    Layer4 Load Balancer
    Client 3
    Room1
    Client 1
    Room1
    Client 2
    Room2
    Client 4
    Room3
    Nginx 1 ・・・
    Application Load Balancer Cluster
    Nginx 2 Nginx N
    Room 1
    Node 2
    Room 2 Room 3
    Node 3
    Node 1
    Dynamic
    Routing
    Lua Lua Lua

    View Slide

  38. © Cygames, Inc.
    Nginx L7  ロードバランサ + Lua
    •  Nginx
    •  WebSocket通信  (双⽅方向通信)のロードバランサ
    •  URLクエリストリングをもとに同じRoomID のユー
    ザを同じNode.jsプロセスにルーティングする
                  ※. 分散ロジックはLuaスクリプトで実装
    •  Lua
    •  ⾼高速スクリプト
    •  分散ロジック(Consistent Hashing)の実装
    •  WebAPIにより無停⽌止に設定変更更
    追加 http://[nginx IP]/add/[upstream]
    削除 http://[nginx IP]/del/[upstream]
    ⼀一覧表⽰示 http://[nginx IP]/debug_upstream/

    View Slide

  39. © Cygames, Inc.
    Consistent Hashing  によるバランシング
    •  Consistent Hashing
    •  ノードの追加・削除を最⼩小限の変更更でマッピング
    •  ノード障害/削除の影響を最⼩小限に
    •  Application Load Balancer
    •  URLクエリストリング  に Room ID(グループ識識別⼦子)
    を付与
    •  RoomID のハッシュ値とNode.jsプロセス数を元に動的
    に接続先ノードが決定される
    •  ヘルスチェックを⾏行行い, unhealthyのノードは動的に削除

    View Slide

  40. © Cygames, Inc.
    •  Nodeサーバー
    •  ロードアベレージが1.8 →  0.1
    •  CPU使⽤用率率率も160%  →  5%
    ロードアベレージ CPU使⽤用率率率

    View Slide

  41. © Cygames, Inc.
    •  Nginxリソース状況
    •  同時19,000TCPセッション(1台あたり)
    •  CPU使⽤用率率率  3%

    View Slide

  42. © Cygames, Inc.
    12万同時接続達成
    サーバ台数 260台 → 40台

    View Slide

  43. © Cygames, Inc.
    リアルタイム通信の⾼高速化
    •  Pub/Subメッセージングモデルの限界
    •  Redisサーバの処理理が遅延, ボトルネック
    •  スケールアウトの課題(SPOF)
    •  ⾼高速化
    •  構成をシンプルに設計する
    •  Lua(軽量量スクリプト)の採⽤用
    •  アプリケーションロジックの抽象化
    •  なるべくロジックはインフラ(システム)で吸収する

    View Slide

  44. © Cygames, Inc.
    タグシステムと運⽤用        

    View Slide

  45. © Cygames, Inc.
    ⼤大規模環境の運⽤用
    •  複数サーバのリストの作成
    •  複数サーバに並列列にコマンド実⾏行行
    •  Jenkinsなどのツールからコマンド実⾏行行
    •  故障機器の排除
    •  デプロイ対象から排除, アプリ運⽤用エンジニアと迅速
    な連携
    •  運⽤用に必要な情報の管理理
    •  解析ツールのインストール情報
    •  ロードバランサへの組み込み状況

    View Slide

  46. © Cygames, Inc.
    タグシステムの開発
    •  サーバ情報インベントリシステムの開発
    •  サーバリストの抽出の簡略略化
    •  CLIやAPIでサーバ情報取得
    •  サーバの構築状況を可視化
    •  構築ステータス
    •  デプロイステータス
    •  任意にタグ情報を付加できる
    •  事前にスキーマの定義が不不要で運⽤用していく中で情
    報を追加・削除できる
    •  Elasticsearch にサーバ情報を登録

    View Slide

  47. © Cygames, Inc.
    登録情報⼀一覧
    kibana  登録情報の⼀一覧および統計

    View Slide

  48. © Cygames, Inc.
    開発エンジニアとの連携
    デプロイ対象ホストの確認

    View Slide

  49. © Cygames, Inc.
    CLIでホスト情報の取得
    CLIからJSON形式で特定ホストのタグ情報を取得
    $ eshosttag-list -l "hostname:XXX_WEB1003" | jq .
    {
    "took": 1,
    "timed_out": false,
    "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
    },
    "hits": {
    "total": 1,
    "max_score": null,
    "hits": [
    {
    "_index": "hosts",
    "_type": "hosts",
    "_id": "XXX_WEB1003-xx.xx.88.53",
    "_score": null,
    "_source": {
    "created_at": "2015-12-17T13:44:29+09:00",
    "datacenter": ”XX",
    "env": "prd",
    "hostname": "XXX_WEB1003",
    "ip": ”xx.xx.88.53",
    "ips": [
    ”xx.xx.88.53"
    ],
    "num": 1003,
    "project": ”XXXXX",
    "type": "web",
    "updated_at": "2016-08-19T01:02:54+09:00",
    "updated_by": ”yamada_taro",
    "service80": "true",
    "lastping_at": "2017-02-12T15:22:51+09:00",
    "dead": null,
    "s_updated_by": "esbigip",
    "s_updated_at": "2016-12-05T16:48:13+09:00",
    "": "",
    "deploy_state": "deployable",
    "server_state": "ready",
    "newrelic": "true",
    "iptables_stop": "true",
    "mackerel_id": ”XXXXXXXX"
    },
    "sort": [
    "web",
    1003
    ]
    }
    ]
    }
    }

    View Slide

  50. © Cygames, Inc.
    サーバリストの作成
    CLIから特定プロジェクトの本番環境WEBサーバのリストを抽出
    $ eshosttag-hostnamelist --project xxxxx --type web --env prd | head -n 30
    XXX_WEB1001
    XXX_WEB1002
    XXX_WEB1003
    XXX_WEB1004
    XXX_WEB1005
    XXX_WEB1006
    XXX_WEB1007
    XXX_WEB1008
    XXX_WEB1009
    XXX_WEB1010
    XXX_WEB1011
    XXX_WEB1012
    XXX_WEB1013
    XXX_WEB1014
    XXX_WEB1015
    XXX_WEB1016
    XXX_WEB1017
    XXX_WEB1018
    XXX_WEB1019
    XXX_WEB1020
    XXX_WEB1021
    XXX_WEB1022
    XXX_WEB1023
    XXX_WEB1024
    XXX_WEB1025
    XXX_WEB1026
    XXX_WEB1027
    XXX_WEB1028
    XXX_WEB1029
    XXX_WEB1030

    View Slide

  51. © Cygames, Inc.
    タグ運⽤用
    •  ⼤大規模環境の運⽤用効率率率化
    •  デプロイやオペレーションの効率率率化
    •  オペミス防⽌止
    •  サーバ情報のテキスト管理理からの脱却
    •  ツールとの連動を促進
    •  CLIによる対象サーバの情報抽出
    •  Rundeck(並列列コマンド実⾏行行)
    •  Mackerel(監視ツール)

    View Slide

  52. © Cygames, Inc.
    まとめ  
    Cygamesインフラが⼤大切切にしていること
    •  当たり前のことを当たり前にやる
    •  ボトルネックを作らないシステム設計
    •  枯れた技術を採⽤用し,  安定稼働を⽬目指す
    •  アプリケーションロジックを抽象化する
    •  冗⻑⾧長化・分散等のロジックはシステムで吸収, 抽象化
    •  他のプロジェクトへの展開を容易易にする
    •  コア技術は⾃自分たちで実装する

    View Slide