Slide 1

Slide 1 text

© Cygames, Inc. tお

Slide 2

Slide 2 text

© Cygames, Inc.

Slide 3

Slide 3 text

© Cygames, Inc.

Slide 4

Slide 4 text

© Cygames, Inc.

Slide 5

Slide 5 text

© Cygames, Inc.

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

© 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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

© 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回

Slide 17

Slide 17 text

© 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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

© 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処理理実⾏行行

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

© Cygames, Inc. Kibana

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

© Cygames, Inc. Kibana

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

© 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メッセージモデル

Slide 34

Slide 34 text

© 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が必要であり, 管理理が煩雑 •  管理理サーバの冗⻑⾧長性を考慮する必要がある

Slide 35

Slide 35 text

© 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に関係なく分散される •  ⽐比較的容易易に実装が可能でス ケールアウトしやすい •  メッセージキューのボトルネック •  メッセージ・ブロードキャストに よる負荷 •  スケールアウトに限界がある

Slide 36

Slide 36 text

© 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

Slide 37

Slide 37 text

© 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

Slide 38

Slide 38 text

© 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/

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

© 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 ] } ] } }

Slide 50

Slide 50 text

© 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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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