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

510ec964f5d26c2724c883fd7b671e3d?s=47 Cygames
February 24, 2017

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

2017/02/16 Developers Summit 2017

510ec964f5d26c2724c883fd7b671e3d?s=128

Cygames

February 24, 2017
Tweet

Transcript

  1. © Cygames, Inc. tお

  2. © Cygames, Inc.

  3. © Cygames, Inc.

  4. © Cygames, Inc.

  5. © Cygames, Inc.

  6. © Cygames, Inc. 本⽇日お話したいこと •  グランブルーファンタジーについて •  ログデータの取り組み •  5TB/⽇日のログデータの保存とデータ活⽤用⽅方法

    •  リアルタイム通信の⾼高速化 •  Nginx と  Luaスクリプトを⽤用いたL7 ロードバランサシステム •  タグシステムと運⽤用 •  サーバ情報のインベントリシステムと運⽤用事例例
  7. © Cygames, Inc. グランブルーファンタジー • スマホで遊べる本格RPG • ブラウザゲーム • 協⼒力力プレイ,  マルチプレイ

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

  9. © Cygames, Inc. ⼤大規模環境  –  システム クエリ数 100万qps 秒間アクセス数 約8万/秒

    トラフィック 12Gbps ※CDN除く
  10. © Cygames, Inc. ⼤大規模環境  –  トラフィック量量推移

  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
  12. © Cygames, Inc. オンプレミス環境 •  ネットワーク通信量量 •  安定したトラフィック •  低レイテンシ

    •  バーストトラフィック,  スパイクがない •  ハイパフォーマンス •  I/Oアクセラレータ(NVMe規格  SSD, Fusion-IO) •  ネットワークIRQのマルチコアスケーリング
  13. © Cygames, Inc. ログデータの取り組み      

  14. © Cygames, Inc. ソーシャルゲームとログ •  CS対応 •  CS最優先 •  お問い合わせで数ヶ⽉月前のログを調査

    •  補填対応 •  不不具合発⽣生時の補填 •  KPI指標の取得 •  システム不不具合の調査 •  エラーログ, sqlログ •  バックアップ •  不不具合発⽣生時の再現(スナップショット復復元)
  15. © Cygames, Inc. データの種類と量量 •  テキストログ •  アクセスログ, ⾏行行動ログ, バトルログ,

    SQLログ… •  データベース  インサートログ •  課⾦金金ログ,  アイテムログ テキストログ 4.8TB/⽇日 (圧縮時625GB/⽇日) データベース  インサート 180GB/⽇日 約5TB/⽇日
  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回
  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
  18. © Cygames, Inc. ログ肥⼤大化による問題  –  データベースログ •  ディスク容量量枯渇 •  恒常的にディスク使⽤用率率率監視でアラート

    •  レスポンス遅延 •  MySQL Insert処理理の遅延 Web Server 1 Web Server 2 Web Server N Payment Log ... MySQL Server   Item Log Insert /同期処理理
  19. © Cygames, Inc. ログシステムの改善 •  Amazon S3 にログを集約   • 

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

    S3 Mackerel Kibana Amazon Aurora DWH分析 (Redshift, Netezza)
  22. © Cygames, Inc. Kibana

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

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

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

  26. © Cygames, Inc. Kibana

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

  28. © Cygames, Inc. ログデータの取り組み •  ログ保存場所の集約 •  S3に集約したことでツール連携が容易易に •  ⾮非同期・マイクロサービス化

    •  ⾮非同期処理理でゲームシステムと分離離 •  独⾃自エージェントの開発 •  コアとなる技術は⾃自前で開発
  29. © Cygames, Inc. リアルタイム通信の⾼高速化      

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

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

  32. © Cygames, Inc. 双⽅方向リアルタイム通信 •  WebSocket の導⼊入 •  クライアント –

    サーバ間に持続的接続を確⽴立立 •  クライアント – サーバ間で双⽅方向にデータ送受信 •  複数クライアントにデータをリアルタイムで送受信 •  更更新なしにリアルタイムでメッセージが反映 •  Node.js で  WebSocket 通信, データ送受信を実装
  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メッセージモデル
  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が必要であり, 管理理が煩雑 •  管理理サーバの冗⻑⾧長性を考慮する必要がある
  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に関係なく分散される •  ⽐比較的容易易に実装が可能でス ケールアウトしやすい •  メッセージキューのボトルネック •  メッセージ・ブロードキャストに よる負荷 •  スケールアウトに限界がある
  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
  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
  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/
  39. © Cygames, Inc. Consistent Hashing  によるバランシング •  Consistent Hashing • 

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

    CPU使⽤用率率率も160%  →  5% ロードアベレージ CPU使⽤用率率率
  41. © Cygames, Inc. •  Nginxリソース状況 •  同時19,000TCPセッション(1台あたり) •  CPU使⽤用率率率  3%

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

  43. © Cygames, Inc. リアルタイム通信の⾼高速化 •  Pub/Subメッセージングモデルの限界 •  Redisサーバの処理理が遅延, ボトルネック • 

    スケールアウトの課題(SPOF) •  ⾼高速化 •  構成をシンプルに設計する •  Lua(軽量量スクリプト)の採⽤用 •  アプリケーションロジックの抽象化 •  なるべくロジックはインフラ(システム)で吸収する
  44. © Cygames, Inc. タグシステムと運⽤用        

  45. © Cygames, Inc. ⼤大規模環境の運⽤用 •  複数サーバのリストの作成 •  複数サーバに並列列にコマンド実⾏行行 •  Jenkinsなどのツールからコマンド実⾏行行

    •  故障機器の排除 •  デプロイ対象から排除, アプリ運⽤用エンジニアと迅速 な連携 •  運⽤用に必要な情報の管理理 •  解析ツールのインストール情報 •  ロードバランサへの組み込み状況
  46. © Cygames, Inc. タグシステムの開発 •  サーバ情報インベントリシステムの開発 •  サーバリストの抽出の簡略略化 •  CLIやAPIでサーバ情報取得

    •  サーバの構築状況を可視化 •  構築ステータス •  デプロイステータス •  任意にタグ情報を付加できる •  事前にスキーマの定義が不不要で運⽤用していく中で情 報を追加・削除できる •  Elasticsearch にサーバ情報を登録
  47. © Cygames, Inc. 登録情報⼀一覧 kibana  登録情報の⼀一覧および統計

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

  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 ] } ] } }
  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
  51. © Cygames, Inc. タグ運⽤用 •  ⼤大規模環境の運⽤用効率率率化 •  デプロイやオペレーションの効率率率化 •  オペミス防⽌止

    •  サーバ情報のテキスト管理理からの脱却 •  ツールとの連動を促進 •  CLIによる対象サーバの情報抽出 •  Rundeck(並列列コマンド実⾏行行) •  Mackerel(監視ツール)
  52. © Cygames, Inc. まとめ   Cygamesインフラが⼤大切切にしていること •  当たり前のことを当たり前にやる •  ボトルネックを作らないシステム設計

    •  枯れた技術を採⽤用し,  安定稼働を⽬目指す •  アプリケーションロジックを抽象化する •  冗⻑⾧長化・分散等のロジックはシステムで吸収, 抽象化 •  他のプロジェクトへの展開を容易易にする •  コア技術は⾃自分たちで実装する