2018年9月21日
1
db tech showcase 2018
MySQL at Yahoo! JAPAN
〜数字で見るヤフーのMySQL基盤の秘密 !?〜
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved
本日のターゲット
• オンプレでDBを運用している方
• DBAとして開発者と向きあっている方
2
自己紹介
• Satoshi Mitani(@mita2)
• データ&サイエンスソリューション統括本部
データプラットフォーム本部 MySQL
• MySQL基盤の立ち上げ〜現在まで 継続して、
DB運用・コンサルティングに従事
3
MySQLチームの業務
• DBクラウドの社内提供
• DB運用・管理
• 質問対応
コンサル
4
Yahoo! JAPANの
データPF
5
Yahoo! JAPAN 利用者数
6
9,000万1日
ユニーク
ブラウザ
※出所:Yahoo! JAPAN社内データ(2018年4月-6月の平均)
提供サービス
Media Search Video Answer Mail
Membership C2C Payment C2C EC B2C EC Local
100を超える多くのサービス
巨大なデータプラットフォーム
8
NoSQL
Object
Storage
DWH
Hadoop
RDB
4100 node
120PB
1800
DBs
300,000
Query/day
23
PB
4000+
nodes
数字で見る
ヤフーのMySQL基盤
の秘密
9
MySQL at Yahoo! JAPAN
10
管理対象
DB数
DB
規模
DB
基盤構成
チーム
人数
問合せ数
MySQL at Yahoo! JAPAN
11
管理対象
DB数
DB
規模
DB
基盤構成
チーム
人数
問合せ数
巨大なデータプラットフォーム
12
NoSQL
Object
Storage
DWH
Hadoop
RDB
4000 node
120PB
1800
DBs
300,000
Query/day
4000+
nodes
23
PB
巨大なデータプラットフォーム
13
NoSQL
Object
Storage
DWH
Hadoop
RDB
300,000
Query/day
4000+
nodes
1600
MySQL
forks
23
PB
4000 node
120PB
データベース多すぎ😵
14
増え続けるDB…
15
414
574
648
868
1107
1410
1654
0
500
1000
1500
2000
2500
2015上期末 2015下期末 2016上期末 2016下期末 2017上期末 2017下期末 現時点
本番DB数 2020年
3000 over
DB増えても売り上げ増えない
DBは年率1.5倍で増えるが…
16
0
500,000
1,000,000
2015 2016 2017
売上高
https://about.yahoo.co.jp/ir/jp/archives/data/ より
運用の大変さ
多種多様なDB >>> 巨大なDB
17
コスト上昇を抑えるために
多種多様なDB >>> 巨大なDB
18
提供機能にメリハリをつける
ことで運用コストを抑える
犠牲にしていること
1. InnoDB以外のストレージエンジン
2. HWの個別選定
• 社内のIaaS 基盤標準HWに従う
3. 複雑なレプリケーション
• 多段、レプリケーションフィルタ
19
大事にしていること
• シンプル・カジュアル
• すぐ使える、簡単に始められる
• セルフ化
• フルマネージド
• 面倒な社内規定の代行
20
Oracle Database
• Oracle Enterprise Edition RAC 11g, 12c
• 250DB
• 主に、ミッションクリティカル用途
• Order made 寄りの運用
• 1DBあたりのDBA比率
• MySQL : Oracle = 1 : 25
21
MySQL at Yahoo! JAPAN
22
管理対象DB数
1600
DB
規模
DB
基盤構成
チーム
人数
問合せ数
MySQL at Yahoo! JAPAN
23
管理対象DB数
1600
DB
規模
DB
基盤構成
チーム
人数
問合せ数
物理容量分布
24
物理容量
バイナリログ除く
物理容量上限
• 上限、500GB
• MySQLはOLTP向けのDB
• ログ系etc は適切なDBの選定を推奨
• スケールアップ/アウトも限られる
• 大規模であれば要シャーディング
25
MySQL at Yahoo! JAPAN
26
管理対象DB数
1600
DBの規模
85%が30G以下
DB
基盤構成
チーム
人数
問合せ数
MySQL at Yahoo! JAPAN
27
管理対象DB数
1600
DBの規模
85%が30G以下
DB
基盤構成
チーム
人数
問合せ数
MySQL 基盤
• 2010年〜
• ノウハウの蓄積、運用品質の向上
• サービス開発者の運用負担軽減
28
大きく分けると2つ
• 2つの世代が稼働中
• 第一世代 / V1
• 第二世代 / Database As A Service
29
大きく分けると2つ
• 2つの世代が稼働中
• 第一世代 / V1
• 第二世代 / Database As A Service
30
第二世代の開発背景
• 納期の大幅短縮・構築の手間削減
• サービス同士のリソース競合をなくす
• メンテナンス影響を最小限にしたい
31
第二世代の構成
マルチライター型 MySQL
第二世代の構成
マルチライター型 MySQL
OpenStack とは
https://www.openstack.org/software/ より
OpenStack
• 2013年からIaaS 基盤として利用
• 12万VMが稼働中
35
MySQL基盤のインフラして採用
OpenStack Trove を選択
• Database As A Service コンポーネント
• 機能
• DBインスタンスの作成
• DBアカウントの管理
• DBの起動・停止
• リサイズ(VMスペック変更)
• etc…
• 対応しているデータストア
• MySQL, MariaDB, Percona, Redis, Cassandra…
36
カスタムした部分 (1)
• WebUI
• スクラッチで開発
• シンプルで使いやすいUI
• 独自の業務要件
• 障害時の連絡先管理機能
• DBアカウントの棚卸し
37
カスタムした部分 (1)
• WebUI
38
カスタムした部分 (2)
• アカウント管理
• root DBアカウントの発行制限
• root のアクセス元制限 etc…
39
Troveのメリ・デメ
40
Troveのよかったところ
• 初期の開発期間を短縮できた
41
Troveのイマイチなところ
• OpenStackは複雑で巨大
• Trove に盛り込めないカスタム
• Trove の開発は最近 停滞ぎみ
42
Percona XtraDB Cluster
マルチライター型
MySQL fork
PXC 概要
• マルチライターのMySQL fork
• Group Replication とほぼ同じ
• 用途
• ビルドイン 高可用性
• Read Scalability
• Disaster Recovery
• スレーブも追加可
44
async
slave
async
slave
Multi Master , Multi Writer ?
マルチマスター マルチライター
Client Client
マルチマスター
• 従来のレプリケーションは非同期
• 同時書込すると・・・
• レプリケーション停止
• データ不整合
46
不整合の具体例
47
マスター1
OK
OK
マスター2
テーブル
変更
Binlog
追記
テーブル
変更
Binlog
追記
ログ適用ログ適用
UPDATE
col1 = 1
col1=1
col1=2
時間 不整合
UPDATE
col1 = 2
マルチライター
• 同時に書き込み可
• 楽観的ロックによる不整合回避
48
いつものロック
いつものロック
• ロックが競合した場合、後続は「待つ」
PXCのロック
51
時間 行の値 トランザクション1 on ノード1 トランザクション2 on ノード2
T1 - mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE grplt.tbl SET col1 = 10,
who_update = ‘A' WHERE pk = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
T2 - mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE grplt.tbl SET col1 = 10,
who_update = ‘B' WHERE pk = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
T3 A mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
(ノード1の更新内容が伝わってくる)
T4 A mysql> COMMIT;
ERROR 1213 (40001): Deadlock found when
trying to get lock; try restarting transaction
PXCのロック
52
時間 行の値 トランザクション1 on ノード1 トランザクション2 on ノード2
T1 - mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE grplt.tbl SET col1 = 10,
who_update = ‘A' WHERE pk = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
T2 - mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE grplt.tbl SET col1 = 10,
who_update = ‘B' WHERE pk = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
T3 A mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
(ノード1の更新内容が伝わってくる)
T4 A mysql> COMMIT;
ERROR 1213 (40001): Deadlock found when
trying to get lock; try restarting transaction
• 異なるノードでロックが競合した場合、「先勝ち」
• デッドロックは必要に応じてリトライ
• LBをSingle-Primaryで運用すれば、従来と同じ挙動に
Multi Master , Multi Writer ?
• 不整合の考慮が必要
• 片方にのみ書込、Active/Standby
• 同時更新で不整合は起こらない
• 容易に高可用性構成が組める
Client Client
Why Percona ?
• 設計当時まだGRは未リリース
• 自動データリカバリ
• State Snapshot Transfer
• 中身はxtrabackupをncで転送
54
PXCの考慮事項
• ALTER TABLEで全更新ブロック
• 要 pt-online-schema-change
• LOCK TABLES, SELECT FOR UPDATE に制限あり
• 更新性能はvanilla MySQLのほうが優れる
• 巨大なトランザクションでメモリを食う
55
課題と解決策
• 納期の大幅短縮・構築の手間削減
• サービス同士のリソース競合をなくす
• メンテナンス影響を最小限にしたい
56
マルチライター
OpenStack
MySQL at Yahoo! JAPAN
57
管理対象DB数
1600
DBの規模
85%が30G以下
DB基盤構成
2世代
チーム
人数
問合せ数
MySQL at Yahoo! JAPAN
58
管理対象DB数
1600
DBの規模
85%が30G以下
DB基盤構成
2世代
チーム
人数
問合せ数
チーム構成
• 約10名
59
チーム内の役割分担
• サービス毎にDB担当をアサイン
• サービス特徴やミッションを理解
60
DBAもなるべく業務知識を
• 例)
• 11/11 → Yahoo! ショッピング
• 台風 → Yahoo! 路線
61
DBAもなるべく業務知識を
• 例)
• 11/11 → Yahoo! ショッピング
• 台風 → Yahoo! 路線
62
DBAもなるべく業務知識を
• 例)
• 台風 → Yahoo! 路線
• 11/11 → Yahoo! ショッピング
63
チーム内の役割分担
• サービス毎にDB担当をアサイン
• DBAも業務知識を持つべき
64
「エスパー」する力 大事
開発者とDBAの
役割分担
65
利用者ができないこと
• 管理者権限の利用
• レプリケーション設定などは
DBAが実施
• DBサーバへのSSH
利用者にまかせていること(1)
• DDLの実行
• SQLレビューはしない
• 「関所」になりたくない
• 困ったときにヘルプ
67
利用者にまかせていること(2)
• 一部の設定変更は許可
sql_mode
max_connections
wait_timeout
max_allowed_packet
max_binlog_files
charset
Etc…
68
MySQL at Yahoo! JAPAN
69
管理対象DB数
1600
DBの規模
85%が30G以下
DB基盤構成
2世代
チーム人数
10名 問合せ数
MySQL at Yahoo! JAPAN
70
管理対象DB数
1600
DBの規模
85%が30G以下
DB基盤構成
2世代
チーム人数
10名 問合せ数
MySQL at Yahoo! JAPAN
71
管理対象DB数
1600
DBの規模
85%が30G以下
DB基盤構成
2世代
チーム人数
10名 20/week
• 開発者は1000〜2000人?
• JIRA Softwareのチケットでやりとり
72
JIRA
73
チャットよりチケットが○
• 雑に質問されがち
• 割り込みになる
• 期待されるレスポンスが短い
• 履歴が共有できない
74
チケット優先度定義
75
よくある問い合わせ
• 接続できない系
• エラーでました系
76
よくある問い合わせ
• 接続できない系
• PaaS, FaaS などの登場により増加
• デバッグ用アプリの提供の必要
77
よくある問い合わせ
• エラーでました系
• エラーの内容が知りたい人
• エラーの修正方法を知りたい人
• エラーが出て不安な人
78
対、人間
• コスト 大
• リソースの半分ぐらい
79
80
啓蒙活動
• 半年に1度セミナー
• グッズを作ったり…
• 一部は公開してます
DBAとうまくやりとりするコツ
(DBAからのお願い)
81
DBAとうまくやりとりするコツ
• 「やってほしい作業」でなく「目的」を伝える
• DB利用者に見えているDBの状態はごく一部
• 経験・情報量の多いDBAに「手段」はまかせる
82
MySQL at Yahoo! JAPAN
83
管理対象DB数
1600
DBの規模
85%が30G以下
DB基盤構成
2世代
チーム人数
10名
問合わせ数
20件/week
まとめの前に…
84
Yahoo! JAPAN のミッション
85
情報技術で
人々や社会の課題を解決する
Yahoo! JAPAN の強み
86
100を超えるサービスから得られる
「マルチビックデータ」
我々は、仲間を募集しています
• 歓迎条件
• DBに精通したスキル
• CI/CD環境下での開発や運用
• DBオペレーションの自動化
• 興味を持って頂いた方は、
twitter: @mita2 までご連絡下さい。
87
Q&A
まとめ
Yahoo! JAPAN のMySQL基盤
• 多種多様なDBを効率良く
扱うことにフォーカス
• Tech Giantに負けないインフラ
を作ってます!
Thank you
明日のMySQL Session
時間 セッション名
09:30- MySQL/PostgreSQL
だけで作る高速あいまい全文検索システム
13:30- 稼働中プロジェクトにおけるMySQLバージョンアップ
14:30- MySQL: 突然全てのスレーブのレプケーションが “unknown
error reading log event on the master “ というエラーで
停止したら
15:30- 5.6から5.7へ、そして更なるサービスの可用性を目指して
17:30- LINEのMySQLの運用について

MySQL at Yahoo! JAPAN #dbts2018