MySQL ガチBeginnerがやってみたことと反省したこと

9,276 views
8,956 views

Published on

MySQL Beginners Talk Vol.1
@studio3104 com

0 Comments
23 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,276
On SlideShare
0
From Embeds
0
Number of Embeds
1,859
Actions
Shares
0
Downloads
48
Comments
0
Likes
23
Embeds 0
No embeds

No notes for slide

MySQL ガチBeginnerがやってみたことと反省したこと

  1. 1. Lightning Talk at MySQL Beginners Talk Vol.1 MySQLガチBeginnerが やってみたことと反省したこと Beginner詐欺じゃないよ @studio3104_com
  2. 2. @studio3104_com (Satoshi Suzuki)-- MySQL を本気で使い始めてから1年ちょい。-- LPIC Level2とか無駄に持ってる。-- Ubuntu は8.10から。-- 妻、娘、息子。リア充。-- ソシャゲ、公式サイト、パチ(スロ)ンコ-- こんなのやってます。 →→→→→→→-- PostgreSQLもあるよ。 自己紹介
  3. 3. innodb_buffer_pool_size
  4. 4. 「スロークエリどうにかなんない?」 って言われましたSomeday・・・
  5. 5. どうにかしました。
  6. 6. どのようにしてどうにかしたのかmysqldのチューニング→ 32GBRAMのサーバなのに、innodb_buffer_pool_sizeが 約8GBに設定されていたので、約24GBまで増やした。ダメクエリをEXPLAINして、修正→ そんなことはしていない。 innodb_buffer_pool_sizeを増やしただけ。(え・・・このサーバを構築したのはボクではありません。
  7. 7. どんなクエリが出ていたのか見ていなかった→ 論外。せめてスロークエリログは見るべきだった。→ でもスロークエリと言っても設定次第であるということ。 → long_query_timeとか、log_queries_not_using_indexesどんなクエリだったのか分析していない→ EXPLAINそもそも・・・→ 本当にinnodb_buffer_pool_sizeを増やしただけで改善した と言っていいものなのか。反省点
  8. 8. min_examined_row_limit
  9. 9. 検索効率の悪いクエリをあぶり出したくて、 mysql> set @@global.log_queries_not_using_indexes=1; ってしたのに、 スロークエリログに何も出力されない!クエリチューニングがなんとなくわかってきたところで・・・
  10. 10. 健全なクエリしか流れてないんじゃないの?→ mysql> SELECT * FROM HOGE; → コレが検出されないんですね。mysqldの再起動は?→ 不要。稼働中に変更可能。MySQLのバージョンは?→ 5.1.50→ log_queries_not_using_indexesってバージョン関係あったっけ・・・? 状況は?
  11. 11. MySQLのシステム変数を見てみるmin_examined_row_limit→ mysql> SHOW GLOBAL VARIABLESググる→ 生活の基本。原因は・・・?
  12. 12. http://nippondanji.blogspot.jp/2009/01/mysql-51.htmlmin_examined_row_limit「○○○行以上の行をテーブルから読み込んだクエリをスロークエリログに記録する」という指定ができるようになる。多くの行を読み込むクエリは、潜在的にサーバ全体の性能を劣化させる危険性があるので、long_query_timeを少し大きめにしておいて、このオプションを併用しておくといいだろう。例えばmin_examined_row_limit=10000など。いずれの変数もアプリケーションの特性に合わせて調節して欲しい。原因は!!
  13. 13. --single-transaction
  14. 14. 体力回復アイテムを使ったのに、 「体力がありません」 って出るけどどういうことなの?ユーザからこんな問い合わせが・・・
  15. 15. 調べたら、夜間バッチのmysqldumpが原因ぽいことが判明。
  16. 16. Master user_tbl ID:0002 NAME:hoge HP:0 ClientReplication Slave user_tbl ID:0002 NAME:hoge HP:0 よくある、Master/Slaveのトポロジですね。よく見ます。
  17. 17. Master user_tbl ID:0002 NAME:hoge HP:0 ClientReplication Slave user_tbl ID:0002 NAME:hoge HP:0 Slaveでmysqlsump開始、user_tblがREAD LOCKされます。
  18. 18. Master UPDATE user_tbl user_tbl SET ID:0002 HP=300 NAME:hoge WHERE HP:0 ID=0002 ; ClientReplication Slave user_tbl ID:0002 NAME:hoge HP:0 回復アイテム利用時のクエリがMasterに飛んできます。
  19. 19. Master user_tbl ID:0002 NAME:hoge HP:300 ClientReplication Slave user_tbl ID:0002 NAME:hoge HP:0 Slaveのuser_tblはREAD LOCK中なので、変更が反映されません。
  20. 20. Master user_tbl ID:0002 NAME:hoge HP:300 ClientReplication Slave SELECT HP FROM user_tbl user_tbl ID:0002 WHERE NAME:hoge ID = 0002 HP:0 ; 残り体力を問い合わせるクエリがSlaveに飛んできます。
  21. 21. そのSELECTをMasterに向ける→ いろいろな事情でなんか難しいらしいバックアップ専用のSlaveを設ける→ やってみたこのように考えました。
  22. 22. Master user_tbl ID:0002 NAME:hoge HP:300 Client Slave Slave user_tbl user_tbl ID:0002 ID:0002 NAME:hoge NAME:hoge HP:0 HP:0バックアップ専用のSlaveサーバを追加しました。
  23. 23. (予算の関係で)Masterと比較して、 スペックが低すぎるサーバを追加してしまった→ Replication がMaster に追いつかない・・・→ むしろどんどん離されている・・・→ 日毎に遅れていくSlaveでバックアップするの・・・?新たな問題
  24. 24. --single-transaction オプションを、 使えばいいんじゃないか・・・?無駄なことをしていたことに気づいた。
  25. 25. This option sends a START TRANSACTION SQL statement to the server before dumping data. It isuseful only with transactional tables such as InnoDB, because then it dumps the consistent state ofthe database at the time whenBEGIN was issued without blocking any applications.When using this option, you should keep in mind that only InnoDB tables are dumped in a consistentstate. For example, any MyISAM or MEMORY tables dumped while using this option may still changestate.While a --single-transaction dump is in process, to ensure a valid dump file (correct tablecontents and binary log coordinates), no other connection should use the following statements:ALTER TABLE, CREATE TABLE,DROP TABLE, RENAME TABLE, TRUNCATE TABLE. A consistentread is not isolated from those statements, so use of them on a table to be dumped can cause theSELECT that is performed by mysqldump to retrieve the table contents to obtain incorrect contents orfail.The --single-transaction option and the --lock-tables option are mutually exclusivebecause LOCK TABLES causes any pending transactions to be committed implicitly.This option is not supported for MySQL Cluster tables; the results cannot be guaranteed to beconsistent due to the fact that the NDBCLUSTER storage engine supports only the READ_COMMITTEDtransaction isolation level. You should always use NDB backup and restore instead.To dump large tables, you should combine the --single-transaction option with --quick. 引用: http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html#option_mysqldump_single-transaction --single-transaction オプションとは・・・?
  26. 26. 無知は罪なりスペックが違いすぎるSlaveは論外→ バックアップ専用なら、少し劣っててもいいかも?→ Replication がどんどん離されていく様はおもしろかった専用サーバでのmysqldumpは間違いではない→ 負荷を考えて、本番で参照されないサーバでバックアップ→ 同等のスペックの専用サーバを準備する予算があれば・・・結論
  27. 27. --dump-slave
  28. 28. --single-transactionを覚えたので・・・
  29. 29. MySQL5.5から追加になったmysqldumpのオプション--dump-slave スレーブからダンプをとった場合、スレーブが参照しているマス ターの情報をCHANGE MASTERとしてダンプに含める。--apply-slave-statements STOP SLAVEおよびSTART SLAVEコマンドを、CHANGE MASTERの前後に追加する。--include-master-host-port CHANGE MASTERコマンドにマスターのホスト名とポートを含め る。 新しいオプションを使ってみよう。
  30. 30. --dump-slave オプションつけたら、mysqdumpの最中 Replication が停まっちゃった んですけど・・・あれ・・・?
  31. 31. 動作に疑問があるなら、ソースを追ってみよう。
  32. 32. STOP SLAVE SQL_THREADして、 すべて終わってから、 START SLAVEしてる・・・Cとか、C++とかよくわかんないけど頑張って読んでみた。
  33. 33. --dump-slaveをつけると、 レプリケーションが Exactry!! 停まっちゃうんですが? その通りです!!@nippondanjiさんに聞いてみた
  34. 34. http://bugs.mysql.com/bug.php?id=65035BUG登録されて、パッチが書かれている!!
  35. 35. パッチ適用前 パッチ適用後root@localhost on root@localhost on 一般クエリログの比較/*!40100 SET @@SQL_MODE= *//*!40103 SET TIME_ZONE=+00:00 */ /*!40100 SET @@SQL_MODE= */ /*!40103 SET TIME_ZONE=+00:00 */SHOW SLAVE STATUS SHOW SLAVE STATUSSTOP SLAVE SQL_THREAD STOP SLAVE SQL_THREADSET SESSION TRANSACTION FLUSH TABLESISOLATION LEVEL REPEATABLE READ FLUSH TABLES WITH READ LOCKSTART TRANSACTION /*!40100 WITH SET SESSION TRANSACTIONCONSISTENT SNAPSHOT */ ISOLATION LEVEL REPEATABLE READSHOW SLAVE STATUS START TRANSACTION /*!40100 WITHUNLOCK TABLES CONSISTENT SNAPSHOT */・ SHOW SLAVE STATUS・ UNLOCK TABLES[ダンプ処理] SHOW SLAVE STATUS・ START SLAVE・ ・SHOW SLAVE STATUS ・START SLAVE [ダンプ処理] 一般クエリログの比較
  36. 36. 無知は罪なり書かれたパッチはサジェスチョンであるということ→ パッチはそのまま取り込まれるという保証がないそもそもBUG登録ページのタイトルがアレ→ FLUSH TABLES is missing on mysqldump with --dump-slave→ ついでにどうにかしてもらったんだということ 反省
  37. 37. Powered by・・・
  38. 38. Lightning Talk at MySQL Beginners Talk Vol.1 MySQLガチBeginnerが やってみたことと反省 ご清聴ありがとうございました @studio3104_com

×