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

C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努Insight Technology, Inc.
 
MySQL 8.0で憶えておいてほしいこと
MySQL 8.0で憶えておいてほしいことMySQL 8.0で憶えておいてほしいこと
MySQL 8.0で憶えておいてほしいことyoku0825
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法yoku0825
 
Akkaで分散システム入門
Akkaで分散システム入門Akkaで分散システム入門
Akkaで分散システム入門Shingo Omura
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)Hironobu Suzuki
 
Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Web Services Japan
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターンSoudai Sone
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テストTakahiro Moteki
 
MySQL 5.7の罠があなたを狙っている
MySQL 5.7の罠があなたを狙っているMySQL 5.7の罠があなたを狙っている
MySQL 5.7の罠があなたを狙っているyoku0825
 
クラウド環境下におけるAPIリトライ設計
クラウド環境下におけるAPIリトライ設計クラウド環境下におけるAPIリトライ設計
クラウド環境下におけるAPIリトライ設計Kouji YAMADA
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方Shohei Koyama
 
インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門Akihiro Kuwano
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座Mikiya Okuno
 
実践!DBベンチマークツールの使い方
実践!DBベンチマークツールの使い方実践!DBベンチマークツールの使い方
実践!DBベンチマークツールの使い方Fujishiro Takuya
 
MySQLレプリケーションあれやこれや
MySQLレプリケーションあれやこれやMySQLレプリケーションあれやこれや
MySQLレプリケーションあれやこれやyoku0825
 
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05都元ダイスケ Miyamoto
 
AWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormationAWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormationAmazon Web Services Japan
 

What's hot (20)

C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
 
MySQL 8.0で憶えておいてほしいこと
MySQL 8.0で憶えておいてほしいことMySQL 8.0で憶えておいてほしいこと
MySQL 8.0で憶えておいてほしいこと
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
 
Akkaで分散システム入門
Akkaで分散システム入門Akkaで分散システム入門
Akkaで分散システム入門
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
 
Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト
 
MySQL 5.7の罠があなたを狙っている
MySQL 5.7の罠があなたを狙っているMySQL 5.7の罠があなたを狙っている
MySQL 5.7の罠があなたを狙っている
 
クラウド環境下におけるAPIリトライ設計
クラウド環境下におけるAPIリトライ設計クラウド環境下におけるAPIリトライ設計
クラウド環境下におけるAPIリトライ設計
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座
 
実践!DBベンチマークツールの使い方
実践!DBベンチマークツールの使い方実践!DBベンチマークツールの使い方
実践!DBベンチマークツールの使い方
 
MySQLレプリケーションあれやこれや
MySQLレプリケーションあれやこれやMySQLレプリケーションあれやこれや
MySQLレプリケーションあれやこれや
 
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
 
AWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormationAWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormation
 

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
 

Viewers also liked (6)

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チューニング
 

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. 全体的なまとめ • 何度も言うけど、とにもかくにもボトルネックの 特定を行う。 • これができれば負荷対策はほぼ完了したよう なもの。 • 「とりあえずサーバ増やしましょう」とかすると ドツボにはまる。