Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発

 PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発

OSC 2013 Hokkaidoで発表された「PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発」のスライド資料です。

Infiniteloop

July 12, 2023
Tweet

More Decks by Infiniteloop

Other Decks in Programming

Transcript

  1. 自己紹介 ・佐々木 亨基 ・ゆきこ yukicon ・ Twitter:@yukiconEx ・株式会社インフィニットループ所属 ・札幌 MySQL

    勉強会代表 ・ゲームと戦車とお人形さんが好き ・隠居して一日中 MMORPG をして過ごすのが夢 ・超適当 ・のんびりゆったりまいぺーす
  2. ▪ はじめに ・ソーシャルゲーム案件 ・スケーラブル? ▪ 架空戦記 ・ [Ⅰ] の時代 サービス開始

    ・ [Ⅱ] の時代 Web サーバ追加 ・ [Ⅲ] の時代 DB スレーブ追加 ・ [Ⅳ] の時代 垂直分割 ・ [Ⅴ] の時代 水平分割 お題目
  3. ▪ 現状 Web サーバの性能が限界 ピークタイムでは CPU 使用率が常に 100% に近い 1

    台では耐え切れない Web サーバの増強が急務! [Ⅱ] の時代への遷移
  4. -- Web サーバを増やすには ・ LB( ロードバランサ ) の導入 複数の Web

    サーバに振り分けを行う ・セッションを管理するキャッシュサーバを設ける サーバ間を跨いでログインセッションを管理 memcached を使用 ・必須ではないがログサーバも用意 アプリのログを一元管理 syslog を使用 [Ⅱ] の時代への遷移
  5. Web サーバ他を追加 Web Web 3 台 DB 2 台 Cache

    1 台 Log 1 台 Web Web Cache Log LB DB DB [Ⅱ] の時代
  6. ・ Web サーバはどんどん追加可能 ・ Web サーバが 1 台くらい落ちても平気 ただし LB

    から切り離す対応は必要 ・ Cache サーバはセッション以外もキャッシュ可 ・ Cache サーバはバッチサーバとしても使用可 CPU を使う PHP のバッチ処理と メモリを使う memcached は同居しやすい ・ Cache サーバも増やせる ・ Log サーバを立てた事でアプリログは今まで通り これで一安心! [Ⅱ] の時代
  7. DB スレーブを追加 Web Web 3 台 DB 4 台 Cache

    1 台 Log 1 台 Web Web LB DB DB DB DB Cache Log [Ⅲ] の時代
  8. Web と DB スレーブを追加 Web Web 5 台 DB 6

    台 Cache 1 台 Log 1 台 Web Web LB DB DB DB DB Web Web DB DB Cache Log [Ⅲ] の時代
  9. ・ Web サーバや DB スレーブを追加して耐えられる ・単一 DB としての完成形 ・この先は DB

    分割が必須 ・この方式のサーバ群を増やしていくという手もある ブラウザ三国志がその方式 ( 通称ワールド分け方式 ) ワールド間で関わりは持てない ユーザ数増加には新規ワールドをオープンする事で対応 アクティブユーザが減少したらワールドを統合 今度こそ安心? しかしこの案件にワールド分けは許されなかった… [Ⅲ] の時代
  10. DB マスタが限界を迎える Web Web Web LB DB DB DB DB

    Web Web DB DB Cache Log [Ⅲ] の時代
  11. DB 分割 (DB Sharding) [Ⅳ] の時代への遷移 A テーブル B テーブル

    E テーブル F テーブル E テーブル F テーブル E テーブル F テーブル … 垂直分割 ( テーブル単位での分割 ) 水平分割 ( 同テーブルの ID 単位による分割 ) C テーブル D テーブル
  12. 難易度の低い垂直分割を採用! [Ⅳ] の時代への遷移 A テーブル B テーブル E テーブル F

    テーブル E テーブル F テーブル E テーブル F テーブル … 垂直分割 ( テーブル単位での分割 ) 水平分割 ( 同テーブルの ID 単位による分割 ) C テーブル D テーブル
  13. DB を垂直分割 Web Web 5 台 DB 8 台 Cache

    1 台 Log 1 台 Web Web LB DB DB DB DB Web Web Cache Log DB DB DB DB DB1 DB2 [Ⅳ] の時代
  14. DB1 をこれ以上垂直分割するのが難しい! Web Web Web LB DB DB DB DB

    Web Web Cache Log DB DB DB DB DB1 DB2 [Ⅳ] の時代
  15. やるしかない! [Ⅴ] の時代への遷移 A テーブル B テーブル E テーブル F

    テーブル E テーブル F テーブル E テーブル F テーブル … 垂直分割 ( テーブル単位での分割 ) 水平分割 ( 同テーブルの ID 単位による分割 ) C テーブル D テーブル
  16. ユーザデータを水平分割 Web 5 台 DB 12 台 Cache 1 台

    Log 1 台 LB Cache Log DB DB DB DB Global [Ⅴ] の時代 DB DB DB DB User1 DB DB DB DB User2 Web Web Web Web Web
  17. スケールアウト Web 9 台 DB 16 台 Cache 1 台

    Log 1 台 LB Cache Log DB DB DB DB Global [Ⅴ] の時代 DB DB DB DB User1 DB DB DB DB User2 DB DB DB DB User3 Web Web Web Web Web Web Web Web Web
  18. もっとスケールアウト! Web 16 台 DB 20 台 Cache 1 台

    Log 1 台 LB Cache Log [Ⅴ] の時代 DB DB DB DB User1 DB DB DB DB User2 DB DB DB DB User3 Web DB DB DB DB Global DB DB DB DB Event Web Web Web Web Web Web Web Web Web Web Web Web Web Web Web
  19. ・グラフで負荷状況を監視 サーバリソースを確認 munin cacti ・スロークエリログを確認 特に重いクエリを発見 mk-query-digest との組み合わせも効果的 ・ tcpdump

    + mk-query-digest 実行時間は短いが実行回数の多いクエリを発見 ・ MySQL の binlog を解析 更新の多いテーブルを特定 負荷状況の洗い出し
  20. ・スケールアップとスケールアウトは上手く行う 月額 10 万円のサーバ 8 台で運用していたが 実は月額 20 万円のサーバを使えば 3

    台で運用できるなんて事もある ・サーバ台数を試算 性能の差をテスト 現状の負荷状況と照らし合わせる ・実際の導入は段階的に行うと安全 月額 20 万円のサーバ 3 台で賄えそうであっても ひとまず 4 台用意しておいて 負荷状況を確認しながら減らしていく スケールアップとスケールアウト
  21. ・単一 DB の場合 // DB から SELECT $dba->select('user_tbl'); ・ DB

    分割対応後 // グローバル DB から SELECT $dba->gb()->select('user_id_tbl'); // 対象ユーザ ID のデータがある DB から SELECT $dba->user($user_id)->select('user_tbl'); // 複数のユーザ DB から SELECT $dba->user_multi($user_id_arr)->select('user_tbl'); コードの一例
  22. ▪DB 間を跨いだ JOIN ができない ・基本はアプリレベルで結合する事になる ・敢えて冗長なデータの持ち方をするのもあり Global と User で同じデータを持ってしまう

    更新時には必ず両方とも更新する ・特にマスタデータは顕著なので全 DB に持つ マスタデータは Global なデータだが ユーザデータと JOIN したい事が多い 直に SQL を叩いて更新するのは禁止 必ず管理画面、専用スクリプトなどで更新 DB 分割アレコレ
  23. ▪ ちょっとした抽出作業が大変 「レベル上位者 100 人を抽出して」 という感じの依頼に対して SQL で抽出する場合 全 UserDB

    に対して逐次実行 テキストや Excel 表などに手でまとめる というのを毎回やるのは辛い ・専用の管理画面を用意 SQL を投げると SELECT して結果をマージ テーブル表示してくれるだけの画面 DB 分割アレコレ
  24. ▪ 逆に縮小する場合 ・サーバリソースが余っているなら縮小を検討 ・サーバのスペックを落とす ・複数 DB を 1 つのサーバに同居させる サーバ

    A に User1 と User2 サーバ B に User3 と User4 のように配置するとアプリの改修が不用 DB 分割アレコレ