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

playで複数DBする

9318744519d282ae40e352e6a1b79b2a?s=47 takashabe
January 24, 2015

 playで複数DBする

http://scalive.connpass.com/event/10643/
で話した内容です

9318744519d282ae40e352e6a1b79b2a?s=128

takashabe

January 24, 2015
Tweet

Transcript

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

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

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

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

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

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

  7. 垂直分割

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

  9. 垂直分割イメージ

  10. 水平分割

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

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

    ~ user_49 サーバB: user_50 ~ user_99
  13. 水平分割イメージ

  14. playで水平分割する

  15. auroraを使う例

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

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

  18. テーブル構成

  19. データ

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

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

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

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

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

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

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

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

  28. demo

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

  30. まとめ

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