« || »

 PHPとrsyncでディレクトリをローテーションバックアップ

2020. 1. 18 (土)

通常ならこういったバッチ処理は.sh等のシェルスクリプトで記述するところかと思いますが、個人的に使い慣れたPHPで書いています。

PHPで行なっているのはローテーションさせるためのバックアップ先ディレクトリ名の管理くらいで、バックアップ処理そのものは単純にrsyncに任せています。

使用方法

backup.phpと、バックアップ対象パスなどrsyncへ渡すオプションを設定するbackup_config.phpを同一のディレクトリへ置いて使用します。
ローテーション回数の設定はbackup.php側にあります。
ローテーション回数を2以上に設定すると、--link-destオプションを使用した差分バックアップを行います。初回はフルバックアップになりますが、2回目以降は変化のなかったファイルに対してはハードリンクのみを作成し、変化のあったファイルのみが実体ファイルとしてコピーされますので、ローテーション回数が比較的多めでもディスク消費量やバックアップにかかる時間を必要最小限に抑えることができます。
動作の概要についてはこちらを。

ローテーションを1回に指定した場合は--link-destオプションは使わず、既存のバックアップの中のいちばん新しいものに対して、--deleteオプションを付けて実行します。
ローテーション有り(2回以上)か無し(1回)かのどちらか一方で動作させるだけでも良いですが、backup.phpを例えばbackup_sub.phpという名前でコピーし、backup.php側をローテーション指定で1日1回実行、backup_sub.php側をローテーション無し(1回)指定で例えば1時間おきに実行させることで、1時間おきに最新の状態にミラーリングさせつつ、1日1回履歴バックアップを残すといった使い方もできます。

PHPファイルですが、Webアプリケーションではないのでシェルから実行します。

 $ php /スクリプト設置パス/backup.php

YYYYMMDD_hhmmss.bak という名前のディレクトリにバックアップ、
YYYYMMDD_hhmmss.log にrsyncのログを保存します。

cronでスケジューリングする場合は以下のようになります。
設定例(毎日午前4時に実行)

 # rotation backup
 0 4 * * * php /スクリプト設置パス/backup.php &> /dev/null

設定例 毎日午前4時に履歴差分バックアップをしつつ、毎正時にミラーリング
(backup.php側でローテーション回数2以上で設定、backup.phpをコピーしたbackup_sub.php側でローテーション回数1を指定している前提です。)

 # main rotation backup
 0 4 * * * php /スクリプト設置パス/backup.php &> /dev/null
 # sub mirroring
 0 * * * * php /スクリプト設置パス/backup_sub.php &> /del/null

設定によっては複数が同時に実行開始される場合がありますが、実行の際にはロックファイルを用いて排他処理しているので、同時に複数のバックアップ処理が回ってしまうことはありません。
また、ローテーション無しでの実行の場合はバックアップ開始まで5秒遅らせるようにしてありますので、同時に走り出してもローテーション有りのほうが優先して実行されるようになっています。

オプションでold_delete.phpとcapacity_check.phpも用意しました。
backup.phpでローテーション回数を多く設定した場合のサポート的な位置付けです。
使用する場合は、どちらもbackup.phpと同じディレクトリへ設置してください。
old_delete.phpは古いバックアップを間引くスクリプトで、1日以上経過したらその日のバックアップの中で最終のものを残して削除、1か月以上経過したらその月のバックアップの中で最終のものを残して削除します。
capacity_check.phpはバックアップディスクの容量をチェックし、指定した割合に達したら下回るまで古いバックアップから順に削除するスクリプトです。
どちらか一方でも、両方設置しても問題ありません。

cronでスケジュール実行する場合は、1日1回程度backup.phpとは時間をずらして実行すればよいかと思います。

設定例 old_delete.phpを毎日5時に、capacity_check.phpを毎日5時5分に実行するよう設定しています。

 # main rotation backup
 0 4 * * * php /スクリプト設置パス/backup.php &> /dev/null
 # sub mirroring
 0 * * * * php /スクリプト設置パス/backup_sub.php &> /del/null
 # olddata delete
 0 5 * * * php /スクリプト設置パス/old_delete.php &> /dev/null
 # diskcapacity check delete
 5 5 * * * php /スクリプト設置パス/capacity_check.php &> /dev/null

スクリプト

backup.php

backup_config.php

old_delete.php

capacity_check.php

« || »

Comments are closed.