« C++ テンプレートを使って高速な高機能サーバを書く方法 | メイン | YAPC::Asia 2008 で Pathtraq について話してきました »
2008年05月01日
データベースの差分バックアップとウェブサービスのお引っ越し
現在、Pathtraq のサーバを、オフィス内のサーバルームに設置されたマシンからデータセンタ内の新サーバへ移行する作業を行っています。その際に問題となるのは、ダウンタイムを最小にしつつ、100GB 弱ある MySQL のデータをいかに移動させるか、という点になります。答えは言うまでもなく差分転送なのですが、rsync は双方向の接続が必須だったり、差分情報をキャッシュすることができなかったり、いろいろ融通が効かなそうです。だんだん調べるのも面倒になってきたので、自分のニーズに見合う、データベースファイル用の差分バックアッププログラムを書いてみました。
/lang/c/blockdiff - CodeRepos::Share - Trac差分ファイルとハッシュ値の情報が別ファイルになっていたり、ファイルデスクリプタを積極的に使ったりと、柔軟な運用が可能な設計になっています (getopt とかファイル構造考えたりとかが面倒だったとも言います)。使い方は、以下のような感じ。
# コンパイル % gcc -Wall -O2 -o blockdiff_dump blockdiff_dump.c -lcrypto % gcc -Wall -O2 -o blockdiff_merge blockdiff_merge.c -lcrypto # 差分データを gzip して保存、チェックサムデータを ibdata1.md5 に保存 % blockdiff_dump < ibdata1 6> ibdata1.md5 | gzip > ibdata1.dump.gz # 前回との差分を gzip して保存、チェックサムデータを更新 % blockdiff_dump < ibdata1 5< ibdata1.md5 6> ibdata1.md5.new | gzip > ibdata1.dump.1.gz && mv ibdata1.md5.new ibdata1.md5 # ダンプデータからオリジナルを復元 % gunzip < ibdata1.dump.gz | blockdiff_merge ibdata1 # 差分ダンプデータを適用 % gunzip < ibdata1.dump.1.gz | blockdiff_merge ibdata1 # InnoDB データのネットワーク越しの移行 (ssh で転送する場合) user@new% rm -f ibdata1 ib_logfile? user@orig% blockdiff_dump < ibdata1 6> ibdata1.md5 | gzip | ssh user@new 'gunzip | blockdiff_merge ibdata1' user@orig% /etc/init.d/mysql stop user@orig% blockdiff_dump < ibdata1 5< ibdata1.md5 | gzip | ssh user@new 'gunzip | blockdiff_merge ibdata1' user@new% /etc/init.d/mysql start # ファイル間の差分を作成 % blockdiff_dump < dst 6>&1 > /dev/null | blockdiff_dump 5<&0 < src > diff # 差分を適用 % blockdiff_merge dst < diff
あとは、差分転送を繰り返してサーバを切り替えるだけなんですけど、まだまだ転送は終わりそうにもありません (苦笑)
投稿者 kazuho : 2008年05月01日 15:56
トラックバック
このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1882
このリストは、次のエントリーを参照しています: データベースの差分バックアップとウェブサービスのお引っ越し:
» [Linux] rsync の block size デフォルト値はなぜ 700 byte なのか? from dragon3の日記
rsyncの文献「The rsync algorithm」にヒントがありました。 We have found that values of S betw... [続きを読む]
トラックバック時刻: 2009年04月12日 23:29