指数関数バックアップ 1
指数関数バックオフ的なバックアップ
色んなバックアップの1つ
様々なバックアップ方法の1つとして「指数関数バックアップ」というものを作った。 とっくの昔に誰かが考案して使っているだろうが、探すのが億劫なので、 指数関数バックオフをもじって命名した。#f01 正しい名前があるなら、そっちに改めたい。
目的
スナップショットを、古い世代ほど稀に残したい。スナップショットの総数は制限したい。
方法
図の通り。 四角い箱がスナップショット。下ほど古く、例えば一番下は-6世代目のスナップショット。 まず、抜き去る世代を指数関数的に選び出す。 今回は1世代古くなる程に選ばれる確率は1/2が累積されるとしたが自由に決めてよい。 続いて、抜き去る世代をデリートする。 抜き去った世代より若い世代を1世代ずつ古くリネームする。 最後に、バックアップを-1世代として作成する。
ソース
今回は PowerShell で作ってみた。見ての通りです。
##########################################################################
#
# Exponential backup (指数関数的バックオフ的バックアップ)
#
# $pathBackup には バックアップ置き場のディレクトリを指定すること
# $pathTarget には バックアップ対象のディレクトリを指定すること
# $pathBackup = "D:\backup\" のように。
#
# バックアップ最大世代の最大値
[int]$backupGenerationMax = 9
if([string]::IsNullOrEmpty($pathTarget)){
Write-Host "Exponential backup, Skipped. Reason: Backup target is not defined."
}elseif([string]::IsNullOrEmpty($pathBackup)){
Write-Host "Exponential backup, Skipped. Reason: Backup path is not defined."
}else{
Write-Host "Exponential backup, Starting..."
# 今回削除するバックアップ世代を決める。
for([int]$backupGeneration=1;$backupGeneration -le $backupGenerationMax;$backupGeneration++){
if((Get-SecureRandom -Minimum 0 -Maximum 2) -eq 0){
break;
}
}
# 今回削除するバックアップ世代のフォルダ名を作る
[string]$backupDst = $pathBackup + $backupGeneration
# 今回のバックアップ最大世代をセット
$backupGenerationMax = $backupGeneration
# 今回削除するバックアップ世代を(あれば)削除する
if(Test-Path -Path $backupDst){
Remove-Item -Path $backupDst -Recurse -Force
}
[string]$backupSrc = $backupDst
# 今回のバックアップ最大世代まで、バックアップ世代を1つずつずらす(リネームする)
for($backupGeneration=$backupGenerationMax-1;$backupGeneration -ge 1;$backupGeneration--){
$backupDst = $backupSrc
$backupSrc = $pathBackup + $backupGeneration
if(Test-Path -Path $backupSrc){
Write-Host "`tRename-Item -Path $backupSrc -NewName $backupDst"
Rename-Item -Path $backupSrc -NewName $backupDst
}
}
# バックアップ先を新造
$backupDst = $backupSrc
New-Item -ItemType Directory -Path $backupDst | Out-Null
# バックアップ実行
Write-Host "`tCopy-Item -Path $pathTarget -Destination $backupDst -Recurse -Force"
Copy-Item -Path $pathTarget -Destination $backupDst -Recurse -Force
Write-Host "Exponential backup, Completed."
}
#########################################################################
Get-SecureRandom は 要Ver.7.4 以上。無理なら Get-Random に置き換えてください。 移植や改造はご自由に。間違いがあったらこっそり教えてください。
メモ
- 指数関数バックオフ
-
指数バックオフとか、指数関数的後退ともよばれる。 通信のリトライ間隔をリトライ回数の指数関数的に定義した方法。 リトライ間隔が指数関数的に伸びてゆく。