SlideShare a Scribd company logo
1 of 30
MySQLの運用でありがちなこと 
2014/09/09 
Hiroaki Sano
自己紹介 
• NEC soft: 2006/04〜2011/02 
– Java, WebLogic, Apache, Oracle, HP-UX, RHEL 
• CyberAgent: 2011/03〜 
– Apache, MySQL, Some NoSQLs, Intra Automation, 
Hardware Provisioning, CentOS 
• WebSite:https://hiroakis.com/
内容 
• 運用中にありがちなこと 
– MySQLの負荷が高い 
– MySQLのレプリケーションが遅延する
MySQLの負荷が高い
負荷とはなんなのか? 
Application 
MySQL 
Query 
MySQL 
OS 
Hardware(CPU, memory, 
disk, NW) 
Network 
• 負荷とは、システムのどこかに存在するボトルネックのこと 
– アプリケーションロジック, クエリ, MySQL, OS, CPU, Memory, Disk, Network…などなど 
• ボトルネックを特定して、それを解消するのが負荷対策の基本。
ボトルネックを特定する 
• Tools 
– slow log、explain、show engine innodb status, pt-query-digest, innotop…etc 
– munin, cacti, newrelic…etc 
– top, sar, dstat, vmstat, mpstat, iostat…etc
ボトルネックを特定する 
• ソフトウェア層 
– SQL 
– MySQLの設定 
– OS 
• ハードウェア層 
– CPU 
– memory 
– Disk 
– Network
SQL 
• 最も重要 
• ダメなSQLを治したら負荷が劇的に改善されたとかよくある 
• ダメなSQLの特定 
– スロークエリログを見る 
– innotop, pt-query-digest, newrelicなどのツールを活用する 
– Explainで実行計画を見る 
• 対応 
– インデックスを貼りなおす 
– SQLの修正を行う 
– テーブル構造を変える 
– そもそも無駄なクエリは発行しない
SQL 
• SQL自体は問題ないが突然ストールする場合がある 
• ロックの確認 
– show engine innodb status 
– Innotop 
– ロック競合の解析手順 
• 参考:http://d.hatena.ne.jp/sh2/20090618 
• Information_schema.innodb_trx, 
Information_schema.innodb_locks, 
Information_schema.innodb_lock_waits 
• 対応 
– アプリケーションロジックの変更も考慮する 
– ストレージが遅くて待たされている可能性もある
ちょっと寄り道:JOINは遅いのか? 
• Nested loop joinアルゴリズム 
– http://dev.mysql.com/doc/refman/5.6/en/nested-loop-joins.html 
for each row in t1 matching range { 
for each row in t2 matching reference key { 
for each row in t3 { 
if row satisfies join conditions, 
send to client 
} 
} 
} 
• t1でフェッチされるレコード数×t2でフェッチされるレコード数×t3でフェッチされ 
るレコード数のループになる 
• 逆に言えばそれぞれのテーブルでフェッチされるレコード数が少なければJOINは 
遅くはない 
• JOINは適切に使えば有用 
• DB分割に対応しにくくなる、つまりスケーラビリティの確保の面からWeb業界では 
JOIN禁止というところもある
MySQLの設定 
• MySQLの設定そのもので劇的に性能が良くなる 
事はほとんどない(強いて言うなら 
innodb_buffer_pool_size)。 
• たとえばinnodb_io_capacityを10000, 20000, 
40000…と大きくしていっても性能が倍々になる 
わけではない。 
• SQLやハードウェアリソース(後述)の方が負荷の 
原因として支配的になりやすい。 
• 設定の勘所を抑えて、my.cnfが整備されている 
前提でチューニングを行うと良い。
MySQLの設定 
• 性能に効いてくる箇所は下記の表のあたり 
• システム要件に応じて適切に設定する(信頼性を犠牲にして性能を向上させるもの 
もあるので注意) 
• MyISAMは別の設定が効いてくるが今回は割愛 
• ★マークをつけたinnodb_buffer_pool_sizeとinnodb_flush_methodは最も重要 
• innodb_buffer_pool_sizeは物理メモリの7〜8割にする 
• innodb_flush_methodはO_DIRECTにする 
max_connections 
table_open_cache 
sort_buffer_size 
join_buffer_size 
thread_cache_size 
thread_concurrency 
sync_binlog 
innodb_buffer_pool_size(★) 
innodb_log_file_size 
innodb_flush_method(★) 
innodb_thread_concurrency 
innodb_flush_log_at_trx_commit 
innodb_doublewrite 
innodb_support_xa 
innodb_read_io_threads 
innodb_write_io_threads 
innodb_io_capacity
OS 
• 次の箇所を抑える 
– ファイルシステム 
– IOスケジューラ 
– カーネルパラメータ 
• vm.swappiness
OS 
• ファイルシステム/IOスケジューラ 
– ファイルシステム 
• xfs or ext4 
– ファイルシステムのオプション 
• nobarrier, noatime 
– IOスケジューラ(/sys/block/xxx/queue/scheduler) 
• deadline or noop 
– キューサイズ(/sys/block/xxx/queue/nr_requests) 
• MyISAMでは効いてくる
OS 
• IOスケジューラの違いによる性能評価の例 
• 接続数が増えると、IOスケジューラのデフォルトであるcfqでは性能が劣化する 
– ツール:sysbench 
– CPU: Intel(R) Xeon(R) CPU E5620 2.40GHz 
– memory: 8G 
– SAS×4(RAID10) 
– MySQL 5.5.24 InnoDB 
ext4(noatime, nobarrier) xfs(noatime, nobarrier)
OS 
• カーネルパラメータ 
– vm.swappinessを適切にセットしてswapを防ぐ。 
– vm.swappiness=0をセットする事でswapの発生を 
抑えられる。 
– 新しいカーネル(2.6.32-303〜)ではvm.swappiness 
の挙動が変わっているので0 はやめる。 
– 1〜10あたりの、0以外の小さい値にしとくと良い。 
– 参考: 
http://www.percona.com/blog/2014/04/28/oom-relation- 
vm-swappiness0-new-kernel/
ハードウェア 
• CPU, メモリ, Disk IO, Network IOに注目する 
– 一昔前はDisk IOが問題になりがちだった 
– 最近は大容量RAMの低価格化とFlashストレージ 
のコモディティ化(AWSなどはデフォルトでSSDが選 
択される)により、CPUが詰まることもしばしば。 
– HDDを使う場合はライトキャッシュ付きのRAIDコン 
トローラを用いる。 
– sar, vmstat, mpstat, dstat, top, iostatなどよく知ら 
れたLinux系コマンドでプロファイリングできる。
ハードウェア 
• 負荷の箇所とアクセスパターンに応じて対策を行う。 
• 参照系の対策はハードウェアの増設/増強で対応できるので比較的楽。 
• 更新系の対策はマスタ分割が必要。メモリ増設やフラッシュの活用で 
なんとかなる場合もあるが、分割しないとレプリケーション遅延の原因 
にもなる。 
• マスタ分割は参照系負荷の改善にも寄与する。 
• マスタ分割する場合はトランザクション境界や、管理台数が増加する 
ことなどを考慮する必要がある。 
参照系負荷が支配的更新系負荷が支配的 
CPU(user) ・スレーブを増設する・マスタ分割 
Disk IO ・メモリを増やす-> 
innodb_buffer_pool_sizeを増やす 
・フラッシュの活用 
・マスタ分割 
・参照分割 
・メモリを増やす-> 
innodb_buffer_pool_sizeを増やす 
・フラッシュの活用 
・マスタ分割 
Network ・Application <-> MySQL間で巨大すぎるデータのやりとりをしていないか? 
・高速な回線の利用
キャッシュの活用 
• キャッシュの有効活用は負荷対策として非常に効果がある 
• 更新系が多い場合はキャッシュは効きづらい 
• キャッシュを使用した時点で一貫性は崩れるので、アプリケーショ 
ン側で整合性を意識する 
Application 
cache 
MySQL 
Reverse Proxy 
Varnish, 
apache(mod_cache), 
nginx(proxy_cache)…etc 
Application 
cache 
Memcached, 
Redis…etc
負荷対策まとめ 
• SQLのチューニング大事。 
• まずは負荷の箇所(ボトルネック)を特定する。 
• 特定した上で適切な対策を施す。 
• キャッシュは偉大なソリューションだが、一貫 
性に注意する。
レプリケーションが遅延する
MySQLのレプリケーションの仕組み 
Master 
書き込み 
更新系クエリスレッド 
Data Data 
IOスレッド 
Slave 
Binary 
log 
Relay 
log 
SQLスレッド 
• レプリケーションの処理を行うのはIOスレッドとSQLスレッド
遅延の原因として考えられること 
1. SQLスレッドが追いつかない 
2. トランザクションが巨大すぎる 
3. スレーブのDisk IO 
4. スレーブのCPU(user)負荷 
5. Master – Slave間のネットワーク的な問題
SQLスレッドが追いつかない 
• 更新系クエリが多すぎる。 
• マスタはアプリケーションが発行する更新系 
クエリを並列に処理できるが、SQL スレッドは 
1スレッドで動く。 
• マスタ分割を行うことで対応する。
トランザクションが巨大すぎる 
• 巨大テーブルにalter tableしたとき 
– オンラインスキーマチェンジの活用 
– MySQL5.6〜ではオンラインでのalterが可能 
• 大量のレコードを一度に更新したとき 
– バッチなどでたまに見かける 
– トランザクションをこまめに分割する 
• たとえば… 
• ×: 100000レコードを更新-> コミット 
• ○: 1000レコードを更新-> コミットを100回繰り返す
スレーブのDisk IO 
• スレーブのストレージのDisk IOがボトルネック 
• フラッシュストレージを活用してIO待ちを減ら 
す。 
• それでもダメならマスタ分割して更新系クエリ 
を散らす
スレーブのCPU(user)負荷 
• スレーブのCPU負荷が高くてレプリケーション 
の処理が邪魔されるケース 
• スレーブを増設してCPU負荷を散らす
Master – Slave間のネットワーク 
• あまり発生しないが原因にはなりうる 
• 日本– 海外でレプリケーションを組んでいる 
場合など 
• スレーブが多すぎてbinlogの転送がNW帯域 
を圧迫してしまっている場合は孫スレーブを 
作る事を検討する。
遅延対策まとめ 
• 負荷対策と同じく、まずはどこがボトルネック 
なのかを見極める。
全体的なまとめ 
• 何度も言うけど、とにもかくにもボトルネックの 
特定を行う。 
• これができれば負荷対策はほぼ完了したよう 
なもの。 
• 「とりあえずサーバ増やしましょう」とかすると 
ドツボにはまる。

More Related Content

What's hot

iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方歩 柴田
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーyoku0825
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)Hironobu Suzuki
 
バックアップ時の問題から学んだDBエンジニアに必要なスキルとは
バックアップ時の問題から学んだDBエンジニアに必要なスキルとはバックアップ時の問題から学んだDBエンジニアに必要なスキルとは
バックアップ時の問題から学んだDBエンジニアに必要なスキルとはTakeshiYamamoto2049
 
PG-REXで学ぶPacemaker運用の実例
PG-REXで学ぶPacemaker運用の実例PG-REXで学ぶPacemaker運用の実例
PG-REXで学ぶPacemaker運用の実例kazuhcurry
 
さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)Takanori Sejima
 
Innodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライドInnodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライドYasufumi Kinoshita
 
MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介Shinya Sugiyama
 
binary log と 2PC と Group Commit
binary log と 2PC と Group Commitbinary log と 2PC と Group Commit
binary log と 2PC と Group CommitTakanori Sejima
 
MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術yoku0825
 
MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座Mikiya Okuno
 
PacemakerのMaster/Slave構成の基本と事例紹介(DRBD、PostgreSQLレプリケーション) @Open Source Confer...
PacemakerのMaster/Slave構成の基本と事例紹介(DRBD、PostgreSQLレプリケーション) @Open Source Confer...PacemakerのMaster/Slave構成の基本と事例紹介(DRBD、PostgreSQLレプリケーション) @Open Source Confer...
PacemakerのMaster/Slave構成の基本と事例紹介(DRBD、PostgreSQLレプリケーション) @Open Source Confer...Tatsuya Watanabe
 
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#135ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13Uptime Technologies LLC (JP)
 
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...Amazon Web Services Japan
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報Masahiko Sawada
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションMasahiko Sawada
 
MySQL8.0_performance_schema.pptx
MySQL8.0_performance_schema.pptxMySQL8.0_performance_schema.pptx
MySQL8.0_performance_schema.pptxNeoClova
 
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 

What's hot (20)

iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
 
バックアップ時の問題から学んだDBエンジニアに必要なスキルとは
バックアップ時の問題から学んだDBエンジニアに必要なスキルとはバックアップ時の問題から学んだDBエンジニアに必要なスキルとは
バックアップ時の問題から学んだDBエンジニアに必要なスキルとは
 
PG-REXで学ぶPacemaker運用の実例
PG-REXで学ぶPacemaker運用の実例PG-REXで学ぶPacemaker運用の実例
PG-REXで学ぶPacemaker運用の実例
 
いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
 
さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)
 
Innodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライドInnodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライド
 
MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介
 
binary log と 2PC と Group Commit
binary log と 2PC と Group Commitbinary log と 2PC と Group Commit
binary log と 2PC と Group Commit
 
MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術
 
MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座
 
PacemakerのMaster/Slave構成の基本と事例紹介(DRBD、PostgreSQLレプリケーション) @Open Source Confer...
PacemakerのMaster/Slave構成の基本と事例紹介(DRBD、PostgreSQLレプリケーション) @Open Source Confer...PacemakerのMaster/Slave構成の基本と事例紹介(DRBD、PostgreSQLレプリケーション) @Open Source Confer...
PacemakerのMaster/Slave構成の基本と事例紹介(DRBD、PostgreSQLレプリケーション) @Open Source Confer...
 
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#135ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
 
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
MySQL8.0_performance_schema.pptx
MySQL8.0_performance_schema.pptxMySQL8.0_performance_schema.pptx
MySQL8.0_performance_schema.pptx
 
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
 

Viewers also liked

Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Yoshinori Matsunobu
 
MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編Mikiya Okuno
 
MySQLステータスモニタリング
MySQLステータスモニタリングMySQLステータスモニタリング
MySQLステータスモニタリングyoku0825
 
MySQLトラブル解析入門
MySQLトラブル解析入門MySQLトラブル解析入門
MySQLトラブル解析入門Mikiya Okuno
 
MySQLチューニング
MySQLチューニングMySQLチューニング
MySQLチューニングyoku0825
 
MySQL 8.0で憶えておいてほしいこと
MySQL 8.0で憶えておいてほしいことMySQL 8.0で憶えておいてほしいこと
MySQL 8.0で憶えておいてほしいことyoku0825
 

Viewers also liked (7)

Rds徹底入門
Rds徹底入門Rds徹底入門
Rds徹底入門
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
 
MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編
 
MySQLステータスモニタリング
MySQLステータスモニタリングMySQLステータスモニタリング
MySQLステータスモニタリング
 
MySQLトラブル解析入門
MySQLトラブル解析入門MySQLトラブル解析入門
MySQLトラブル解析入門
 
MySQLチューニング
MySQLチューニングMySQLチューニング
MySQLチューニング
 
MySQL 8.0で憶えておいてほしいこと
MySQL 8.0で憶えておいてほしいことMySQL 8.0で憶えておいてほしいこと
MySQL 8.0で憶えておいてほしいこと
 

Similar to MySQLの運用でありがちなこと

初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなしOonishi Takaaki
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニックinfinite_loop
 
Azure Synapse Analytics 専用SQL Poolベストプラクティス
Azure Synapse Analytics 専用SQL PoolベストプラクティスAzure Synapse Analytics 専用SQL Poolベストプラクティス
Azure Synapse Analytics 専用SQL PoolベストプラクティスMicrosoft
 
Amazon Aurora Deep Dive (db tech showcase 2016)
Amazon Aurora Deep Dive (db tech showcase 2016)Amazon Aurora Deep Dive (db tech showcase 2016)
Amazon Aurora Deep Dive (db tech showcase 2016)Amazon Web Services Japan
 
ポスト・ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ポスト・ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)ポスト・ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ポスト・ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)NTT DATA Technology & Innovation
 
Guide to Cassandra for Production Deployments
Guide to Cassandra for Production DeploymentsGuide to Cassandra for Production Deployments
Guide to Cassandra for Production Deploymentssmdkk
 
[DI15] Build 2017 Updates ~ Azure Database for MySQL/PostgreSQL 最速紹介
[DI15] Build 2017 Updates ~ Azure Database for MySQL/PostgreSQL 最速紹介[DI15] Build 2017 Updates ~ Azure Database for MySQL/PostgreSQL 最速紹介
[DI15] Build 2017 Updates ~ Azure Database for MySQL/PostgreSQL 最速紹介de:code 2017
 
ioMemoryとAtomic Writeによるデータベース高速化
ioMemoryとAtomic Writeによるデータベース高速化ioMemoryとAtomic Writeによるデータベース高速化
ioMemoryとAtomic Writeによるデータベース高速化IIJ
 
もうSQLとNoSQLを選ぶ必要はない!? ~両者を備えたスケールアウトデータベースGridDB~
もうSQLとNoSQLを選ぶ必要はない!? ~両者を備えたスケールアウトデータベースGridDB~もうSQLとNoSQLを選ぶ必要はない!? ~両者を備えたスケールアウトデータベースGridDB~
もうSQLとNoSQLを選ぶ必要はない!? ~両者を備えたスケールアウトデータベースGridDB~griddb
 
C32 DB Performance on Cloud by 安藤賀章
C32 DB Performance on Cloud by 安藤賀章C32 DB Performance on Cloud by 安藤賀章
C32 DB Performance on Cloud by 安藤賀章Insight Technology, Inc.
 
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例terurou
 
[INSIGHT OUT 2011] B27 SQL Anywhereの先進のセルフヒーリング技術について(glenn paulley)
[INSIGHT OUT 2011] B27 SQL Anywhereの先進のセルフヒーリング技術について(glenn paulley)[INSIGHT OUT 2011] B27 SQL Anywhereの先進のセルフヒーリング技術について(glenn paulley)
[INSIGHT OUT 2011] B27 SQL Anywhereの先進のセルフヒーリング技術について(glenn paulley)Insight Technology, Inc.
 
マイニング探検会#10
マイニング探検会#10マイニング探検会#10
マイニング探検会#10Yoji Kiyota
 
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06Mikiya Okuno
 
【ウェブ セミナー】AI 時代のクラウド データ ウェアハウス Azure SQL Data Warehouse [実践編]
【ウェブ セミナー】AI 時代のクラウド データ ウェアハウス Azure SQL Data Warehouse [実践編]【ウェブ セミナー】AI 時代のクラウド データ ウェアハウス Azure SQL Data Warehouse [実践編]
【ウェブ セミナー】AI 時代のクラウド データ ウェアハウス Azure SQL Data Warehouse [実践編]Hideo Takagi
 
スケーラブルMoodle@Moodle Moot 2017JP
スケーラブルMoodle@Moodle Moot 2017JPスケーラブルMoodle@Moodle Moot 2017JP
スケーラブルMoodle@Moodle Moot 2017JPTakeshi Matsuzaki
 
SQL Azure のシームレスな管理
SQL Azure のシームレスな管理SQL Azure のシームレスな管理
SQL Azure のシームレスな管理junichi anno
 

Similar to MySQLの運用でありがちなこと (20)

BP Study #16
BP Study #16BP Study #16
BP Study #16
 
初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
 
Azure Synapse Analytics 専用SQL Poolベストプラクティス
Azure Synapse Analytics 専用SQL PoolベストプラクティスAzure Synapse Analytics 専用SQL Poolベストプラクティス
Azure Synapse Analytics 専用SQL Poolベストプラクティス
 
Amazon Aurora Deep Dive (db tech showcase 2016)
Amazon Aurora Deep Dive (db tech showcase 2016)Amazon Aurora Deep Dive (db tech showcase 2016)
Amazon Aurora Deep Dive (db tech showcase 2016)
 
ポスト・ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ポスト・ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)ポスト・ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ポスト・ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)
 
Guide to Cassandra for Production Deployments
Guide to Cassandra for Production DeploymentsGuide to Cassandra for Production Deployments
Guide to Cassandra for Production Deployments
 
[DI15] Build 2017 Updates ~ Azure Database for MySQL/PostgreSQL 最速紹介
[DI15] Build 2017 Updates ~ Azure Database for MySQL/PostgreSQL 最速紹介[DI15] Build 2017 Updates ~ Azure Database for MySQL/PostgreSQL 最速紹介
[DI15] Build 2017 Updates ~ Azure Database for MySQL/PostgreSQL 最速紹介
 
ioMemoryとAtomic Writeによるデータベース高速化
ioMemoryとAtomic Writeによるデータベース高速化ioMemoryとAtomic Writeによるデータベース高速化
ioMemoryとAtomic Writeによるデータベース高速化
 
もうSQLとNoSQLを選ぶ必要はない!? ~両者を備えたスケールアウトデータベースGridDB~
もうSQLとNoSQLを選ぶ必要はない!? ~両者を備えたスケールアウトデータベースGridDB~もうSQLとNoSQLを選ぶ必要はない!? ~両者を備えたスケールアウトデータベースGridDB~
もうSQLとNoSQLを選ぶ必要はない!? ~両者を備えたスケールアウトデータベースGridDB~
 
C32 DB Performance on Cloud by 安藤賀章
C32 DB Performance on Cloud by 安藤賀章C32 DB Performance on Cloud by 安藤賀章
C32 DB Performance on Cloud by 安藤賀章
 
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
 
[INSIGHT OUT 2011] B27 SQL Anywhereの先進のセルフヒーリング技術について(glenn paulley)
[INSIGHT OUT 2011] B27 SQL Anywhereの先進のセルフヒーリング技術について(glenn paulley)[INSIGHT OUT 2011] B27 SQL Anywhereの先進のセルフヒーリング技術について(glenn paulley)
[INSIGHT OUT 2011] B27 SQL Anywhereの先進のセルフヒーリング技術について(glenn paulley)
 
マイニング探検会#10
マイニング探検会#10マイニング探検会#10
マイニング探検会#10
 
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
 
【ウェブ セミナー】AI 時代のクラウド データ ウェアハウス Azure SQL Data Warehouse [実践編]
【ウェブ セミナー】AI 時代のクラウド データ ウェアハウス Azure SQL Data Warehouse [実践編]【ウェブ セミナー】AI 時代のクラウド データ ウェアハウス Azure SQL Data Warehouse [実践編]
【ウェブ セミナー】AI 時代のクラウド データ ウェアハウス Azure SQL Data Warehouse [実践編]
 
スケーラブルMoodle@Moodle Moot 2017JP
スケーラブルMoodle@Moodle Moot 2017JPスケーラブルMoodle@Moodle Moot 2017JP
スケーラブルMoodle@Moodle Moot 2017JP
 
SQL Azure のシームレスな管理
SQL Azure のシームレスな管理SQL Azure のシームレスな管理
SQL Azure のシームレスな管理
 
Reflex works20120818 1
Reflex works20120818 1Reflex works20120818 1
Reflex works20120818 1
 
ヤフーを支えるフラッシュストレージ
ヤフーを支えるフラッシュストレージヤフーを支えるフラッシュストレージ
ヤフーを支えるフラッシュストレージ
 

MySQLの運用でありがちなこと

  • 2. 自己紹介 • NEC soft: 2006/04〜2011/02 – Java, WebLogic, Apache, Oracle, HP-UX, RHEL • CyberAgent: 2011/03〜 – Apache, MySQL, Some NoSQLs, Intra Automation, Hardware Provisioning, CentOS • WebSite:https://hiroakis.com/
  • 3. 内容 • 運用中にありがちなこと – MySQLの負荷が高い – MySQLのレプリケーションが遅延する
  • 5. 負荷とはなんなのか? Application MySQL Query MySQL OS Hardware(CPU, memory, disk, NW) Network • 負荷とは、システムのどこかに存在するボトルネックのこと – アプリケーションロジック, クエリ, MySQL, OS, CPU, Memory, Disk, Network…などなど • ボトルネックを特定して、それを解消するのが負荷対策の基本。
  • 6. ボトルネックを特定する • Tools – slow log、explain、show engine innodb status, pt-query-digest, innotop…etc – munin, cacti, newrelic…etc – top, sar, dstat, vmstat, mpstat, iostat…etc
  • 7. ボトルネックを特定する • ソフトウェア層 – SQL – MySQLの設定 – OS • ハードウェア層 – CPU – memory – Disk – Network
  • 8. SQL • 最も重要 • ダメなSQLを治したら負荷が劇的に改善されたとかよくある • ダメなSQLの特定 – スロークエリログを見る – innotop, pt-query-digest, newrelicなどのツールを活用する – Explainで実行計画を見る • 対応 – インデックスを貼りなおす – SQLの修正を行う – テーブル構造を変える – そもそも無駄なクエリは発行しない
  • 9. SQL • SQL自体は問題ないが突然ストールする場合がある • ロックの確認 – show engine innodb status – Innotop – ロック競合の解析手順 • 参考:http://d.hatena.ne.jp/sh2/20090618 • Information_schema.innodb_trx, Information_schema.innodb_locks, Information_schema.innodb_lock_waits • 対応 – アプリケーションロジックの変更も考慮する – ストレージが遅くて待たされている可能性もある
  • 10. ちょっと寄り道:JOINは遅いのか? • Nested loop joinアルゴリズム – http://dev.mysql.com/doc/refman/5.6/en/nested-loop-joins.html for each row in t1 matching range { for each row in t2 matching reference key { for each row in t3 { if row satisfies join conditions, send to client } } } • t1でフェッチされるレコード数×t2でフェッチされるレコード数×t3でフェッチされ るレコード数のループになる • 逆に言えばそれぞれのテーブルでフェッチされるレコード数が少なければJOINは 遅くはない • JOINは適切に使えば有用 • DB分割に対応しにくくなる、つまりスケーラビリティの確保の面からWeb業界では JOIN禁止というところもある
  • 11. MySQLの設定 • MySQLの設定そのもので劇的に性能が良くなる 事はほとんどない(強いて言うなら innodb_buffer_pool_size)。 • たとえばinnodb_io_capacityを10000, 20000, 40000…と大きくしていっても性能が倍々になる わけではない。 • SQLやハードウェアリソース(後述)の方が負荷の 原因として支配的になりやすい。 • 設定の勘所を抑えて、my.cnfが整備されている 前提でチューニングを行うと良い。
  • 12. MySQLの設定 • 性能に効いてくる箇所は下記の表のあたり • システム要件に応じて適切に設定する(信頼性を犠牲にして性能を向上させるもの もあるので注意) • MyISAMは別の設定が効いてくるが今回は割愛 • ★マークをつけたinnodb_buffer_pool_sizeとinnodb_flush_methodは最も重要 • innodb_buffer_pool_sizeは物理メモリの7〜8割にする • innodb_flush_methodはO_DIRECTにする max_connections table_open_cache sort_buffer_size join_buffer_size thread_cache_size thread_concurrency sync_binlog innodb_buffer_pool_size(★) innodb_log_file_size innodb_flush_method(★) innodb_thread_concurrency innodb_flush_log_at_trx_commit innodb_doublewrite innodb_support_xa innodb_read_io_threads innodb_write_io_threads innodb_io_capacity
  • 13. OS • 次の箇所を抑える – ファイルシステム – IOスケジューラ – カーネルパラメータ • vm.swappiness
  • 14. OS • ファイルシステム/IOスケジューラ – ファイルシステム • xfs or ext4 – ファイルシステムのオプション • nobarrier, noatime – IOスケジューラ(/sys/block/xxx/queue/scheduler) • deadline or noop – キューサイズ(/sys/block/xxx/queue/nr_requests) • MyISAMでは効いてくる
  • 15. OS • IOスケジューラの違いによる性能評価の例 • 接続数が増えると、IOスケジューラのデフォルトであるcfqでは性能が劣化する – ツール:sysbench – CPU: Intel(R) Xeon(R) CPU E5620 2.40GHz – memory: 8G – SAS×4(RAID10) – MySQL 5.5.24 InnoDB ext4(noatime, nobarrier) xfs(noatime, nobarrier)
  • 16. OS • カーネルパラメータ – vm.swappinessを適切にセットしてswapを防ぐ。 – vm.swappiness=0をセットする事でswapの発生を 抑えられる。 – 新しいカーネル(2.6.32-303〜)ではvm.swappiness の挙動が変わっているので0 はやめる。 – 1〜10あたりの、0以外の小さい値にしとくと良い。 – 参考: http://www.percona.com/blog/2014/04/28/oom-relation- vm-swappiness0-new-kernel/
  • 17. ハードウェア • CPU, メモリ, Disk IO, Network IOに注目する – 一昔前はDisk IOが問題になりがちだった – 最近は大容量RAMの低価格化とFlashストレージ のコモディティ化(AWSなどはデフォルトでSSDが選 択される)により、CPUが詰まることもしばしば。 – HDDを使う場合はライトキャッシュ付きのRAIDコン トローラを用いる。 – sar, vmstat, mpstat, dstat, top, iostatなどよく知ら れたLinux系コマンドでプロファイリングできる。
  • 18. ハードウェア • 負荷の箇所とアクセスパターンに応じて対策を行う。 • 参照系の対策はハードウェアの増設/増強で対応できるので比較的楽。 • 更新系の対策はマスタ分割が必要。メモリ増設やフラッシュの活用で なんとかなる場合もあるが、分割しないとレプリケーション遅延の原因 にもなる。 • マスタ分割は参照系負荷の改善にも寄与する。 • マスタ分割する場合はトランザクション境界や、管理台数が増加する ことなどを考慮する必要がある。 参照系負荷が支配的更新系負荷が支配的 CPU(user) ・スレーブを増設する・マスタ分割 Disk IO ・メモリを増やす-> innodb_buffer_pool_sizeを増やす ・フラッシュの活用 ・マスタ分割 ・参照分割 ・メモリを増やす-> innodb_buffer_pool_sizeを増やす ・フラッシュの活用 ・マスタ分割 Network ・Application <-> MySQL間で巨大すぎるデータのやりとりをしていないか? ・高速な回線の利用
  • 19. キャッシュの活用 • キャッシュの有効活用は負荷対策として非常に効果がある • 更新系が多い場合はキャッシュは効きづらい • キャッシュを使用した時点で一貫性は崩れるので、アプリケーショ ン側で整合性を意識する Application cache MySQL Reverse Proxy Varnish, apache(mod_cache), nginx(proxy_cache)…etc Application cache Memcached, Redis…etc
  • 20. 負荷対策まとめ • SQLのチューニング大事。 • まずは負荷の箇所(ボトルネック)を特定する。 • 特定した上で適切な対策を施す。 • キャッシュは偉大なソリューションだが、一貫 性に注意する。
  • 22. MySQLのレプリケーションの仕組み Master 書き込み 更新系クエリスレッド Data Data IOスレッド Slave Binary log Relay log SQLスレッド • レプリケーションの処理を行うのはIOスレッドとSQLスレッド
  • 23. 遅延の原因として考えられること 1. SQLスレッドが追いつかない 2. トランザクションが巨大すぎる 3. スレーブのDisk IO 4. スレーブのCPU(user)負荷 5. Master – Slave間のネットワーク的な問題
  • 24. SQLスレッドが追いつかない • 更新系クエリが多すぎる。 • マスタはアプリケーションが発行する更新系 クエリを並列に処理できるが、SQL スレッドは 1スレッドで動く。 • マスタ分割を行うことで対応する。
  • 25. トランザクションが巨大すぎる • 巨大テーブルにalter tableしたとき – オンラインスキーマチェンジの活用 – MySQL5.6〜ではオンラインでのalterが可能 • 大量のレコードを一度に更新したとき – バッチなどでたまに見かける – トランザクションをこまめに分割する • たとえば… • ×: 100000レコードを更新-> コミット • ○: 1000レコードを更新-> コミットを100回繰り返す
  • 26. スレーブのDisk IO • スレーブのストレージのDisk IOがボトルネック • フラッシュストレージを活用してIO待ちを減ら す。 • それでもダメならマスタ分割して更新系クエリ を散らす
  • 27. スレーブのCPU(user)負荷 • スレーブのCPU負荷が高くてレプリケーション の処理が邪魔されるケース • スレーブを増設してCPU負荷を散らす
  • 28. Master – Slave間のネットワーク • あまり発生しないが原因にはなりうる • 日本– 海外でレプリケーションを組んでいる 場合など • スレーブが多すぎてbinlogの転送がNW帯域 を圧迫してしまっている場合は孫スレーブを 作る事を検討する。
  • 30. 全体的なまとめ • 何度も言うけど、とにもかくにもボトルネックの 特定を行う。 • これができれば負荷対策はほぼ完了したよう なもの。 • 「とりあえずサーバ増やしましょう」とかすると ドツボにはまる。