yuu_nkjm blog
2011-08-09(Tue) 編集
[LVM][Linux] LVMのスナップショットを使ったデータの整合性を考慮した同期バックアップ
データの整合性を考慮した同期バックアップ
データベースのデータの様な大きなデータ群をバックアップするとき,単にコピーをするだけでは,コピー中にバックアップ対象の状態が変わってしまい,データ群の整合性がなくなってしまうことがある.
このケースで,LVMのスナップショット機能が役に立ちそうだった.@IT:LVMによる自動バックアップ・システムの構築(2/3)を読んで,自分が理解した内容をメモする.
LVMのスナップショット
LVMのスナップショット機能を使うことで,スナップショットを作成した時のデータへのアクセスポイントを作ることができる.LVMのスナップショットは,その時のデータを格納するというよりは,データへのポインタとスナップショット作成後に変更されたデータの元データを格納することで,スナップショットを作成した時の全データへのアクセスを可能とする.
イメージとしては,(1)全ファイルへのポインタのコピーが作成される,(2)そのポインタが指し示すデータに変更が加えられるときは,その元データをスナップショット領域にコピーし,ポインタの指し先をスナップショット領域にコピーされたデータに向ける,ということをする.
LVMのスナップショットを使ったバックアップ手順
具体的なバックアップ手順としては,以下を想定している.こうすればうまく行くのでは?というだけで,未検証.
- 整合性を取りたいデータを所持するサービス(例: mysql)に停止を依頼する.
/etc/init.d/mysqld stop
- スナップショットを取得する.スナップショットの作成には,同一(?)ボリュームグループ内に空いている論理ボリューム(LV)が必要になる.スナップショットを破棄するまでに,snapshotがあふれるとsnapshotが無効になる.スナップショットを使ったバックアップ中にスナップショット領域があふれないような量を割り当てる.
lvcreate --snapshot --size=30G --name snap0 /dev/volgrp0/lv0
- スナップショットを取得すれば,サービスを動かしはじめてよいので,サービスを再起動する.
/etc/init.d/mysqld start
- スナップショットを使って,どこかのデバイスにバックアップを取る.作成したスナップショットは通常のデバイスと同様に扱えるので,そのままdumpしてもいいし,マウントして,cp -aするなりpdumpfsするなりすれば良いとおもう.
mount -t auto /dev/volgrp0/snap0 /mnt/snap0 cp -a /mnt/snap0 /backup/
- 使い終わったスナップショットを破棄する.
lvremove /dev/volgrp0/lv0 --force