Slide 1

Slide 1 text

playで複数DBする Scalive#1.414 Takashi Abe Mynet Inc. 01/25 2015

Slide 2

Slide 2 text

おまえだれよ @takashabe PHPでソシャゲ作ってます ヘビィボウガン使い HR250 海未ちゃん推し

Slide 3

Slide 3 text

DBサーバのスケールアウトど うしてますか

Slide 4

Slide 4 text

playでMySQLをスケールアウ トする

Slide 5

Slide 5 text

DBサーバのスケールアウト 手法

Slide 6

Slide 6 text

マスタ分割 DB、テーブルを複数サーバに分割し、クエリに応じて動 的に問合せ先サーバを選択する 分割方式より垂直分割/水平分割がある アプリケーション側での実装が多い

Slide 7

Slide 7 text

垂直分割

Slide 8

Slide 8 text

垂直分割 関係性の薄いデータをそれぞれ異なるDBに分散 接続先DBを変えるだけなので大して実装コストはない (例) ユーザデータ系 ログ系 マスタデータ系

Slide 9

Slide 9 text

垂直分割イメージ

Slide 10

Slide 10 text

水平分割

Slide 11

Slide 11 text

水平分割 複数サーバで同じDBを用意し、キーとなるデータによっ て格納先を分割する DB名から一意に格納先のテーブルを特定出来ないの でサーバ振り分けの実装が重くなりがち キーの余剰、ハッシュ値などによって分割を行う

Slide 12

Slide 12 text

水平分割 分割例 userテーブル、user_idをキーにして分割する user_idを100で割った余剰をテーブル名のサフィック スにする user_00 ~ user_99のテーブルに分割可能 サーバA: user_00 ~ user_49 サーバB: user_50 ~ user_99

Slide 13

Slide 13 text

水平分割イメージ

Slide 14

Slide 14 text

playで水平分割する

Slide 15

Slide 15 text

auroraを使う例

Slide 16

Slide 16 text

auroraとは https://github.com/gree/aurora データソース・シャーディング機能 事前に定義したデータソース群とリゾルバによって、 ヒントに応じたデータソースを解決できます テーブル名・シャーディング機能 事前に定義したリゾルバによって、ヒントに応じたテー ブル名を解決できます。

Slide 17

Slide 17 text

テーブル名・シャーディング 機能で水平分割する

Slide 18

Slide 18 text

テーブル構成

Slide 19

Slide 19 text

データ

Slide 20

Slide 20 text

クラスタの定義 (conf/database.conf)

Slide 21

Slide 21 text

DBαʔό܈ͱରԠ͢ΔDB໊(user)Λఆٛ͢Δ クラスタの定義 (conf/database.conf)

Slide 22

Slide 22 text

テーブル名の定義 (conf/database.conf)

Slide 23

Slide 23 text

テーブル名の定義 (conf/database.conf) ෼ׂ͢ΔςʔϒϧͷύλʔϯΛఆٛ͢Δ

Slide 24

Slide 24 text

クラスタの解決 (app/models/DataUser.scala)

Slide 25

Slide 25 text

クラスタの解決 (app/models/DataUser.scala) ͲͷDBαʔόʹͭͳ͛Δ͔ղܾ͢Δ

Slide 26

Slide 26 text

テーブル名の解決 (app/models/DataUser.scala)

Slide 27

Slide 27 text

テーブル名の解決 (app/models/DataUser.scala) ςʔϒϧͷαϑΟοΫεΛղܾ͢Δ

Slide 28

Slide 28 text

demo

Slide 29

Slide 29 text

サンプル https://github.com/takashabe/play-aurora

Slide 30

Slide 30 text

まとめ

Slide 31

Slide 31 text

水平分割つらいのでやらな いほうが良いと思います