NASのバックアップスケジューリング見直し
こちらでのバックアップスクリプトに以下のスクリプトを追加しました。
used_check.php
<?php
/**
* バックアップ元のディスク使用量に変化があれば0を、無ければ1を終了ステータスとして返す
*/
set_time_limit(0);
if(!file_exists(__DIR__. '/backup_config.php')) {
print "Configuration file 'backup_conf.php' not found.\n";
exit;
}
include(__DIR__. '/backup_config.php');
define('DATA', __FILE__. '.dat');
exec("df {$sourceDir}", $ret);
if(!isset($ret[1])) exit;
$used = (preg_split('/\s+/', $ret[1]))[2];
if($used) {
$prevUsedSize = getPrevUsedSize();
if($prevUsedSize != $used) {
file_put_contents(DATA, $used);
exit(0);
}
else exit(1);
}
function getPrevUsedSize() {
if(!file_exists(DATA)) return 0;
return(file_get_contents(DATA));
}
バックアップ元のディスク使用量の変化に応じた終了ステータスを返します。
この結果を使用して、ミラーリング側の挙動の設定を変更してみました。
# main rotation backup
0 */6 * * * php /スクリプト設置パス/backup.php &> /dev/null
# sub mirroring
* * * * * php /スクリプト設置パス/used_check.php && php /スクリプト設置パス/backup_sub.php &> /del/null
# olddata delete
5 * * * * php /スクリプト設置パス/old_delete.php &> /dev/null
# diskcapacity check delete
10 * * * * php /スクリプト設置パス/capacity_check.php &> /dev/null
・世代バックアップ(6時間ごと)
・バックアップ元ディスク使用量が変化したかチェック(毎分)、変化があれば最新バックアップに対してミラーリング
・一定期間経過したバックアップの間引き
・バックアップ先ディスク使用量が90%に達したら90%を下回るまで古いバックアップから削除
新たに追加したスクリプトはdfコマンドの結果を元にしているため認識できるのは1バイト単位ではなくブロック単位での変化になります。
このためファイルやディレクトリの追加・削除は認識できますが、既存ファイルの部分的な修正やファイル名の変更などは認識できない場合も多くなりますが、使用しているのはミラーリング側のみで世代バックアップ側はこれまで通り一定時間ごとに実行しているのでとくに問題は無いかと思います。