tcpdump & xtrabackup @ MySQL Casual Talks #1

15,359 views
15,207 views

Published on

Published in: Technology
0 Comments
17 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
15,359
On SlideShare
0
From Embeds
0
Number of Embeds
1,890
Actions
Shares
0
Downloads
67
Comments
0
Likes
17
Embeds 0
No embeds

No notes for slide

tcpdump & xtrabackup @ MySQL Casual Talks #1

  1. 1. tcpdump とxtrabackup @riywo
  2. 2. アジェンダ● tcpdumpとか ● tcpdumpでクエリ見る ● mk-query-digest ● MyQueryShow(3日で作った><)● xtrabackupとか ● InnoDBのHotbackupの手法 ● xtrabackupの使い方入門編 2
  3. 3. tcpdump とか 3
  4. 4. tcpdumpでSQLを見る● みんな大好きtcpdump● たまにパケット落ちるけど結構使える ● libpcapはそんなもんらしい● mysql(やmemcachedやhttp)はテキスト プロトコルなので読める! 4
  5. 5. tcpdumpでSQLを見るtcpdump -s 0 -l -w - dst port 3306|strings|perl -e while(<>) { chomp; next if /^[^ ]+[ ]*$/; if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) { if (defined $q) { print "$qn"; } $q=$_; } else { $_ =~ s/^[ t]+//; $q.=" $_"; }}http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/ 5
  6. 6. 6
  7. 7. tcpdumpでSQLを見る● これだと実行時間がわからない。● 日本語ちょっと化ける。 ● perlで頑張ればましになるかも。。● ※MySQL 5.1なら ● set global long_query_time = 0でslow- logに全部出る! ● 但しコネクションプールしてると出な い。。。(set globalは新規接続から) 7
  8. 8. mk-query-digest● Perconaの人が作ってるUtility scripts “Maatkit”の中の1つ● http://www.maatkit.org● id:marqs++ ● http://www.slideshare.net/marqs/maat kit-4098945 8
  9. 9. mk-query-digestインストール# wget http://maatkit.googlecode.com/files/maatkit-7041.tar.gz# tar xvzf maatkit-7041.tar.gz# cd maatkit-7041# perl Makefile.PL# make & make install -> /usr/bin/mk-query-digest 9
  10. 10. mk-query-digest一般的な使用例(mysqldumpslow的な)# mk-query-digest slow.log 10
  11. 11. mk-query-digest実はtcpdumpも食える!# tcpdump -s 65535 -x -nn -q -tttt port 3306 >/tmp/tcp.log# mk-query-digest --type tcpdump /tmp/tcp.log※おまけ 実はmemcachedのtcpdumpも食える!# tcpdump -s 65535 -x -nn -q -tttt port 11211 >/tmp/tcp.log# mk-query-digest --type memcached /tmp/tcp.log 11
  12. 12. mk-query-digest● reportはある時点の状況分析にはよさげ ● 総実行時間や実行回数の割合 ● 実行時間の平均や95パーセンタイル● せっかくなら継続的に結果をみたい ● 時系列での変化を分析できると極めて有用● ドキュメントをよく読んでみると… ● --review, --review-history ● クエリの種類毎に統計情報を記録する機能! ● SQLのレビュー用っぽい 12
  13. 13. mk-query-digestquery_reviewをDBに記録しよう# export DSN=”h=host,D=db,u=user,p=pw”# mk-query-digest --review $DSN,t=query_review--review_history t=query_review_history --create-review-table --create-review-history-table ... 13
  14. 14. mk-query-digest継続的に記録するtcpdump.sh#!/bin/shSEC=$1; HOSTNAME=`hostname`/usr/sbin/tcpdump -s 65535 -x -nn -q -tttt (dst port 3306 orsrc port 3306) and host $HOSTNAME 2> /dev/null &PID=$!; sleep $SEC; kill $PIDmk-qd-review.sh#!/bin/shDSN=$1; TCPFILE=$2/usr/bin/mk-query-digest --no-report --type tcpdump --review-history t=query_review_history --review $DSN,t=query_review--create-review-table --create-review-history-table $TCPFILErm -f $TCPFILE 14
  15. 15. mk-query-digest継続的に記録するcrontab* * * * * /root/tcpdump.sh 30 > /tmp/tcp.log.`date +%Y%m%d_%H%M` 2> /dev/null* * * * * /root/mk-qd-review.sh h=host,D=test,u=test,p=test/tmp/tcp.log.`date -d 1 minutes ago +%Y%m%d_%H%M`2> /dev/null→これで毎分30秒間tcpdumpを記録して、 その分析結果を継続的にDBに 入れられる!(゚д゚)ウマー 15
  16. 16. mk-query-digest● 統計情報をDBに入れるメリット ● SQLで簡単に抽出等ができる ● 例:〇〇時〇〇分から遅くなったクエリを探す ● でもSQLとかめんどいし。。。● 今流行はWEBアプリケーションだ! ● ブラウザでぽちぽち見れたら楽 ● ついでにグラフとかにできたらもっと楽 ● WEBアプリとか作ってみたい(←これが本音) 16
  17. 17. 作ってみた「MyQueryShow」https://github.com/riywo/MyQueryShow 17
  18. 18. MyQueryShow 18
  19. 19. MyQueryShow 19
  20. 20. MyQueryShow● WAF ● Amon2(tokuhirom++) ● シンプルで使いやすい!● jQuery + jQuery Grid plugin ● APIじゃなくてHTMLから表を作成● RRDTool ● 毎分バッチで統計DBから値取って更新 ● が、未実装。。● デモ 20
  21. 21. MyQueryShowインストールなど$ git clone git://...$ cd MyQueryShow$ cpanm -v --installdeps . ※ RRDsはがんばって入れて>< (apt/yum/port,brew)$ plackup MyQueryShow.psgi → 足りないと言われたモジュールはがんばってcpanmだ!$ perl -I./lib script/sync_data_to_rrd.pl → query_review(_history)をRRDに全部入れる ※ 基本的な運用としてはcronで今のデータだけを更新していく 21
  22. 22. MyQueryShow● 問題点 ● 名前がダサい ● UIがダサい ● ロジックがSQL ● 機能がしょぼい – クエリ詳細のページにexplainとか欲しい ● DB複数の時どうする? ● ソース上のクエリの実行箇所がわからん – →クエリコメント! 22
  23. 23. MyQueryShow※おまけ クエリコメントmy $dbh = DBI->connect(dbi:mysql:host=host:dbname=test,test,test, { RaiseError => 1, Callbacks => { ChildCallbacks => { execute => sub { my ($obj, @binds) = @_; my (undef, $file, $line) = caller; $obj->{Database}->{Statement} .= "/* $file:$line $obj->{Database}->{Name} */"; return; }, }, },});↓select * from query_reviewwhere checksum = 26684480389196246 23/* QueryComment.pm:30 host=localhost:dbname=test */
  24. 24. もっとかっこいいの 誰か作って ><24
  25. 25. xtrabackup とか 25
  26. 26. InnoDBのHotbackup● Hotbackupとは… ● 更新を止めずにバックアップをすること ● バックアップ自体に時間がかかる(数時間はざら) ● →どうやって一貫性を保つか● いくつかの方式 ● LVMのスナップショット ● mysqldump --single-transaction ● ibbackup & innobackup ● xtrabackup & innobackupex 26
  27. 27. InnoDBのHotbackup● LVMのスナップショット ● あまりよく知らない>< ● 安定してなさそう● mysqldump --single-transaction ● begin; してからmysqldumpする論理バックアップ ● データ増につれてバックアップ時間が長くなる ● ロールバックセグメントが肥大化する● ibbackup & innobackup ● 有償>< 27
  28. 28. InnoDBのHotbackup● xtrabackup & innobackupex ● ibbackup & innobackup風のオープンソフトウェア ● オンラインで物理バックアップができる! – バックアップ時間はレコード増えてもほぼ一定 ● 無償で使える Percona++ ● 簡単な説明 – WALを複製するプロセス – データファイルをコピーするプロセス – データファイルコピーが終わったら、WALを適応 – (適応はInnoDBのクラッシュリカバリを利用) – →コピー終了時点の静止断面が完成! 28
  29. 29. [ InnoDB Internals: InnoDB File Formats and Source Code Structure ]@MySQL University http://forge.mysql.com/wiki/InnoDB_Internals:_InnoDB_File_Formats_and_Source_Code_Structure
  30. 30. 2. その間にdatafleをコピー1. InnoDBのWALを二重に記録 Copy of ibdata xtrabackup_logfile3. 終了後に記録しておいたWALを適応[ InnoDB Internals: InnoDB File Formats and Source Code Structure ]@MySQL University http://forge.mysql.com/wiki/InnoDB_Internals:_InnoDB_File_Formats_and_Source_Code_Structure
  31. 31. xtrabackup使い方インストール・rpm/debを入れるのが簡単・makeする場合、MySQLのbuildも必要なのでちょっと面倒http://www.percona.com/downloads/XtraBackup/LATEST/・xtrabackup WALのコピーとデータファイルのコピーができるCで書かれたプログラム。・innobackupex-XXX xtrabackupを便利に使うためのPerlで書かれたヘルパープログラム。http://www.percona.com/docs/wiki/percona-xtrabackup:start 31
  32. 32. xtrabackup使い方■よくある使い方WALのコピーもデータファイルのコピーもxtrabackupでバックアップ# innobackupex-1.5.1 --slave-info --user root--password pass /tmp/xtrabackup/■innobackupexの関数でフローを説明start_ibbackup(); #xtrabackup起動 WALとデータのコピー開始wait_for_ibbackup_suspend(); #データファイルコピー終了待ちmysql_lockall(); #更新をロックしてbinlogポジション記録backup_files(); #.frmとかmysqlとかMyISAMをコピーresume_ibbackup(); #WALのコピーを停止mysql_unlockall(); #ロックを解除 32
  33. 33. xtrabackup使い方ログの適応# innobackupex-1.5.1 --apply-log/tmp/xtrabackup/YYYY-mm-dd_HH-MM-SS/xtrabackup: This target seems to be not prepared yet.xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(538288766)xtrabackup: Starting InnoDB instance for recovery.InnoDB: Log scan progressed past the checkpoint lsn 538288766101211 11:25:25 InnoDB: Database was not shut down normally!InnoDB: Starting crash recovery.InnoDB: Doing recovery: scanned up to log sequence number 538934654 (34 %)101211 11:25:25 InnoDB: Starting an apply batch of log records to the database...InnoDB: Progress in percents: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...xtrabackup: starting shutdown with innodb_fast_shutdown = 1101211 11:25:26 InnoDB: Starting shutdown...101211 11:25:31 InnoDB: Shutdown completed; log sequence number 538934654xtrabackup: This target seems to be already prepared.xtrabackup: Starting InnoDB instance for recovery.101211 11:25:32 InnoDB: Log file ./ib_logfile0 did not exist: new to be createdInnoDB: Setting log file ./ib_logfile0 size to 1024 MBInnoDB: Database physically writes the file full: wait...InnoDB: Progress in MB: 100 200 300 400 500 600 700 800 900 1000xtrabackup: starting shutdown with innodb_fast_shutdown = 1101211 11:26:07 InnoDB: Starting shutdown... 33101211 11:26:12 InnoDB: Shutdown completed; log sequence number 538934796
  34. 34. xtrabackup使い方■よくある使い方2WALのコピーをxtrabackupで、コピーはtar4ibdでついでにgzipで固める(lzopの方が速くていいかも)# innobackupex-1.5.1 --stream=tar --slave-info --userroot --password pass ./ | gzip - > backup.tar.gz・親プロセス wait_for_ibbackup_suspend(); #xtrabackupの準備待ち tar4ibdでデータファイルをSTDOUTへ mysql_lockall();以下同文(但し出力はSTDOUT)・子プロセス xtrabackup --log-stream --target-dir=./ WALのコピーを行うだけ。始まったらsuspendファイル作る  34
  35. 35. xtrabackup使い方■よくある使い方3WALのコピーをxtrabackupで、コピーはscpで# innobackupex-1.5.1 --remote-host=host --slave-info--user root --password pass /tmp/xtrabackup/・親プロセス wait_for_ibbackup_suspend(); #xtrabackupの準備待ち データファイルをscpでリモートホストへ mysql_loclall();以下同文(但し全てリモートホストへ)・子プロセス xtrabackup --log-stream --target-dir=./ WALのコピーを行うだけ。始まったらsuspendファイル作る  35
  36. 36. 時間切れ >< 36
  37. 37. 続きはMySQL Casual Talks #2 で(^^)v 37
  38. 38. Thanks Oracle++myfnder++Speakers++Listeners++ 38
  39. 39. Thank you for listeningGod bless your MySQL! @riywo 39

×