Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

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

1.689 visualizaciones

Publicado el

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

Publicado en: 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 } .........................................................................................................................
       Responder 
    ¿Estás seguro?    No
    Tu mensaje aparecerá aquí

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側のスレッドプーリングが使えるならコネクション 数の増加については気にする必要は無いのかもしれない •最大コネクション数は上限を常に意識した設定を行う

×