Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Rails における

コネクション数と

シャーディングのお話
株式会社 Aiming
エンジニア 土井 英範
About: 土井 英範
• 株式会社 Aiming

開発グループマネージャー

リードソフトウェアエンジニア
• エンジニアになって10年弱
• かかわったゲームタイトル

4本くらいクライアントからサーバまで
全般を経験してきた
• コン...
Rubyist 編
Active Record
水平分割したい
水平分割したい
•際限なく増えていくレコード
•インデックスサイズの増加
•ユーザー増加に伴うクエリ回数の増加
•クエリ性能の低下
User Table
User Table 1 User Table 2 User Table 3
分割基準
Range (ID: 1∼100, 101∼200 …)

List (CountryCode: JP, US …)
Hash ( I...
Q. ActiveRecord で

水平分割ってできるの?
A. 一筋縄にはいかない
Active Record の

コネクションスイッチング
•establish_connection 

というメソッドがありますが
•能動的に接続を確立するためのものではなく

実際の接続は行わない
•指定されたクラスをキーに (クラス・メ...
establish_connection の挙動
•クラス定義の段階で指定するため

スイッチングの用途に使えない
•安直に呼び出して切り替えるのも危険
class User < ActiveRecord::Base
establish_con...
水平分割するための

Gem があります
水平分割に利用できる Gem
•octopus
•https://github.com/tchandy/octopus
•昔ある有名な Gem
•@user = User.using(:shard1).find_by_name( Joao")
•...
水平分割に利用できる Gem
•ActiveRecord::Turntable
•https://github.com/drecom/activerecord-turntable
•高機能
•シャード間で ActiveRecord の id を...
水平分割に利用できる Gem
•Sengiri
•https://github.com/mewlist/sengiri
•ActiveRecordの挙動にあまり手をいれない作り
•低機能、シンプル
•土井の自作
ActiveRecord と

コネクション数の話
too many
connections
見積もり方法
•プロセスベースのサーバならスレッド数は 基本 1
•※コード内に Ruby スレッド処理などがない前提
• Passenger ※Enterprise版だと Thread モデルも可能らしい
•Unicorn
•スレッドベースの...
見積もり方法
•サーバ台数 x プロセス数 x スレッド数
•20台 x 5 process x 2 thread
• = 200 connection
その他
•管理ツールからのコネクション
•バッチ処理・キュー処理からのコネク
ション
•これらも忘れずに接続数として見積もっ
ておく
database.yml
•pool: 5
•プールサイズの設定はスレッドを利用する
際の設定
•unicorn, passenger などのプロセスベー
スのサーバだと1 process に付き 1
connection
水平分割した時の話
•Multi-DB アクセスする場合
•基本的に全てのDBにコネクションが張られると考
えたほうが良い
•5分割したら5つのDBに接続を張る可能性がある
•各 Gem でどのような実装になっているかは未確認
•※Sengir...
DB1 DB2 DB3 DB4 DB5
イメージ
web web
admin bat
コネクション数が増加すると
•MySQLの場合
•http://dev.mysql.com/doc/refman/5.6/ja/thread-
pool-plugin.html
http://www.oracle.com/technetwork/jp/ondemand/database/mysql/mysql-perftun-1484759-ja.pdf
コネクションプーリングの回避
•activerecord-refresh_connection
•https://github.com/sonots/activerecord-refresh_connection
•ardisconnector...
コネクションは切断した
ほうが良いか?
•結論
•RDB側のスレッドプーリングが使えるならコネクション
数の増加については気にする必要は無いのかもしれない
•最大コネクション数は上限を常に意識した設定を行う
Nächste SlideShare
Wird geladen in …5
×

Aiming飲み会 1-rails における
コネクション数と
シャーディングのお話

1.693 Aufrufe

Veröffentlicht am

Rails における
コネクション数と
シャーディングのお話

Veröffentlicht in: Software
  • If you want to download or read this book, copy link or url below in the New tab ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m6jJ5M } .........................................................................................................................
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier

Aiming飲み会 1-rails における
コネクション数と
シャーディングのお話

  1. 1. Rails における
 コネクション数と
 シャーディングのお話 株式会社 Aiming エンジニア 土井 英範
  2. 2. About: 土井 英範 • 株式会社 Aiming
 開発グループマネージャー
 リードソフトウェアエンジニア • エンジニアになって10年弱 • かかわったゲームタイトル
 4本くらいクライアントからサーバまで 全般を経験してきた • コンシューマゲーム、ブラウザゲーム、ス マホのゲーム • サーバ・クライアントプログラム
  3. 3. Rubyist 編
  4. 4. Active Record
  5. 5. 水平分割したい
  6. 6. 水平分割したい •際限なく増えていくレコード •インデックスサイズの増加 •ユーザー増加に伴うクエリ回数の増加 •クエリ性能の低下
  7. 7. User Table User Table 1 User Table 2 User Table 3 分割基準 Range (ID: 1∼100, 101∼200 …)
 List (CountryCode: JP, US …) Hash ( ID mod 3 ) 一つのテーブルを特定のルールで 複数のDBに分散する ↓分割↓
  8. 8. Q. ActiveRecord で
 水平分割ってできるの?
  9. 9. A. 一筋縄にはいかない
  10. 10. Active Record の
 コネクションスイッチング •establish_connection 
 というメソッドがありますが •能動的に接続を確立するためのものではなく
 実際の接続は行わない •指定されたクラスをキーに (クラス・メソッド)
 コネクションプールを作成するだけのもの
  11. 11. establish_connection の挙動 •クラス定義の段階で指定するため
 スイッチングの用途に使えない •安直に呼び出して切り替えるのも危険 class User < ActiveRecord::Base establish_connection :user_db # database.yml で定義されているとする … end
  12. 12. 水平分割するための
 Gem があります
  13. 13. 水平分割に利用できる Gem •octopus •https://github.com/tchandy/octopus •昔ある有名な Gem •@user = User.using(:shard1).find_by_name( Joao") •こんな書き方ができる
  14. 14. 水平分割に利用できる Gem •ActiveRecord::Turntable •https://github.com/drecom/activerecord-turntable •高機能 •シャード間で ActiveRecord の id をキーとして分散できる •自動的にどのシャードでクエリを投げる必要があるかを解決 してくれる
  15. 15. 水平分割に利用できる Gem •Sengiri •https://github.com/mewlist/sengiri •ActiveRecordの挙動にあまり手をいれない作り •低機能、シンプル •土井の自作
  16. 16. ActiveRecord と
 コネクション数の話
  17. 17. too many connections
  18. 18. 見積もり方法 •プロセスベースのサーバならスレッド数は 基本 1 •※コード内に Ruby スレッド処理などがない前提 • Passenger ※Enterprise版だと Thread モデルも可能らしい •Unicorn •スレッドベースのサーバ •Puma (ワーカープロセスも複数設定できる)
  19. 19. 見積もり方法 •サーバ台数 x プロセス数 x スレッド数 •20台 x 5 process x 2 thread • = 200 connection
  20. 20. その他 •管理ツールからのコネクション •バッチ処理・キュー処理からのコネク ション •これらも忘れずに接続数として見積もっ ておく
  21. 21. database.yml •pool: 5 •プールサイズの設定はスレッドを利用する 際の設定 •unicorn, passenger などのプロセスベー スのサーバだと1 process に付き 1 connection
  22. 22. 水平分割した時の話 •Multi-DB アクセスする場合 •基本的に全てのDBにコネクションが張られると考 えたほうが良い •5分割したら5つのDBに接続を張る可能性がある •各 Gem でどのような実装になっているかは未確認 •※Sengiriはつなぎっぱなしになっちゃいます
  23. 23. DB1 DB2 DB3 DB4 DB5 イメージ web web admin bat
  24. 24. コネクション数が増加すると •MySQLの場合 •http://dev.mysql.com/doc/refman/5.6/ja/thread- pool-plugin.html
  25. 25. http://www.oracle.com/technetwork/jp/ondemand/database/mysql/mysql-perftun-1484759-ja.pdf
  26. 26. コネクションプーリングの回避 •activerecord-refresh_connection •https://github.com/sonots/activerecord-refresh_connection •ardisconnector •https://github.com/mewlist/ardisconnector •自作 sengiri と連動
  27. 27. コネクションは切断した ほうが良いか? •結論 •RDB側のスレッドプーリングが使えるならコネクション 数の増加については気にする必要は無いのかもしれない •最大コネクション数は上限を常に意識した設定を行う

×