SlideShare una empresa de Scribd logo
1 de 43
Descargar para leer sin conexión
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
Mobageを支える
November 11th, 2014
!
Naotoshi Seo @sonots

DeNA Co., Ltd.
Rubyの技術
~複数DB編~
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
2
自己紹介
・瀬尾 直利 @sonots
・DeNA, Co., Ltd
・インフラの Dev
・Rubyist
・OSS 活動家
・Fluentd コミッタ
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
背景
3
!
Perl の会社と名高いこの DeNA でも
Ruby (on Rails) のプロジェクトが立ち
上がり始めている
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
インフラ要件の壁
4
!
• ホットデプロイ
• カスタムフォーマットのロガー
• デプロイサーバでビルドした gem を web
サーバにアプリコードと共に撒く
• 社内 rubygems ミラー
• Q4M 非同期ジョブキュー
• プロファイリングツール、調査ツール
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
複数DB対応
5
!
• Rails で複数DBに対応する必要性
• 冗長化・高速化
• 既存のインフラの仕組みにのっかる必要性
• 今回はここに特化した話
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
目次
6
!
• DB接続を都度接続に
• クライアントサイドDNSキャッシュ
• DBパスワード一元管理
• DBスキーマ一元管理ツール
• 複数DB接続
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
DB接続を都度接続にすべし
7
要件1
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
DeNAでの複数DB構成
8
!
• MySQL: Master/Slave
• DNSラウンドロビンでSlaveを振り分ける
• MHA で Master の高可用化
• DNS サーバには MyDNS を使用
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
MySQL
Slave 1
MySQL
Slave 2
MySQL
Slave 3
MyDNS
Web
10.1.1.2
10.1.1.3
10.1.1.4
10.1.1.2
sample_r
1回目
| id | zone | name | data | aux |
|----|------|----------|----------|-----|
| 2 | 1 | sample_r | 10.1.1.2 | 100 |
| 3 | 1 | sample_r | 10.1.1.3 | 100 |
| 4 | 1 | sample_r | 10.1.1.4 | 100 |
2回目
Slave参照: DNSラウンドロビン
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
MySQL
Slave 1
MySQL
Slave 2
MySQL
Slave 3
MyDNS
Web
10.1.1.2
10.1.1.3
10.1.1.4
2回目
Slave参照: 永続接続
ずっとココ!!
ダメ!
| id | zone | name | data | aux |
|----|------|----------|----------|-----|
| 2 | 1 | sample_r | 10.1.1.2 | 100 |
| 3 | 1 | sample_r | 10.1.1.3 | 100 |
| 4 | 1 | sample_r | 10.1.1.4 | 100 |
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
MySQL
Slave 1
MySQL
Slave 2
MySQL
Slave 3
MyDNS
Web
10.1.1.2
10.1.1.3
10.1.1.4
10.1.1.3sample_r
2回目
Slave参照: 都度接続
1/3 の確率
| id | zone | name | data | aux |
|----|------|----------|----------|-----|
| 2 | 1 | sample_r | 10.1.1.2 | 100 |
| 3 | 1 | sample_r | 10.1.1.3 | 100 |
| 4 | 1 | sample_r | 10.1.1.4 | 100 |
Good
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
MySQL
Slave 2
MySQL
Slave 3
MySQL
Master 1
MyDNS
Web
10.1.1.2
10.1.1.3
10.1.1.1
10.1.1.4
sample_w
MHA
| id | zone | name | data | aux |
|----|------|----------|----------|-----|
| 1 | 1 | sample_w | 10.1.1.1 | 100 |
| 2 | 1 | sample_r | 10.1.1.2 | 100 |
| 3 | 1 | sample_r | 10.1.1.3 | 100 |
| 4 | 1 | sample_r | 10.1.1.4 | 100 |
MySQL
Slave 1
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
MySQL
Slave 2
MySQL
Slave 3
MySQL
Master 1
MyDNS
Web
10.1.1.2
10.1.1.3
10.1.1.1
10.1.1.4
sample_w
MHA
| id | zone | name | data | aux |
|----|------|----------|----------|-----|
| 1 | 1 | sample_w | 10.1.1.1 | 100 |
| 2 | 1 | sample_w | 10.1.1.2 | 100 |
| 3 | 1 | sample_r | 10.1.1.3 | 100 |
| 4 | 1 | sample_r | 10.1.1.4 | 100 |
MySQL
Master 2
再接続 or
都度接続
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
DBWeb
DBを再起動
restart
再接続 or
都度接続
※ ただし、ActiveRecord の reconnect は正しく動かなかったり
※ そのため、アプリの再起動が必要だったりして、ツライ
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
MySQL
Slave 1
MySQL
Slave 2
MySQL
Slave 3
MyDNS
Web
10.1.1.2
10.1.1.3
10.1.1.4
Slaveダウン検知(check_slave)
| id | zone | name | data | aux |
|----|------|----------|----------|-----|
| 2 | 1 | sample_r | 10.1.1.2 | 100 |
| 3 | 1 | sample_r | 10.1.1.3 | 100 |
| 4 | 1 | sample_r | 10.1.1.4 | 100 |
10.1.1.3sample_r
再接続 or
都度接続
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
すべて都度接続で解決
16
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
しかしActiveRecord
には都度接続オプションがない
17
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
18
なんだってーーーΩΩΩ
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
作りました
19
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
activerecord-
refresh_connection
20
Rack レイヤーでリクエスト毎に接続を切るやつ
1行追加でおk
# config/application.rb
class Application < Rails::Application
config.middleware.swap ActiveRecord::ConnectionAdapters::ConnectionManagement,
"ActiveRecord::ConnectionAdapters::RefreshConnectionManagement"
end
https://github.com/sonots/activerecord-refresh_connection
http://blog.livedoor.jp/sonots/archives/38797925.html
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
クライアントDNSキャッシュ
21
要件2
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
クライアントDNSキャッシュ
22
!
• ruby 実装
• キャッシュしないと名前解決遅い
• 重み0なmasterへのfallback
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
MySQL
Slave 1
MySQL
Slave 2
MySQL
Slave 3
MySQL
Master 1
MyDNS
Web
10.1.1.2
10.1.1.3
10.1.1.1
10.1.1.4
テーブルを
キャッシュ
select
DNSキャッシュ
| id | zone | name | data | aux |
|----|------|----------|----------|-----|
| 1 | 1 | sample_w | 10.1.1.1 | 100 |
| 2 | 1 | sample_r | 10.1.1.2 | 100 |
| 3 | 1 | sample_r | 10.1.1.3 | 100 |
| 4 | 1 | sample_r | 10.1.1.4 | 100 |
10.1.1.2
ファイルに落とす
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
MySQL
Master 2
MySQL
Slave 2
MySQL
Slave 3
MyDNS
Web
10.1.1.2
10.1.1.3
10.1.1.4
重み0へのfallback
| id | zone | name | data | aux |
|----|------|----------|----------|-----|
| 1 | 1 | sample_w | 10.1.1.1 | 100 |
| 2 | 1 | sample_w | 10.1.1.2 | 0 |
| 3 | 1 | sample_r | 10.1.1.3 | 100 |
| 4 | 1 | sample_r | 10.1.1.4 | 100 |
MySQL
Master 1
10.1.1.1
weight:100
weight: 0
DNSプロトコルで引くと重み0のエントリが見えない。
Unbound などのDNSキャッシュを使えない。
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
ResolverMyDNS
25
resolver = ResolverMyDNS.new(
zone: 'mobage.local',!
cache_dir: "cache_dir/",!
host: 'localhost',!
username: 'root',!
passowrd: nil,!
database: 'mydns',!
)!
resolver.get_server 'foo.mobage.local'
#=> 10.1.1.10
MyDNSのテーブルエントリをクライアントサイド
でキャッシュして名前解決するやつ
@Spring_MT
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
26
@ryopeko
これアプリコード内でIPアドレス取得
して establish_connection に渡
す必要あるけど、めんどいよね?
そうすな∼
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
ResolverReplace
27
resolver = ResolverMyDNS.new(...)!
# Resolver を resolver_mydns にすげかえる!
ResolverReplace.load_plugin('mysql2')!
ResolverReplace.register!(!
getaddress: resolver.method(&:get_server),!
getaddresses: resolver.method(:get_server_list),!
error_class: ResolverMyDNS::Error,!
)
Rubyの名前解決を挿げ替えるやつ
https://github.com/sonots/resolver_replace
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
ResolverReplace
28
!
• ぶっちゃけると ruby が持っている
resolv-replace のパクリ
• resolv-replace は ruby の名前解決を
libc から Resolv クラスに置き換えるやつ
• 任意のクラスに置き換えられるように拡張
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
ResolverMyDNS
欲しい人???
29
ResolverReplace は
OSS になってる
https://github.com/sonots/resolver_replace
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
DBパスワード管理
30
要件3
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
DeNAでのDBパスワード管理
31
!
• yaml で一元管理(インフラ管理. アプリ毎に管
理させない)
• DBIx::DBHResolver という perl モジュール
を通して取得する
• stage, sandbox など環境毎にパスワードが違
うが、同じコードで取得できる
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
dbhresolver
32
!
• 既存の yaml を処理して ActiveRecord が受け
取る形式で吐き出してくれる ruby gem
production:
<<: *default
<%= dbh.connect_spec('SAMPLE_R') %>
sample_r_production:
<<: *default
<%= dbh.connect_spec('SAMPLE_R') %>
sample_w_production:
<<: *default
<%= dbh.connect_spec('SAMPLE_W') %>
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
マイグレーション
33
要件4
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
DeNAでのスキーマ管理
34
!
• git レポジトリで一元管理(インフラ管理. アプリ
毎に管理させない)
• SQL::Translator::Diff という perl モ
ジュールを使って実際のDBスキーマとの diff を
とった alter 文を作ってもらいマイグレーション
• ruby である必要はないのでそのまま利用
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
複数DB接続
35
要件5
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
複数DB接続
36
!
• read/write 用モデルそれぞれ作ってゴ
リゴリ実装することもできる
• が、良い仕組みを使って実装を楽にしたい
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
37
ク社どうやってるの?
octopus辛みありそう...
switch_pointという
のがあってだな @sora_h
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
完全に実用段階!!!
38
SwitchPoint
詳しくはeagletmt先生の資料をご参照ください
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
SwitchPoint
39
SwitchPoint.configure do |config|
config.define_switch_point :db1,
readable: :db1_readonly,
writable: :db1_writable,
config.define_switch_point :db2,
readonly: :db2_readonly
end
 
class Book1 < ActiveRecord::Base
use_switch_point :db1
end
 
class Book2 < ActiveRecord::Base
use_switch_point :db2
end
https://github.com/eagletmt/switch_point
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
Adminsbar
40
http://admins.bar/3/
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
まとめ 複数DB編
41
!
• DB接続を都度接続に
• activerecord_refresh_connection
• クライアントサイドDNSキャッシュ
• resolver_mydns / resolver_replace
• DBパスワード一元管理
• DBスキーマ一元管理ツール
• 複数DB対応
• switch_point
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
その他インフラ要件の壁
42
!
• ホットデプロイ
• カスタムフォーマットのロガー
• デプロイサーバでビルドした gem を web
サーバにアプリコードと共に撒く
• 社内 rubygems ミラー
• Q4M 非同期ジョブ
• プロファイリングツール、調査ツール
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.
We're hiring!!
43

Más contenido relacionado

La actualidad más candente

[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティスAmazon Web Services Japan
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介AdvancedTechNight
 
Ingress on Azure Kubernetes Service
Ingress on Azure Kubernetes ServiceIngress on Azure Kubernetes Service
Ingress on Azure Kubernetes ServiceToru Makabe
 
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことyoku0825
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかShogo Wakayama
 
そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?takezoe
 
Sql server のバックアップとリストアの基礎
Sql server のバックアップとリストアの基礎Sql server のバックアップとリストアの基礎
Sql server のバックアップとリストアの基礎Masayuki Ozawa
 
事例で学ぶApache Cassandra
事例で学ぶApache Cassandra事例で学ぶApache Cassandra
事例で学ぶApache CassandraYuki Morishita
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門Tadahiro Ishisaka
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Web Services Japan
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
Snowflake on AWSのターゲットエンドポイントとしての利用
Snowflake on AWSのターゲットエンドポイントとしての利用Snowflake on AWSのターゲットエンドポイントとしての利用
Snowflake on AWSのターゲットエンドポイントとしての利用QlikPresalesJapan
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版Masahiro Tomita
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方Yoshiyasu SAEKI
 
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方歩 柴田
 

La actualidad más candente (20)

[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
 
Ingress on Azure Kubernetes Service
Ingress on Azure Kubernetes ServiceIngress on Azure Kubernetes Service
Ingress on Azure Kubernetes Service
 
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?
 
Sql server のバックアップとリストアの基礎
Sql server のバックアップとリストアの基礎Sql server のバックアップとリストアの基礎
Sql server のバックアップとリストアの基礎
 
事例で学ぶApache Cassandra
事例で学ぶApache Cassandra事例で学ぶApache Cassandra
事例で学ぶApache Cassandra
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
Google Cloud で実践する SRE
Google Cloud で実践する SRE  Google Cloud で実践する SRE
Google Cloud で実践する SRE
 
Snowflake on AWSのターゲットエンドポイントとしての利用
Snowflake on AWSのターゲットエンドポイントとしての利用Snowflake on AWSのターゲットエンドポイントとしての利用
Snowflake on AWSのターゲットエンドポイントとしての利用
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
 

Destacado

HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話Naotoshi Seo
 
データベース技術の羅針盤
データベース技術の羅針盤データベース技術の羅針盤
データベース技術の羅針盤Yoshinori Matsunobu
 
Game BaaS Implemented in Ruby
Game BaaS Implemented in RubyGame BaaS Implemented in Ruby
Game BaaS Implemented in Rubydena_study
 
Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)Yohei Yasukawa
 
Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子Yasuko Ohba
 
さくらのクラウドでh2oのベンチマーク
さくらのクラウドでh2oのベンチマークさくらのクラウドでh2oのベンチマーク
さくらのクラウドでh2oのベンチマークemasaka
 
GoBoLinuxを試した
GoBoLinuxを試したGoBoLinuxを試した
GoBoLinuxを試したemasaka
 
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜Naotoshi Seo
 
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコムResemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコムGo Sueyoshi (a.k.a sue445)
 
Touhou Project on JavaScript
Touhou Project on JavaScriptTouhou Project on JavaScript
Touhou Project on JavaScriptsairoutine
 
JS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲームJS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲームsairoutine
 
Mithril - 軽量/高速なMVCフレームワーク
Mithril - 軽量/高速なMVCフレームワークMithril - 軽量/高速なMVCフレームワーク
Mithril - 軽量/高速なMVCフレームワークsairoutine
 
ガールアックス:リアルタイム通信処理の効率的な実装
ガールアックス:リアルタイム通信処理の効率的な実装ガールアックス:リアルタイム通信処理の効率的な実装
ガールアックス:リアルタイム通信処理の効率的な実装dena_study
 
Next Generation Web Application Architecture
Next Generation Web Application ArchitectureNext Generation Web Application Architecture
Next Generation Web Application ArchitectureKoji SHIMADA
 
これからはじめるCoda2とSublime Text 2
これからはじめるCoda2とSublime Text 2これからはじめるCoda2とSublime Text 2
これからはじめるCoda2とSublime Text 2masaaki komori
 
new Objctive-C literal syntax
new Objctive-C literal syntaxnew Objctive-C literal syntax
new Objctive-C literal syntaxWataru Kimura
 
blogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べblogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べMasahiro Nagano
 
Rubyはとても「人間的」
Rubyはとても「人間的」Rubyはとても「人間的」
Rubyはとても「人間的」Kazuhiro Serizawa
 
本格的に始めるzsh
本格的に始めるzsh本格的に始めるzsh
本格的に始めるzshHideaki Miyake
 

Destacado (20)

HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
 
データベース技術の羅針盤
データベース技術の羅針盤データベース技術の羅針盤
データベース技術の羅針盤
 
Game BaaS Implemented in Ruby
Game BaaS Implemented in RubyGame BaaS Implemented in Ruby
Game BaaS Implemented in Ruby
 
Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)
 
Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子
 
さくらのクラウドでh2oのベンチマーク
さくらのクラウドでh2oのベンチマークさくらのクラウドでh2oのベンチマーク
さくらのクラウドでh2oのベンチマーク
 
GoBoLinuxを試した
GoBoLinuxを試したGoBoLinuxを試した
GoBoLinuxを試した
 
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
 
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコムResemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
 
Touhou Project on JavaScript
Touhou Project on JavaScriptTouhou Project on JavaScript
Touhou Project on JavaScript
 
JS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲームJS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲーム
 
Mithril - 軽量/高速なMVCフレームワーク
Mithril - 軽量/高速なMVCフレームワークMithril - 軽量/高速なMVCフレームワーク
Mithril - 軽量/高速なMVCフレームワーク
 
ガールアックス:リアルタイム通信処理の効率的な実装
ガールアックス:リアルタイム通信処理の効率的な実装ガールアックス:リアルタイム通信処理の効率的な実装
ガールアックス:リアルタイム通信処理の効率的な実装
 
Next Generation Web Application Architecture
Next Generation Web Application ArchitectureNext Generation Web Application Architecture
Next Generation Web Application Architecture
 
これからはじめるCoda2とSublime Text 2
これからはじめるCoda2とSublime Text 2これからはじめるCoda2とSublime Text 2
これからはじめるCoda2とSublime Text 2
 
Sinatraのススメ
SinatraのススメSinatraのススメ
Sinatraのススメ
 
new Objctive-C literal syntax
new Objctive-C literal syntaxnew Objctive-C literal syntax
new Objctive-C literal syntax
 
blogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べblogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べ
 
Rubyはとても「人間的」
Rubyはとても「人間的」Rubyはとても「人間的」
Rubyはとても「人間的」
 
本格的に始めるzsh
本格的に始めるzsh本格的に始めるzsh
本格的に始めるzsh
 

Similar a Mobage を支える Ruby の技術 ~ 複数DB編 ~

Dockerでデプロイ
DockerでデプロイDockerでデプロイ
Dockerでデプロイoshiro_seiya
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでRyo Nakamaru
 
Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築Yo Takezawa
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) Akihiro Kuwano
 
PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合hiboma
 
InfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdbInfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdbNaotoshi Seo
 
コンテナ時代にインフラエンジニアは何をするのか
コンテナ時代にインフラエンジニアは何をするのかコンテナ時代にインフラエンジニアは何をするのか
コンテナ時代にインフラエンジニアは何をするのかgree_tech
 
SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料Koichiro Sasaki
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもんMasahito Zembutsu
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例Shigeru UCHIYAMA
 
RoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するRoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するaktsk
 
Dapr on Kubernetes
Dapr on KubernetesDapr on Kubernetes
Dapr on KubernetesShiho ASA
 
【ヒカラボ】RDS for MySQL → Aurora
【ヒカラボ】RDS for MySQL → Aurora【ヒカラボ】RDS for MySQL → Aurora
【ヒカラボ】RDS for MySQL → AuroraYuki Kanazawa
 
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQLRyusuke Kajiyama
 
HDFS Supportaiblity Improvements
HDFS Supportaiblity ImprovementsHDFS Supportaiblity Improvements
HDFS Supportaiblity ImprovementsCloudera Japan
 
AutoScale×ゲーム ~運用効率化への取り組み~
AutoScale×ゲーム ~運用効率化への取り組み~AutoScale×ゲーム ~運用効率化への取り組み~
AutoScale×ゲーム ~運用効率化への取り組み~Takashi Honda
 

Similar a Mobage を支える Ruby の技術 ~ 複数DB編 ~ (20)

Dockerでデプロイ
DockerでデプロイDockerでデプロイ
Dockerでデプロイ
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 
PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合
 
InfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdbInfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdb
 
Ansible npstudy-shtsuchi
Ansible npstudy-shtsuchiAnsible npstudy-shtsuchi
Ansible npstudy-shtsuchi
 
コンテナ時代にインフラエンジニアは何をするのか
コンテナ時代にインフラエンジニアは何をするのかコンテナ時代にインフラエンジニアは何をするのか
コンテナ時代にインフラエンジニアは何をするのか
 
SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料
 
Tottoruby 20110903
Tottoruby 20110903Tottoruby 20110903
Tottoruby 20110903
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもん
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
 
RoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するRoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理する
 
NATS on VCAP
NATS on VCAPNATS on VCAP
NATS on VCAP
 
Dapr on Kubernetes
Dapr on KubernetesDapr on Kubernetes
Dapr on Kubernetes
 
Amazon ElastiCacheのはじめ方
Amazon ElastiCacheのはじめ方Amazon ElastiCacheのはじめ方
Amazon ElastiCacheのはじめ方
 
【ヒカラボ】RDS for MySQL → Aurora
【ヒカラボ】RDS for MySQL → Aurora【ヒカラボ】RDS for MySQL → Aurora
【ヒカラボ】RDS for MySQL → Aurora
 
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL
 
HDFS Supportaiblity Improvements
HDFS Supportaiblity ImprovementsHDFS Supportaiblity Improvements
HDFS Supportaiblity Improvements
 
AutoScale×ゲーム ~運用効率化への取り組み~
AutoScale×ゲーム ~運用効率化への取り組み~AutoScale×ゲーム ~運用効率化への取り組み~
AutoScale×ゲーム ~運用効率化への取り組み~
 

Más de Naotoshi Seo

Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014Naotoshi Seo
 
Sinatra Pattern 20130415
Sinatra Pattern 20130415Sinatra Pattern 20130415
Sinatra Pattern 20130415Naotoshi Seo
 
Serf という Orchestration ツール #immutableinfra
Serf という Orchestration ツール #immutableinfraSerf という Orchestration ツール #immutableinfra
Serf という Orchestration ツール #immutableinfraNaotoshi Seo
 
Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3Naotoshi Seo
 
Is ruby logger thread(process)-safe? at RubyConf 2013
Is ruby logger thread(process)-safe? at RubyConf 2013Is ruby logger thread(process)-safe? at RubyConf 2013
Is ruby logger thread(process)-safe? at RubyConf 2013Naotoshi Seo
 
Haikanko rubykaigi 20130531
Haikanko rubykaigi 20130531Haikanko rubykaigi 20130531
Haikanko rubykaigi 20130531Naotoshi Seo
 
Fluentdcasual 02-haikanko
Fluentdcasual 02-haikankoFluentdcasual 02-haikanko
Fluentdcasual 02-haikankoNaotoshi Seo
 
capistrano-colorized-stream
capistrano-colorized-streamcapistrano-colorized-stream
capistrano-colorized-streamNaotoshi Seo
 

Más de Naotoshi Seo (11)

Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014
 
Sinatra Pattern 20130415
Sinatra Pattern 20130415Sinatra Pattern 20130415
Sinatra Pattern 20130415
 
Serf という Orchestration ツール #immutableinfra
Serf という Orchestration ツール #immutableinfraSerf という Orchestration ツール #immutableinfra
Serf という Orchestration ツール #immutableinfra
 
Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3
 
Is ruby logger thread(process)-safe? at RubyConf 2013
Is ruby logger thread(process)-safe? at RubyConf 2013Is ruby logger thread(process)-safe? at RubyConf 2013
Is ruby logger thread(process)-safe? at RubyConf 2013
 
Yohoushi
YohoushiYohoushi
Yohoushi
 
Haikanko rubykaigi 20130531
Haikanko rubykaigi 20130531Haikanko rubykaigi 20130531
Haikanko rubykaigi 20130531
 
Mina 20130417
Mina 20130417Mina 20130417
Mina 20130417
 
Fluentdcasual 02-haikanko
Fluentdcasual 02-haikankoFluentdcasual 02-haikanko
Fluentdcasual 02-haikanko
 
capistrano-colorized-stream
capistrano-colorized-streamcapistrano-colorized-stream
capistrano-colorized-stream
 
Ruby test double
Ruby test doubleRuby test double
Ruby test double
 

Último

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Último (9)

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

Mobage を支える Ruby の技術 ~ 複数DB編 ~

  • 1. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Mobageを支える November 11th, 2014 ! Naotoshi Seo @sonots
 DeNA Co., Ltd. Rubyの技術 ~複数DB編~
  • 2. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 2 自己紹介 ・瀬尾 直利 @sonots ・DeNA, Co., Ltd ・インフラの Dev ・Rubyist ・OSS 活動家 ・Fluentd コミッタ
  • 3. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 背景 3 ! Perl の会社と名高いこの DeNA でも Ruby (on Rails) のプロジェクトが立ち 上がり始めている
  • 4. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. インフラ要件の壁 4 ! • ホットデプロイ • カスタムフォーマットのロガー • デプロイサーバでビルドした gem を web サーバにアプリコードと共に撒く • 社内 rubygems ミラー • Q4M 非同期ジョブキュー • プロファイリングツール、調査ツール
  • 5. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 複数DB対応 5 ! • Rails で複数DBに対応する必要性 • 冗長化・高速化 • 既存のインフラの仕組みにのっかる必要性 • 今回はここに特化した話
  • 6. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 目次 6 ! • DB接続を都度接続に • クライアントサイドDNSキャッシュ • DBパスワード一元管理 • DBスキーマ一元管理ツール • 複数DB接続
  • 7. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. DB接続を都度接続にすべし 7 要件1
  • 8. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. DeNAでの複数DB構成 8 ! • MySQL: Master/Slave • DNSラウンドロビンでSlaveを振り分ける • MHA で Master の高可用化 • DNS サーバには MyDNS を使用
  • 9. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. MySQL Slave 1 MySQL Slave 2 MySQL Slave 3 MyDNS Web 10.1.1.2 10.1.1.3 10.1.1.4 10.1.1.2 sample_r 1回目 | id | zone | name | data | aux | |----|------|----------|----------|-----| | 2 | 1 | sample_r | 10.1.1.2 | 100 | | 3 | 1 | sample_r | 10.1.1.3 | 100 | | 4 | 1 | sample_r | 10.1.1.4 | 100 | 2回目 Slave参照: DNSラウンドロビン
  • 10. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. MySQL Slave 1 MySQL Slave 2 MySQL Slave 3 MyDNS Web 10.1.1.2 10.1.1.3 10.1.1.4 2回目 Slave参照: 永続接続 ずっとココ!! ダメ! | id | zone | name | data | aux | |----|------|----------|----------|-----| | 2 | 1 | sample_r | 10.1.1.2 | 100 | | 3 | 1 | sample_r | 10.1.1.3 | 100 | | 4 | 1 | sample_r | 10.1.1.4 | 100 |
  • 11. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. MySQL Slave 1 MySQL Slave 2 MySQL Slave 3 MyDNS Web 10.1.1.2 10.1.1.3 10.1.1.4 10.1.1.3sample_r 2回目 Slave参照: 都度接続 1/3 の確率 | id | zone | name | data | aux | |----|------|----------|----------|-----| | 2 | 1 | sample_r | 10.1.1.2 | 100 | | 3 | 1 | sample_r | 10.1.1.3 | 100 | | 4 | 1 | sample_r | 10.1.1.4 | 100 | Good
  • 12. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. MySQL Slave 2 MySQL Slave 3 MySQL Master 1 MyDNS Web 10.1.1.2 10.1.1.3 10.1.1.1 10.1.1.4 sample_w MHA | id | zone | name | data | aux | |----|------|----------|----------|-----| | 1 | 1 | sample_w | 10.1.1.1 | 100 | | 2 | 1 | sample_r | 10.1.1.2 | 100 | | 3 | 1 | sample_r | 10.1.1.3 | 100 | | 4 | 1 | sample_r | 10.1.1.4 | 100 | MySQL Slave 1
  • 13. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. MySQL Slave 2 MySQL Slave 3 MySQL Master 1 MyDNS Web 10.1.1.2 10.1.1.3 10.1.1.1 10.1.1.4 sample_w MHA | id | zone | name | data | aux | |----|------|----------|----------|-----| | 1 | 1 | sample_w | 10.1.1.1 | 100 | | 2 | 1 | sample_w | 10.1.1.2 | 100 | | 3 | 1 | sample_r | 10.1.1.3 | 100 | | 4 | 1 | sample_r | 10.1.1.4 | 100 | MySQL Master 2 再接続 or 都度接続
  • 14. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. DBWeb DBを再起動 restart 再接続 or 都度接続 ※ ただし、ActiveRecord の reconnect は正しく動かなかったり ※ そのため、アプリの再起動が必要だったりして、ツライ
  • 15. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. MySQL Slave 1 MySQL Slave 2 MySQL Slave 3 MyDNS Web 10.1.1.2 10.1.1.3 10.1.1.4 Slaveダウン検知(check_slave) | id | zone | name | data | aux | |----|------|----------|----------|-----| | 2 | 1 | sample_r | 10.1.1.2 | 100 | | 3 | 1 | sample_r | 10.1.1.3 | 100 | | 4 | 1 | sample_r | 10.1.1.4 | 100 | 10.1.1.3sample_r 再接続 or 都度接続
  • 16. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. すべて都度接続で解決 16
  • 17. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. しかしActiveRecord には都度接続オプションがない 17
  • 18. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 18 なんだってーーーΩΩΩ
  • 19. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 作りました 19
  • 20. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. activerecord- refresh_connection 20 Rack レイヤーでリクエスト毎に接続を切るやつ 1行追加でおk # config/application.rb class Application < Rails::Application config.middleware.swap ActiveRecord::ConnectionAdapters::ConnectionManagement, "ActiveRecord::ConnectionAdapters::RefreshConnectionManagement" end https://github.com/sonots/activerecord-refresh_connection http://blog.livedoor.jp/sonots/archives/38797925.html
  • 21. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. クライアントDNSキャッシュ 21 要件2
  • 22. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. クライアントDNSキャッシュ 22 ! • ruby 実装 • キャッシュしないと名前解決遅い • 重み0なmasterへのfallback
  • 23. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. MySQL Slave 1 MySQL Slave 2 MySQL Slave 3 MySQL Master 1 MyDNS Web 10.1.1.2 10.1.1.3 10.1.1.1 10.1.1.4 テーブルを キャッシュ select DNSキャッシュ | id | zone | name | data | aux | |----|------|----------|----------|-----| | 1 | 1 | sample_w | 10.1.1.1 | 100 | | 2 | 1 | sample_r | 10.1.1.2 | 100 | | 3 | 1 | sample_r | 10.1.1.3 | 100 | | 4 | 1 | sample_r | 10.1.1.4 | 100 | 10.1.1.2 ファイルに落とす
  • 24. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. MySQL Master 2 MySQL Slave 2 MySQL Slave 3 MyDNS Web 10.1.1.2 10.1.1.3 10.1.1.4 重み0へのfallback | id | zone | name | data | aux | |----|------|----------|----------|-----| | 1 | 1 | sample_w | 10.1.1.1 | 100 | | 2 | 1 | sample_w | 10.1.1.2 | 0 | | 3 | 1 | sample_r | 10.1.1.3 | 100 | | 4 | 1 | sample_r | 10.1.1.4 | 100 | MySQL Master 1 10.1.1.1 weight:100 weight: 0 DNSプロトコルで引くと重み0のエントリが見えない。 Unbound などのDNSキャッシュを使えない。
  • 25. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. ResolverMyDNS 25 resolver = ResolverMyDNS.new( zone: 'mobage.local',! cache_dir: "cache_dir/",! host: 'localhost',! username: 'root',! passowrd: nil,! database: 'mydns',! )! resolver.get_server 'foo.mobage.local' #=> 10.1.1.10 MyDNSのテーブルエントリをクライアントサイド でキャッシュして名前解決するやつ @Spring_MT
  • 26. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 26 @ryopeko これアプリコード内でIPアドレス取得 して establish_connection に渡 す必要あるけど、めんどいよね? そうすな∼
  • 27. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. ResolverReplace 27 resolver = ResolverMyDNS.new(...)! # Resolver を resolver_mydns にすげかえる! ResolverReplace.load_plugin('mysql2')! ResolverReplace.register!(! getaddress: resolver.method(&:get_server),! getaddresses: resolver.method(:get_server_list),! error_class: ResolverMyDNS::Error,! ) Rubyの名前解決を挿げ替えるやつ https://github.com/sonots/resolver_replace
  • 28. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. ResolverReplace 28 ! • ぶっちゃけると ruby が持っている resolv-replace のパクリ • resolv-replace は ruby の名前解決を libc から Resolv クラスに置き換えるやつ • 任意のクラスに置き換えられるように拡張
  • 29. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. ResolverMyDNS 欲しい人??? 29 ResolverReplace は OSS になってる https://github.com/sonots/resolver_replace
  • 30. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. DBパスワード管理 30 要件3
  • 31. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. DeNAでのDBパスワード管理 31 ! • yaml で一元管理(インフラ管理. アプリ毎に管 理させない) • DBIx::DBHResolver という perl モジュール を通して取得する • stage, sandbox など環境毎にパスワードが違 うが、同じコードで取得できる
  • 32. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. dbhresolver 32 ! • 既存の yaml を処理して ActiveRecord が受け 取る形式で吐き出してくれる ruby gem production: <<: *default <%= dbh.connect_spec('SAMPLE_R') %> sample_r_production: <<: *default <%= dbh.connect_spec('SAMPLE_R') %> sample_w_production: <<: *default <%= dbh.connect_spec('SAMPLE_W') %>
  • 33. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. マイグレーション 33 要件4
  • 34. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. DeNAでのスキーマ管理 34 ! • git レポジトリで一元管理(インフラ管理. アプリ 毎に管理させない) • SQL::Translator::Diff という perl モ ジュールを使って実際のDBスキーマとの diff を とった alter 文を作ってもらいマイグレーション • ruby である必要はないのでそのまま利用
  • 35. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 複数DB接続 35 要件5
  • 36. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 複数DB接続 36 ! • read/write 用モデルそれぞれ作ってゴ リゴリ実装することもできる • が、良い仕組みを使って実装を楽にしたい
  • 37. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 37 ク社どうやってるの? octopus辛みありそう... switch_pointという のがあってだな @sora_h
  • 38. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. 完全に実用段階!!! 38 SwitchPoint 詳しくはeagletmt先生の資料をご参照ください
  • 39. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. SwitchPoint 39 SwitchPoint.configure do |config| config.define_switch_point :db1, readable: :db1_readonly, writable: :db1_writable, config.define_switch_point :db2, readonly: :db2_readonly end   class Book1 < ActiveRecord::Base use_switch_point :db1 end   class Book2 < ActiveRecord::Base use_switch_point :db2 end https://github.com/eagletmt/switch_point
  • 40. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Adminsbar 40 http://admins.bar/3/
  • 41. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. まとめ 複数DB編 41 ! • DB接続を都度接続に • activerecord_refresh_connection • クライアントサイドDNSキャッシュ • resolver_mydns / resolver_replace • DBパスワード一元管理 • DBスキーマ一元管理ツール • 複数DB対応 • switch_point
  • 42. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. その他インフラ要件の壁 42 ! • ホットデプロイ • カスタムフォーマットのロガー • デプロイサーバでビルドした gem を web サーバにアプリコードと共に撒く • 社内 rubygems ミラー • Q4M 非同期ジョブ • プロファイリングツール、調査ツール
  • 43. Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. We're hiring!! 43