Successfully reported this slideshow.
Your SlideShare is downloading. ×

tcpdump & xtrabackup @ MySQL Casual Talks #1

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 39 Ad
Advertisement

More Related Content

Slideshows for you (20)

Advertisement

Similar to tcpdump & xtrabackup @ MySQL Casual Talks #1 (20)

Advertisement

Recently uploaded (20)

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-digest query_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/sh SEC=$1; HOSTNAME=`hostname` /usr/sbin/tcpdump -s 65535 -x -nn -q -tttt (dst port 3306 or src port 3306) and host $HOSTNAME 2> /dev/null & PID=$!; sleep $SEC; kill $PID mk-qd-review.sh #!/bin/sh DSN=$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 $TCPFILE rm -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_review where 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_logfile 3. 終了後に記録しておいた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 538288766 101211 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 = 1 101211 11:25:26 InnoDB: Starting shutdown... 101211 11:25:31 InnoDB: Shutdown completed; log sequence number 538934654 xtrabackup: 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 created InnoDB: Setting log file ./ib_logfile0 size to 1024 MB InnoDB: Database physically writes the file full: wait... InnoDB: Progress in MB: 100 200 300 400 500 600 700 800 900 1000 xtrabackup: starting shutdown with innodb_fast_shutdown = 1 101211 11:26:07 InnoDB: Starting shutdown... 33 101211 11:26:12 InnoDB: Shutdown completed; log sequence number 538934796
  34. 34. xtrabackup使い方 ■よくある使い方2 WALのコピーをxtrabackupで、コピーはtar4ibdで ついでにgzipで固める(lzopの方が速くていいかも) # innobackupex-1.5.1 --stream=tar --slave-info --user root --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使い方 ■よくある使い方3 WALのコピーを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 listening God bless your MySQL! @riywo 39

×