38. DB 分割 (DB Sharding)
[Ⅳ] の時代への遷移
A テーブル
B テーブル
E テーブル
F テーブル
E テーブル
F テーブル
E テーブル
F テーブル …
垂直分割
( テーブル単位での分割 )
水平分割
( 同テーブルの ID 単位による分割 )
C テーブル
D テーブル
39. 難易度の低い垂直分割を採用!
[Ⅳ] の時代への遷移
A テーブル
B テーブル
E テーブル
F テーブル
E テーブル
F テーブル
E テーブル
F テーブル …
垂直分割
( テーブル単位での分割 )
水平分割
( 同テーブルの ID 単位による分割 )
C テーブル
D テーブル
51. スケールアウト Web 9 台
DB 16 台
Cache 1 台
Log 1 台LBCache Log
DB
DB DBDB
Global
[Ⅴ] の時代
DB
DB DB DB
User1
DB
DB DB DB
User2
DB
DB DB DB
User3
Web Web Web Web Web WebWeb Web Web
52. もっとスケールアウト! Web 16 台
DB 20 台
Cache 1 台
Log 1 台LBCache Log
[Ⅴ] の時代
DB
DB DB DB
User1
DB
DB DB DB
User2
DB
DB DB DB
User3
Web
DB
DB DB DB
Global
DB
DB DB DB
Event
Web
Web
Web
Web
Web
Web
Web
Web
Web
Web
Web
Web
Web
Web
Web
66. ・単一 DB の場合
// DB から SELECT
$dba->select('user_tbl');
・ DB 分割対応後
// グローバル DB から SELECT
$dba->gb()->select('user_id_tbl');
// 対象ユーザ ID のデータがある DB から SELECT
$dba->user($user_id)->select('user_tbl');
// 複数のユーザ DB から SELECT
$dba->user_multi($user_id_arr)->select('user_tbl');
コードの一例
67. ■DB 間を跨いだ JOIN ができない
・基本はアプリレベルで結合する事になる
・敢えて冗長なデータの持ち方をするのもあり
Global と User で同じデータを持ってしまう
更新時には必ず両方とも更新する
・特にマスタデータは顕著なので全 DB に持つ
マスタデータは Global なデータだが
ユーザデータと JOIN したい事が多い
直に SQL を叩いて更新するのは禁止
必ず管理画面、専用スクリプトなどで更新
DB 分割アレコレ