GREE Tech Conference 2021 で発表された資料です。 https://techcon.gree.jp/2021/session/Session-9
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介株式会社WFS リードエンジニア 藤田貴大
View Slide
• 藤田貴大(ふじた たかひろ)• 所属• 株式会社WFSTechnology Development部Engineering5グループリードエンジニア• 職歴• 組み込みエンジニアとしてネットワーク機器の開発に携わったのち、2012年にグリー入社。インフラ、Webゲーム開発、QAを経て、2017年よりサーバエンジニアとしてネイティブゲームの開発に携わっている。自己紹介2
3はじめに• WFSでは、ゲームサーバとしてGoogle CloudPlatform(GCP)の利用を進めています• 現在GCPを利用してリリースされているタイトルは”シドニアの騎士 掌位ノ絆”• 他にも開発中タイトルが控えています©弐瓶勉・講談社/東亜重工重力祭運営局 © WFS
4本発表の概要• どうしてGCP、GKE、Cloud Spannerを採用したのか• 導入にあたって出た問題にどう対応したのか• 実際につかってみてどうだったのか
5WFSのゲームについて• ソーシャルゲーム• 遊んでいる時は常にゲームサーバと通信している• データがサーバ側にある• 世界展開している• さまざまな国に対してサービスを提供している• サーバ負荷の変動が大きい
6WFSにおけるサーバへの要求• ゲームなので、応答性能はある程度必要• 応答速度はゲームの楽しさに影響がある• サービスを提供する全地域に対してある程度のレイテンシで通信したい• サーバリソースをできるだけ柔軟に変更したい
7ソーシャルゲームのサーバ規模について• リリース直後や人気のイベントの開始などアクセスが集中するタイミングがある• 数倍、10倍、、、• イベントなどは月に数回
8リソース最適化• できるだけ余剰リソースは作りたくない• ゲームを止めたくない(メンテナンス)• サービスを提供したままサーバリソースを調整したい
9いままではどうだったか• ゲームサーバ• 現在はKubernetesに頼っているのでできている• それ以前、VMに直接デプロイしていた頃からオンラインで実施可能• MySQL• メンテナンスが必要• 弊社インフラチームにまかせればオンラインでDBの最適化(マスタ分割/統合など)が可能であるが、数週間の準備が必要• Memcached/Redis• メンテナンスが必要
10GCP導入の理由• レイテンシが短い• Cloud Spannerが使えそうだった• Google Kubernetes Engine
11レイテンシ
12実測したレイテンシ• 他社クラウドを利用したゲームで海外展開する場合は各地域(US、EU、etc…)にサーバを配置している• GCPでは東京リージョンから各地域にサービスを提供できている東京リージョン <-> ブラジル他社 1000msec以上GCP 300msec未満
13さまざまな地域からのレイテンシが短いほうが良い理由• あるいは、サーバの配置場所を選択できた方がいい理由• 1か所に集中していた方が管理がしやすい• リソースの共有も可能• 外部サービスとの連携• WFSの認証・決済システムであるGamelib• 独立したシステムでHTTPSにより通信している• 海外リージョンにサーバを設置するためにGamelibも海外サーバを作ってもらっているゲームサーバ認証・決済システム
14Cloud Spanner
15Cloud Spanner• 水平分割しなくてよい• メンテナンスコストが低い• ランニングコストは高いかもしれない• スプリット分割が難しそう無制限のスケーリング、強整合性、最大 99.999% の可用性を備えたフルマネージド リレーショナル データベースです。● 無制限のスケーリングによって、リレーショナル セマンティクスと SQL のすべてのメリットを享受● 任意のサイズで開始し、ニーズの拡大に応じて制限なしでスケーリング● 計画的ダウンタイムのない、オンラインによるスキーマ変更で高可用性を実現● リージョンや大陸全体にわたる強整合性で高性能のトランザクションを提供● 自動シャーディングなどの機能により手動のタスクを排除し、イノベーションに注力Cloud Spannerhttps://cloud.google.com/spanner/?hl=ja
16Cloud Spannerのコスト• 他社MySQLサービスとの比較• APIサーバに10,000RPSの負荷をかけたときの比較1リクエスト当たりのDBアクセス ノード数 ノードコスト(比率)他社MySQLサービス read:5 update/insert:4 8(※) 1Cloud Spanner read:5 update/insert:4 20 1.3※:実際に必要なノードは4。ただし、障害に備えたスタンバイが必要であるためx2で8。DB ゲームサーバ 負荷測定ツール
17Cloud Spannerのコスト考察• MySQLと比べたとき、スタンバイを考慮に入れるとそこまで大きく差は開かない• Cloud Spannerはスケールアウト/スケールインがオンラインで実施可能であるため、さらにコストダウンの可能性がある
18Cloud Spannerのスプリット分割• リクエスト処理にかなり大きく影響する• 基本的には制御できない• 現在のスプリットの状態がわからない• 予防的に事前に負荷をかけてスプリット分割を促すRPSレイテンシ
19Spanner運用ツール• インフラチームで開発• この後のセッションで詳しい説明がありますので...• 温める君• 事前にスプリット分割を促す• 上げ下げ君• ノード数を自動で制御する
20Google Kubernetes Engine
21Google Kubernetes Engine• 特徴的な機能• Workload Identity• プリエンプティブルインスタンス
22Workload Identity• GKE(Kubernetes)のサービスアカウントとGCPのサービスアカウントを紐づけてGoogle Cloudサービスを利用する権限を管理する方法• GCPのドキュメントでは”推奨される方法”というようになっている• だが、当初は利用できなかった• PHP SDKの問題
23Workload Identity with PHP• PHPのSDKに問題が多かった• PHP側のキャッシュ管理にバグがあった• podがスタートしてから一定時間でCloud Spannerへ通信できなくなる• アクセストークンの有効期限とキャッシュ有効期限が連動していなかった• Google様に連絡して修正していただきました• https://github.com/googleapis/google-auth-library-php/issues/308• 高負荷時、アクセストークンの更新に失敗する• メタデータサーバからのアクセストークンの取得に失敗して空の情報をキャッシュしていた• こちらも、最新のSDKでは解消済み
24プリエンプティブルインスタンスの活用• コスト面で非常に魅力的なので導入したい• ゲームサーバはもともとステートレスなので導入しようと思えばできるのではと考えていた• 実際はそう簡単ではなかった• 突然停止するとエラーになったり、Sidecarで回収しているログが欠損したりするプリエンプティブル VM インスタンスは、標準 VM の料金よりもはるかに低価格(60~91% 割引)で利用できます。ただし、他のタスクがリソースを再利用する必要がある場合、Compute Engine がこのインスタンスを停止(プリエンプト)する可能性があります。プリエンプティブル インスタンスは Compute Engine の余剰のキャパシティを利用する機能であり、使用できるかどうかは利用状況に応じて異なります。プリエンプティブル VM インスタンスhttps://cloud.google.com/compute/docs/instances/preemptible?hl=ja
25GKE version 1.20• 2021/09にStable• Graceful Node Shutdown機能• ApacheがGraceful Shutdownできる• lifecycleのpreStopで後片付けができる• 処理の中断、ログの欠損などが無くなった• Cronjobは工夫が必要• ノードの入れ替えを分散させる工夫を検討中• 複数台同時に入れ替わると良くない• 経験的に24時間で停止するので、そのあたりを調整できたらと考えている
26実際にサービスを提供してみて• Workload Identityを利用したCloud Spannerへのアクセスは順調• 事前のスプリット分割はうまくいって実サービスでスプリット分割の兆候はみられなかった• メンテナンスをせずにサーバリソースの最適化ができている• さまざまな国に対して東京リージョンからサービスを提供できている(世界展開をしている別のゲームで)• プリエンプティブルインスタンスも一部導入できている• ノードの入れ替えを分散させられていない
27まとめ• GKE + Cloud Spannerをつかったゲームを提供することができた• Cloud Spannerはスプリット分割など難しいところもあるが、ツールを充実させるなどして運用可能になった• GKE 1.20になってプリエンプティブルVMがサービスに使えるようになった• PHP SDKは最初バグもあったが問題は解消されてきている
28