カジュアルなクエリ品質管理

  MySQL Casual Talks Vol.3
        @mikeda
まきでいきます (;´Д ` ) ハァハァ
自己紹介
  @mikeda
 – インフラエンジニア
 – 最近作ってるもの→
 – MySQL Casual 初参加!


  CROOZ
 – ソーシャルゲーム、ブログ、…
 – MySQL 200 台くらい。 SSD 増加中
 – サービス用 SQL 書いたことない><
今日は

 何番煎じかわからないですが、
 クエリ解析の話をしようと思います
はじめに
たまにある光景
「イベント打つから DB 倍にして!」
「チューニングでなんとかなりませんか・・・?」
「そんな余裕くぁ w せ drftgy ふじこ lp 」

 サーバ増設。その後。。。

「クエリなおしたら負荷半分になったわ」
(#^ω^) ビキビキ
たまにある DB 負荷推移
          大きな改善
          ・ SSD 投入
          ・ DB 分割    危険ライン




         これでしばらく安心や!!!
チューニング
たまにある DB 負荷推移


            危険ライン




      しかしなぜか元に戻る
たまにある DB 負荷推移




  V
                危険ライン




       しかしなぜか元に戻る



 DB 負荷の V 字回復
なぜ?
• クエリ品質の管理ができていない
     ↓
• 後手後手の対応
     ↓
• 余計なサーバコスト
サーバエンジニアとして考える
サーバ、 MySQL の監視
– CPU 使用率、ディスク IO 、…
– スレッド数、各種キャッシュヒット率、…
それだけでいいのか?

クエリ品質も同じ!
– 見える化
                 これ大事!
– 指標化
– 監視
というわけでその歴史
1.原始の時代
スロークエリ解析
• 出てくるのは
 – バッチ系、ほんとにどうしようもないクエリ
• 本命を拾えない
 – 例えば 1 回 50ms かかってる件数多めクエリ


• 本当に問題なクエリがログに現れだした時。。。
  既にサービスは落ちている (´ ・ ω ・` ) ショボーン

※ ホントは設定次第でいろいろできます><
職人解析
 「サーバ重いっすね」
    ↓
 職人が show processlist を連打
    ↓
 これだ ( ゚ д ゚ ) クワッ !!

職人のノリ次第

※ 現れる頻度の解析は正しいアプローチ
もっと正確で、だれにでもわかるようにしたい

※ ほんとはもっといろいろやってます><
2.全クエリ解析してみよう時代
mk-query-digest でクエリ解析
• mk-query-digest
   – MaatKIt に入ってるクエリをいい感じに解析してくれるツール
   – @marqs :『 MaatKIT の紹介』


• tcpdump との組合せ
   – tcpdump のキャプチャファイルを食える
   – @ryiwo :『 tcpdump & xtrabackup 』



• アプリ、 MySQL を触らなくていい!
  →(自分には)導入が簡単!!!
MaatKit って
 最近、 Percona Toolkit になった・・・?
  pt-query-digest ・・・?
MaatKit って
 最近、 Percona Toolkit になった・・・?
  pt-query-digest ・・・?
全体的な概要
                   ① 解析スクリプトを送って実行
管理サーバ
Apache       毎朝バッチ実行                    DB サーバ
DAV on                                  Maatkit 導入済み
Options Indexes     ② 結果を WEVDAV でアップ



③ ブラウザで確認




                   90 台並列
                   ※ かぶらないようにアタマに SLEEP
スクリプト 概要
• 概要
   • tcpdump でキャプチャ
   • mk-query-digest で解析
   • 結果を管理サーバにアップ


• 細かいところは省略
 ブログにアップしてます
   http://d.hatena.ne.jp/mikeda/20111204/1322980203
スクリプト ちょっと変えてる
      ところ
• よくある例
# tcpdump -i eth0 port 3306 -s 65535 -x -nn -q -tttt -l > dump.txt
# mk-query-digest --type tcpdump dump.txt                  テキストで保存

                                              pcap 形式で保存
• 自分のやつ                                       → ファイルサイズが 1/3 に
# tcpdump -i eth0 port 3306 -s 65535 -w qd.pcap
# tcpdump -s 65535 -x -nn -q -tttt -l -r qd.pcap | 
   mk-query-digest --type tcpdump 
   --explain "h=127.0.0.1,u=root,p=password”
                                           --explain オプション
                                           →EXPLAIN 結果がつく!
ブラウザで確認




DB サーバ名のディレクトリが並んでる
ブラウザで確認




解析結果が 1 ヶ月分並んでる
ブラウザで確認


全体的なクエリ統計

   合計実行時間の比率      平均実行時間    EXPLAIN サマリ




クエリランキング


           実行回数            クエリ
ブラウザで確認
クエリごとの統計が並ぶ
               実行時間、回数
              接続元 IP などなど



               実行時間分布

              サンプルクエリ


               EXPLAIN 結果
そして・・・
• これなら自分でもなんとなくわかる! 
    

• クエリ品質の底上げなるか・・・?
しかし・・・
• なかなか見てくれないw

• 見るのめんどくさい
 →正しいベンチャーマインド
3.カジュアル化の時代
サマリ作成
• 毎日バッチでサマリページを作成

• 簡単な指標を作って色付け
 – 実行時間の比率
 – 1回あたりの実行時間
 – EXPLAIN 結果
サマリページ 全体




見た目がカジュアル(しょぼい)!!!
サマリページ 1




ステータス
                 詳細解析へのリンク


         サマリ解析へのリンク



要注意サーバが一目でわかる!
サマリページ 2




要注意クエリが一目でわかる!
サマリページ おまけ
    EXPLAIN サマリの対応表と
    日本男子さんの解説ページへのリンク




細やかな気づかい!
ちょっとめんどくさくなくなった!?
そして夢の生活が・・・
「赤いのなおしたら負荷下がりました。」
「サーバ減らしましょう( ^ ω ^)ニコッ 」

「サーバ追加必要ですかね?」
「緑でこの負荷ですか、
 じゃあ足しましょう( ^ ω ^)ニコッ 」
妄想でした。まとめ
• クエリ品質管理をカジュアルにやりたい!
 – 最低限おさえるべきところが簡単にチェックでき
   るように

• まだまだ精度が高くない
 – 画一的に指標化しづらい
 – MySQL 知識不足


• アドバイスお待ちしてます!
終わりです

Zabbix study5lt