tcpdump & xtrabackup @ mysql casual talks #1

39
tcpdump xtrabackup @riywo

Upload: ryosuke-iwanaga

Post on 10-May-2015

14.574 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: tcpdump & xtrabackup @ MySQL Casual Talks #1

tcpdumpと

xtrabackup@riywo

Page 2: tcpdump & xtrabackup @ MySQL Casual Talks #1

2

アジェンダ●tcpdumpとか

● tcpdumpでクエリ見る● mk-query-digest● MyQueryShow(3日で作った><)

●xtrabackupとか● InnoDBのHotbackupの手法● xtrabackupの使い方入門編

Page 3: tcpdump & xtrabackup @ MySQL Casual Talks #1

3

tcpdumpとか

Page 4: tcpdump & xtrabackup @ MySQL Casual Talks #1

4

tcpdumpでSQLを見る● みんな大好きtcpdump● たまにパケット落ちるけど結構使える

● libpcapはそんなもんらしい● mysql(やmemcachedやhttp)はテキストプロトコルなので読める!

Page 5: tcpdump & xtrabackup @ MySQL Casual Talks #1

5

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 "$q\n"; } $q=$_; } else { $_ =~ s/^[ \t]+//; $q.=" $_"; }}'

tcpdumpでSQLを見る

http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/

Page 6: tcpdump & xtrabackup @ MySQL Casual Talks #1

6

Page 7: tcpdump & xtrabackup @ MySQL Casual Talks #1

7

tcpdumpでSQLを見る● これだと実行時間がわからない。● 日本語ちょっと化ける。

● perlで頑張ればましになるかも。。● ※MySQL 5.1なら

● set global long_query_time = 0でslow-logに全部出る!

● 但しコネクションプールしてると出ない。。。(set globalは新規接続から)

Page 8: tcpdump & xtrabackup @ MySQL Casual Talks #1

8

mk-query-digest● Perconaの人が作ってるUtility scripts “Maatkit”の中の1つ

● http://www.maatkit.org● id:marqs++

● http://www.slideshare.net/marqs/maatkit-4098945

Page 9: tcpdump & xtrabackup @ MySQL Casual Talks #1

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

Page 10: tcpdump & xtrabackup @ MySQL Casual Talks #1

10

mk-query-digest一般的な使用例(mysqldumpslow的な)# mk-query-digest slow.log

Page 11: tcpdump & xtrabackup @ MySQL Casual Talks #1

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

Page 12: tcpdump & xtrabackup @ MySQL Casual Talks #1

12

mk-query-digest● reportはある時点の状況分析にはよさげ

● 総実行時間や実行回数の割合● 実行時間の平均や95パーセンタイル

● せっかくなら継続的に結果をみたい● 時系列での変化を分析できると極めて有用

● ドキュメントをよく読んでみると…● --review, --review-history● クエリの種類毎に統計情報を記録する機能!● SQLのレビュー用っぽい

Page 13: tcpdump & xtrabackup @ MySQL Casual Talks #1

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 ...

Page 14: tcpdump & xtrabackup @ MySQL Casual Talks #1

14

mk-query-digest継続的に記録する

tcpdump.sh#!/bin/shSEC=$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/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

Page 15: tcpdump & xtrabackup @ MySQL Casual Talks #1

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に 入れられる!(゚д゚)ウマー

Page 16: tcpdump & xtrabackup @ MySQL Casual Talks #1

16

mk-query-digest● 統計情報をDBに入れるメリット

● SQLで簡単に抽出等ができる● 例:〇〇時〇〇分から遅くなったクエリを探す● でもSQLとかめんどいし。。。

● 今流行はWEBアプリケーションだ!● ブラウザでぽちぽち見れたら楽● ついでにグラフとかにできたらもっと楽● WEBアプリとか作ってみたい(←これが本音)

Page 17: tcpdump & xtrabackup @ MySQL Casual Talks #1

17

作ってみた「MyQueryShow」https://github.com/riywo/MyQueryShow

Page 18: tcpdump & xtrabackup @ MySQL Casual Talks #1

18

MyQueryShow

Page 19: tcpdump & xtrabackup @ MySQL Casual Talks #1

19

MyQueryShow

Page 20: tcpdump & xtrabackup @ MySQL Casual Talks #1

20

MyQueryShow● WAF

● Amon2(tokuhirom++)● シンプルで使いやすい!

● jQuery + jQuery Grid plugin● APIじゃなくてHTMLから表を作成

● RRDTool● 毎分バッチで統計DBから値取って更新● が、未実装。。

●デモ

Page 21: tcpdump & xtrabackup @ MySQL Casual Talks #1

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で今のデータだけを更新していく

Page 22: tcpdump & xtrabackup @ MySQL Casual Talks #1

22

MyQueryShow●問題点

● 名前がダサい● UIがダサい● ロジックがSQL● 機能がしょぼい

– クエリ詳細のページにexplainとか欲しい● DB複数の時どうする?● ソース上のクエリの実行箇所がわからん

– →クエリコメント!

Page 23: tcpdump & xtrabackup @ MySQL Casual Talks #1

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'/* QueryComment.pm:30 host=localhost:dbname=test */

Page 24: tcpdump & xtrabackup @ MySQL Casual Talks #1

24

もっとかっこいいの誰か作って

><

Page 25: tcpdump & xtrabackup @ MySQL Casual Talks #1

25

xtrabackupとか

Page 26: tcpdump & xtrabackup @ MySQL Casual Talks #1

26

InnoDBのHotbackup● Hotbackupとは…

● 更新を止めずにバックアップをすること● バックアップ自体に時間がかかる(数時間はざら)● →どうやって一貫性を保つか

● いくつかの方式● LVMのスナップショット● mysqldump --single-transaction● ibbackup & innobackup● xtrabackup & innobackupex

Page 27: tcpdump & xtrabackup @ MySQL Casual Talks #1

27

InnoDBのHotbackup● LVMのスナップショット

● あまりよく知らない><● 安定してなさそう

● mysqldump --single-transaction● begin; してからmysqldumpする論理バックアップ● データ増につれてバックアップ時間が長くなる● ロールバックセグメントが肥大化する

● ibbackup & innobackup● 有償><

Page 28: tcpdump & xtrabackup @ MySQL Casual Talks #1

28

InnoDBのHotbackup● xtrabackup & innobackupex

● ibbackup & innobackup風のオープンソフトウェア● オンラインで物理バックアップができる!

– バックアップ時間はレコード増えてもほぼ一定● 無償で使える Percona++● 簡単な説明

– WALを複製するプロセス– データファイルをコピーするプロセス– データファイルコピーが終わったら、WALを適応– (適応はInnoDBのクラッシュリカバリを利用)– →コピー終了時点の静止断面が完成!

Page 29: tcpdump & xtrabackup @ MySQL Casual Talks #1

[ 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

Page 30: tcpdump & xtrabackup @ MySQL Casual Talks #1

[ 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

xtrabackup_logfile Copy of ibdata

1. InnoDBのWALを二重に記録 2. その間にdatafleをコピー

3. 終了後に記録しておいたWALを適応

Page 31: tcpdump & xtrabackup @ MySQL Casual Talks #1

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

Page 32: tcpdump & xtrabackup @ MySQL Casual Talks #1

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(); #ロックを解除

Page 33: tcpdump & xtrabackup @ MySQL Casual Talks #1

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 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 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...101211 11:26:12 InnoDB: Shutdown completed; log sequence number 538934796

Page 34: tcpdump & xtrabackup @ MySQL Casual Talks #1

34

xtrabackup使い方■よくある使い方2WALのコピーを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ファイル作る 

Page 35: tcpdump & xtrabackup @ MySQL Casual Talks #1

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ファイル作る 

Page 36: tcpdump & xtrabackup @ MySQL Casual Talks #1

36

時間切れ><

Page 37: tcpdump & xtrabackup @ MySQL Casual Talks #1

37

続きはMySQL Casual

Talks #2で(^^)v

Page 38: tcpdump & xtrabackup @ MySQL Casual Talks #1

38

ThanksOracle++

myfnder++Speakers++Listeners++

Page 39: tcpdump & xtrabackup @ MySQL Casual Talks #1

39

Thank you for listening

God bless your MySQL!@riywo