« 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