© たかやまそら

指数関数バックアップ 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 に置き換えてください。 移植や改造はご自由に。間違いがあったらこっそり教えてください。


メモ

指数関数バックオフ

指数バックオフとか、指数関数的後退ともよばれる。 通信のリトライ間隔をリトライ回数の指数関数的に定義した方法。 リトライ間隔が指数関数的に伸びてゆく。

© たかやまそら