SlideShare a Scribd company logo
MySQLで2億件のシリアルデータと
格闘したチューニングの話
YAPC::Asia Tokyo 2015
Kenji Saito / @saiken3110
自己紹介
・斉藤 健二 Kenji Saito
・@saiken3110
・Java PHP Perl
・Oracle MySQL
今日の内容
MySQLで
2億件のシリアルデータを
つかった話
主にチューニングの話です。
Perlも最後にちょっとでてきます。。
Topic
・システムの概要
・負荷テストした話
・2億件登録したときの話
・updateではまった話
・今後の課題
・まとめ
システムの概要(フロント)
商品購入
シリアル入力
入力
・商品A
・サイズ
商品サイズ選択
登録
XXL ▼
商品シリアル
紐付
利用履歴
システムの概要(バックエンド)
シリアルマスタ
商品名
シリアル数
商品・シリアル紐付け
紐付け
▼
商品シリアル
紐付
2億件!! 1億件!!
・Red Hat 5.6
・Perl 5.20
・MySQL 5.6
DBサーバのインフラ事情①
・CPU 2コア
・メモリ 8G
・ディスク 450G
・/tmp 2G
DBサーバのインフラ事情②
→ 2コア、8G。。。2億件。。。
Topic
・システムの概要
・負荷テストした話
・2億件登録したときの話
・updateではまった話
・今後の課題
・まとめ
□対象テーブル
・シリアルマスタ(2億件)
・商品シリアル紐付(1億件)
□内容
・インデックスを使った検索
・プライマリーキーでの検索
・フルスキャンでの検索
・フルスキャンでのcount
・フルスキャンでのorder by
・insert
・alter table (カラム追加)
負荷テスト
いろいろと問題が・・・
○count に84秒、CPUを80 ~ 95 %使用
→ アプリケーションからは
実行しないため、対応不要とした
○order by や alter で/tmp が枯渇
→ tmp_dir を物理ディスクに変更
→ エラーがでなくなったが、
50Gくらい一時領域を使ってた。。
→ 運用で回避することにした
負荷テスト 結果①
ERROR 3 (HY000) at line 1: Error writing file '/tmp/MY3p25s8' (Errcode: 28 -
No space left on device)
○商品シリアル紐付のデータファイルが28Gに。。
→ パフォーマンスのために、
各レコードで商品情報を持っていたのをやめた
→ 管理用のTBLを作り、
正規化、15G に縮小!
○insertが意外と早い
「LOAD DATA」で3億件の登録が70分
→ 後でいろいろ問題が発生。。
負荷テスト 結果②
Topic
・システムの概要
・負荷テストした話
・2億件登録したときの話
・updateではまった話
・今後の課題
・まとめ
2億件登録したときの話①
シリアルマスタ
商品名
シリアル数
商品・シリアル紐付け
紐付け
▼
商品シリアル
紐付
2億件!! 1億件!!
ココ
負荷テストのときに、3億件が70分で登録できた
実際のデータで2億件登録しようとしたら、、
75時間かかった。。
2億件登録したときの話②
□実行時間の推移
2億件登録したときの話③
※500万件ずつ「LODA DATA」で登録
8000万件から
急激に遅延
□負荷テストのときより遅くなった原因
→ 負荷テストのときはシリアルが連番
実際は、ランダムな数字
→ insert 時にindex の再作成が発生!
□8000万件くらいから急激に遅くなった原因
→ innodb_buffer_pool が枯渇
→ 検証してみた
2億件登録したときの話④
innodb_buffer_pool とinsert①
さすがに75時間を何度もは無理なので、
innodb_buffer_pool_size を10分の1くらいで
試してみた
40時間くらいかけて。。
innodb_buffer_pool とinsert②
innodb_buffer_pool_size を1G、500M、250Mで
10万件のinsert × 100回にかかる時間を計測
250M で実行した場合、
340万件から遅延が発生
500M で実行した場合、
700万件から遅延が発生
innodb_buffer_pool とinsert③
データ量(登録件数)が増加し、
innodb_buffer_pool が枯渇すると、
insert が大幅に遅延し始める。
→ メモリからあふれて、
ディスクI/Oが発生しているため。
→ メモリを増やすことで、
データ量が多くても遅延が発生しない
ついでに、、
主キーがシーケンスなら
インデックスの再構築が
早いんじゃないかと思った
試してみた
再びの40時間。。
主キーとinsert①
主キーをシリアル(ランダムな数字)から
シーケンスに変更して、2億件の登録にかかる時間を比較
○変更前
・主キー:シリアル
・ユニークキー:シーケンス
○変更後
・主キー:シーケンス
・ユニークキー:シリアル
主キーとinsert②
○2億件の登録にかかった時間
75時間 → 30時間に改善!
→ 主キーが連番になったことで、
主キーのインデックス構築にかかる時間が減少
変更前は2億件の登録に
約75時間
変更後は2億件の登録が
約30時間で完了
Topic
・システムの概要
・負荷テストした話
・2億件登録したときの話
・updateではまった話
・今後の課題
・その他 Perlのチューニング
・まとめ
updateではまった話①
シリアルマスタ
商品名
シリアル数
商品・シリアル紐付け
紐付け
▼
商品シリアル
紐付
2億件!! 1億件!!
ココ
負荷テストのときは、
100万件の紐付が74秒だった
お客さんの前でデモしたら、、
1時間かかった
updateではまった話②
updateではまった話③
□アプリケーションの動き
※1回のmaxが 100万件で1万件ごとにコミット
1)シリアルマスタからステータスが
「未使用」のものを取得
2)商品シリアル紐付へ、
入力した商品の情報をつけてシリアルをinsert
3)シリアルマスタのステータスを「使用済み」にupdate
→ 1回のupdate で35秒かかっていた
→ 100万件の場合、35秒×100回!
updateではまった話④
□update が遅かった原因
→ update 時にindex の再構築が発生
→ シリアルがランダムなため、
紐付く主キーの読込みが重い。。
read_buffer_size (16k)ずつ
読み込まれる
紐付く主キーがバラバラなた
め、読込が毎回発生
updateではまった話⑤
□対応
ステータス管理をやめ、
管理テーブルを作成し、
update 自体を不要にした
→ 60分が45秒に改善!
→ インデックスの再構築怖い。。。
そんなこんなで、
なんとか無事リリースできました
よかった
Topic
・システムの概要
・負荷テストした話
・2億件登録したときの話
・updateではまった話
・今後の課題
・その他 Perlのチューニング
・まとめ
今後の課題①
□増分バックアップ
現状mysqldump でフルバックアップ
→ 今後さらにデータが増えてくると、
バイナリログを使った
増分バックアップの方がよさそう
今後の課題②
□データ退避とかパーティショニング
→ 古いシリアルの退避とか、
できれば「xxxx_2015」とか作りたくないので、
うまくパーティションとか使えると。。
Topic
・システムの概要
・負荷テストした話
・2億件登録したときの話
・updateではまった話
・今後の課題
・その他 Perlのチューニング
・まとめ
その他 Perlのチューニング①
□コネクションプーリングっぽいこと
コネクションオブジェクトを
シングルトンにし、1worker 1コネクションを共有
→ コネクション生成のコストをなくした
その他 Perlのチューニング②
□マスタデータをキャッシュ
PSGIサーバ起動時に、メモリにDBのマスタデータを保持
→ worker 内でメモリは共有されるため、
DBアクセスが不要になる
※ただし、「Copy-On-Write」なので、
書き換えようとすると、メモリリークの原因になる
※ただし、マスタデータを変更する場合には、
再起動が必要になるので、
本当はmemcached とかを使った方がよさそう
まとめ①
□innodb_buffer_pool_size は大きい方がいい
□主キーはシーケンスにした方がinsert が早い
□インデックスの再構築は意外とばかにならない
まとめ②
□負荷テスト大事
実際のデータに近いデータでやる
□結局計測してみないとわからないことは多い
→ 効果測定にすごく時間がかかるので、
負荷テストとかは、早めにやる
ありがとうございました!

More Related Content

PDF
Kafka・Storm・ZooKeeperの認証と認可について #kafkajp
PDF
JVMのGCアルゴリズムとチューニング
PDF
Apache Kafka 0.11 の Exactly Once Semantics
PPTX
Ceph アーキテクチャ概説
PDF
Apache Hadoop YARNとマルチテナントにおけるリソース管理
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PDF
MySQLで論理削除と正しく付き合う方法
PDF
イミュータブルデータモデル(世代編)
Kafka・Storm・ZooKeeperの認証と認可について #kafkajp
JVMのGCアルゴリズムとチューニング
Apache Kafka 0.11 の Exactly Once Semantics
Ceph アーキテクチャ概説
Apache Hadoop YARNとマルチテナントにおけるリソース管理
ヤフー社内でやってるMySQLチューニングセミナー大公開
MySQLで論理削除と正しく付き合う方法
イミュータブルデータモデル(世代編)

What's hot (20)

PDF
あなたの知らないPostgreSQL監視の世界
PDF
Webアプリを並行開発する際のマイグレーション戦略
PPTX
MongoDBが遅いときの切り分け方法
PDF
Oracle GoldenGate入門
PDF
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PDF
ブレソルでテラバイト級データのALTERを短時間で終わらせる
PDF
Unified JVM Logging
PDF
WebAssemblyのWeb以外のことぜんぶ話す
PDF
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
PDF
10分で分かるLinuxブロックレイヤ
PPTX
[BurpSuiteJapan]Burp Suite実践編
PDF
YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)
PPTX
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
PDF
爆速クエリエンジン”Presto”を使いたくなる話
PDF
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PPTX
WiredTigerを詳しく説明
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
PPT
Cassandraのしくみ データの読み書き編
PDF
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう 2019年10月31日 放送
PPTX
RDB開発者のためのApache Cassandra データモデリング入門
あなたの知らないPostgreSQL監視の世界
Webアプリを並行開発する際のマイグレーション戦略
MongoDBが遅いときの切り分け方法
Oracle GoldenGate入門
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
ブレソルでテラバイト級データのALTERを短時間で終わらせる
Unified JVM Logging
WebAssemblyのWeb以外のことぜんぶ話す
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
10分で分かるLinuxブロックレイヤ
[BurpSuiteJapan]Burp Suite実践編
YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
爆速クエリエンジン”Presto”を使いたくなる話
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
WiredTigerを詳しく説明
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Cassandraのしくみ データの読み書き編
[Cloud OnAir] Cloud Data Fusion で GCP にデータを集約して素早く分析を開始しよう 2019年10月31日 放送
RDB開発者のためのApache Cassandra データモデリング入門
Ad

Similar to My sqlで2億件のシリアルデータと格闘した話 (10)

KEY
My sql casual_in_fukuoka_vol1
PDF
MySQLを割と一人で300台管理する技術
PDF
Mysql toranomaki
PPTX
20150630_MySQL勉強会
PDF
MySQL 5.5 Update #denatech
PDF
ペパボ de MySQL
PDF
Mysql casual talks vol4
PDF
MySQL at Yahoo! JAPAN #dbts2018
PDF
ioDrive+MySQL勉強会
PDF
Enter the-dolphine
My sql casual_in_fukuoka_vol1
MySQLを割と一人で300台管理する技術
Mysql toranomaki
20150630_MySQL勉強会
MySQL 5.5 Update #denatech
ペパボ de MySQL
Mysql casual talks vol4
MySQL at Yahoo! JAPAN #dbts2018
ioDrive+MySQL勉強会
Enter the-dolphine
Ad

My sqlで2億件のシリアルデータと格闘した話