負荷がたかいいんだから~♪(仮)
Cygames
サーバーサイドエンジニア 濱田 洋平
自己紹介
濱田洋平
サーバーサイドエンジニア
2010年からCAグループ内の会社で
ソーシャルゲームを作っています。
アジェンダ
1.失敗事例と対応方法
CASE1 memcached
CASE2 DB垂直分割
2.弊社サーバー構成
3.検証中のサーバー構成
4.まとめ
5.伊藤さんより負荷テストの話し
※前職での事例になります。
CASE1 memcached
memcachedとは?
メモリーキャッシュシステムです。
利用方法
DBクエリーの結果をキャッシュして
いました。
CASE1 memcached
MySQL
memcashed
Web Server1
Linux (Cent OS)
PHP
Webサーバーとmemcashedは別ラック
にありました。
CASE1 memcached
障害発生
Webサーバーからmemcashedへの
レイテンシーが悪化
原因
ラック間の通信量が5倍に増えて帯域を
圧迫してました。
CASE1 memcached
MySQLはメモリーにのっていたら早いです
適時キャッシュと使い分けましょう。
サーバーメンテナンス明けの負荷が急激に
上がる場合を想定してユーザーデータを
3秒間キャッシュするだけでもMySQLの
負荷が下がります。
CASE1 memcached
memcashed の分割
ロードバランサー
MySQL
memcashed
Web Server1
memcashed
memcashed
memcashed
Web Server2 Web Server3
1.ローカルとグローバルキャッシュで分割
2.グローバルキャッシュの水平分割
memcashed memcashed
CASE2 DB垂直分割
MySQL
(master)
Web Server1
MySQL
(slave)
masterからslaveにレプリケーション
されます。
masterは書き込みslaveは読みこみ専用に
すれば負荷分散ができる!
CASE2 DB垂直分割
障害発生
レイドイベント中カスタマーサポートから
倒したはずのレイドボスが倒した事に
なってないって問い合わせが着信してます!
原因
レプリケーション遅延が発生していました。
今回はupdateの回数が秒間あたり
普段の○○倍に・・・・
ピークタイムおそろしす
CASE3 DB垂直分割
MySQL0
(master)
Web Server1
MySQL0
(slave)
MySQL1
(master)
MySQL1
(slave)
MySQL2
(master)
MySQL3
(slave)
DBの水平分割
boss_id Hit_point
3 500
6 350
9 400
boss_id%3=格納DB
MySQL0
boss_id Hit_point
1 1000
4 2000
7 300
MySQL1
boss_id Hit_point
2 600
5 400
8 300
MySQL2
トランザクション処理でatomicなデータは
DBを増やして分割しました。
CASE3 DB垂直分割
DBの水平分割時の制約(今回の場合)
joinができなくなります。
スケールしようとするとキーを元にレコード
を再振り分けしなければならない。。
データベース水平分割
構成を纏めると
1.マスターデータなどサーバー間で値が変わらない
データはローカルにキャッシュする
2.クエスト進捗情報などサーバー間で値が変化するデーターは
グローバルキャッシュにキャッシュする
3.トランザクション処理が入りatomicなデーターは水平分割
したDBに格納する。
ロードバランサー
memcashed
Web Server1
memcashed
memcashed
memcashed
Web Server2 Web Server3
MySQL0
(master)
MySQL1
(master)
MySQL2
(master)
memcashed memcashed
こんな構成を検討しています
Web Server1
Linux (Cent OS)
memcashed1
memcashed2
memcashed3
NoSQL NoSQL
memcached
MySQL
(Master)
データベース水平分割 Data Storage Cluster
NoSQL NoSQL
NoSQL NoSQL NoSQL NoSQL
twemproxy
Node.js
Expres4
MySQL
(Master)
MySQL
(Master)
NoSQL
NoSQL(Not only SQL)
リレーショナルデーターベース以外のデーターベースを指します
特徴
・水平分割がしやすい
・データーの取得/格納が高度に最適化している
・リレーションされてない
・トランザクションが苦手(できないものもある)
Hbase MongoDB Cassandra DynamoDB
こんな構成を検討しています
水平分割が必要になるデーターはData Storage Clusterに格納する
atomicな操作が必要なデーターはRDSに格納する
Web Server1
Linux (Cent OS)
memcashed1
memcashed2
memcashed3
NoSQL NoSQL
memcached
MySQL
(Master)
データベース水平分割 Data Storage Cluster
NoSQL NoSQL
NoSQL NoSQL NoSQL NoSQL
twemproxy
Node.js
Expres4
MySQL
(Master)
MySQL
(Master)
まとめ
1.マスターデータなどサーバー間で値が変わらない
データはローカルにキャッシュする
2.クエスト進捗情報などサーバー間で値が変化するデーターは
グローバルキャッシュにキャッシュする
3.トランザクション処理が入りatomicなデーターは水平分割
したDBに格納する。
4.DBのスケールが必要になるデーターはNoSQLに格納する。
5.キャッシュはあくまでキャッシュ使いどころに注意する。
今回ご紹介した事例
リリースしてから障害が発生した例ばかりです・・・
コーディング中に注意していたら・・・
負荷テストをしっかりしていたら防げた事象でもあります。
今回は伊藤さんにも資料を用意してもらったのでここからは
伊藤さんより負荷テストの話をお聞きください。

負荷がたかいいんだから~♪(仮)