Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
MySQLで高トラフィックに立ち向かう LT大会#2 Takashi Abe Mynet Inc. 01/15 2015
Slide 2
Slide 2 text
前提 InnoDB MySQL以外の話もちょっとします 特定のサービス特性にフォーカスするものではありま せんが、ソーシャルゲームをベースにして話します
Slide 3
Slide 3 text
DBサーバへのトラフィック 参照系クエリ select 更新系クエリ insert, update, delete
Slide 4
Slide 4 text
よくある最小構成
Slide 5
Slide 5 text
参照系への負荷対策
Slide 6
Slide 6 text
スケールアップ 金の弾丸 ioDrive
Slide 7
Slide 7 text
スケールアウト スレーブの追加 MySQLのレプリケーション機能でマスタのデータを複製する キャッシュレイヤの追加 memcached, RedisなどのKVSを利用する 参照性能はRDBに比べて桁違いに良い 参照頻度の高いデータをメインにキャッシュに乗せる カードステータスなどのマスタデータ ユーザのニックネーム
Slide 8
Slide 8 text
スケールアウトした構成
Slide 9
Slide 9 text
更新系への負荷対策
Slide 10
Slide 10 text
スケールアップ 金の弾丸 ioDrive メモリガン積み インメモリならioDriveと同等以上の性能が出る Amazon RDSの場合最大244GBまで拡張可能
Slide 11
Slide 11 text
スケールアウト マスタの分割 DB、テーブルを複数サーバに分割し、クエリに応じて 動的に問合せ先サーバを選択する 分割方式より垂直分割/水平分割がある アプリケーション側での実装が多い
Slide 12
Slide 12 text
垂直分割
Slide 13
Slide 13 text
垂直分割 関係性の薄いデータをそれぞれ異なるDBに分散 接続先DBを変えるだけなので大して実装コストはそれ ほどない、はず (例) ユーザデータ系 ログ系 マスタデータ系
Slide 14
Slide 14 text
垂直分割イメージ
Slide 15
Slide 15 text
水平分割
Slide 16
Slide 16 text
水平分割 複数サーバで同じDBを用意し、キーとなるデータによっ て格納先を分割する DB名から一意に格納先のテーブルを特定出来ないの でサーバ振り分けの実装が重くなりがち キーの余剰、ハッシュ値などによって分割を行う
Slide 17
Slide 17 text
水平分割 分割例 userテーブル、user_idをキーにして分割する user_idを100で割った余剰をテーブル名のサフィック スにする user_00 ~ user_99のテーブルに分割可能 サーバA: user_00 ~ user_49 サーバB: user_50 ~ user_99
Slide 18
Slide 18 text
水平分割イメージ
Slide 19
Slide 19 text
スケールアウトした構成
Slide 20
Slide 20 text
分割するタイミング 設計、制約がきついため途中から分割しようとするのは つらい スモールスタートする場合、最初から分割しておいて分 割された各DBを1台に格納しておく戦略もアリ 分割されてさえいれば、後から別サーバに乗せること も容易になる
Slide 21
Slide 21 text
注意点 異なるDBに格納されるのでjoinが使えなくなる 水平分割の場合 分割すればするほどパフォーマンス低下 串刺しで検索したい時など トランザクションが煩雑になる
Slide 22
Slide 22 text
まとめ
Slide 23
Slide 23 text
参照系 マスタスレーブ+KVSの鉄板構成 後からでもスケールアウトは比較的容易 更新系 垂直、水平分割でマスタへのトラフィックを分散させる 後からスケールアウトするのがつらいのでプロジェク トの始めに方針を検討する