Amazon FSx for Windows File Server のデータ重複排除を試してみた

2021.03.20

しばたです。

現在のAmazon FSx for Windows File Server(以後FSx for Windows)ではデータ重複排除の機能がサポートされています。

この機能について正直よくわかっていなかったので実際に試して調べてみることにしました。

FSx for Windowsのデータ重複排除とは?

一般的にデータ重複排除(Data Deduplication、単にdedupとも)といえばストレージデバイスやファイルシステムにおいて同一と見做されるデータを集約することで容量を削減する仕組みですが、その実装は様々です。

FSx for Windowsのデータ重複排除に関してその実装は明言されていないのですが、先述のアナウンスに

データ重複排除とは、Windows Server の機能の一つで、ファイルの重複部分を一度だけ保存することで、冗長データに関連するコストを削減します。

と記載されているのに加え、後述の管理用コマンドがWindows Serverで提供されているコマンドに倣ったものであったため、単純にWindows Serverのデータ重複排除機能を使っているものと推測されます。
(とはいえFSx for Windows独自のカスタマイズや最適化が加えられている可能性は否定できませんが...)

Windows Serverのデータ重複排除

WindowsではWindows Server 2012からOS標準機能としてデータ重複排除 *1が追加されています。
機能の詳細は以下のDocsのドキュメントや@ITの記事が詳しいのでまずはこちらをご覧ください。

本記事で必要な部分について簡単に説明しておくと、この重複排除はファイルのデータを「チャンク」と呼ばれる可変長データに分割して「チャンクストア」と呼ばれる領域に集約し保存、その後ファイルをチャンクストアに対するリパースポイントに置き換えることで実現されています。

重複排除処理はリアルタイムではなくWindowsのタスクスケジューラーによりバッチ処理で行われます。 Windows Serverのデフォルト設定では以下のスケジュールとなっています。

処理名(ジョブ名) 処理内容 スケジュール
最適化 指定ボリューム内のファイルをチャンクに分割しチャンクストアに保存する 1時間ごとに実行
ガベージコレクション ファイル削除などにより参照されなくなった不要チャンクの削除 毎週土曜 午前2時45分
整合性スクラブ チャンクストア内のディスク障害、不良セクタのチェックと復元など 毎週土曜 午前3時45分
非最適化 重複排除を止めてボリュームを重複排除前に戻す 手動実行のみ

リアルタイム処理ではないため、重複排除されたファイルに変更を加えると重複排除されていない状態で保存され、次回最適化処理で重複排除される形となっています。

また、全てファイルを直ちに重複排除するわけではなく「使用法(UsageType)」ごとに

  • 最適化の優先度 : バックグラウンドで処理するか高い優先度で処理するか
  • 最適化ポリシー : 重複排除するファイルの最低利用期間、使用中ファイルを対象とするか否かなど

が定められています。
使用法はデータ重複排除を有効にする際に決めることが可能で以下の3種類存在します。

使用法 用途 優先度 最適化ポリシー
Default 汎用ファイルサーバー向け(デフォルト設定) バックグラウンド 最小経過期間:3日、使用中ファイルの最適化:なし、部分的なファイルの最適化:なし
Hyper-V VDIサーバー向け バックグラウンド 最小経過期間:3日、使用中ファイルの最適化:あり、部分的なファイルの最適化:あり
Backup バックアップストレージ向け 高い優先度 最小経過期間:0日、使用中ファイルの最適化:あり、部分的なファイルの最適化:なし

こちらについては基本的にDefaultの挙動だけ押さえておけば問題ないでしょう。

試してみた

前置きはここまでにしてここからは実際にFSx for Windowsのデータ重複排除を試していきます。
環境としては以前公開した記事と同じ環境で試しています。

本記事ではFSx for Windows環境の構築手順については割愛します。
なんらかのFSx for Windowsのファイルシステムが存在し、リモート管理用Windows Serverが準備できているところがスタート地点です。

0. リモート管理コンソールへの接続

現時点でFSx for Windowsの重複排除はマネジメントコンソールからは行えず、PowerShell Remotingを使ってCLIから行う必要があります。
Invoke-Commandを使いリモートコマンドを実行、Enter-PSSessionを使いリモートコンソールにログインしコマンド実行のどちらの方法でも問題ありませんが、今回は説明のしやすさからEnter-PSSessionを使っていきます。

以前公開した記事でも解説していますが、以下の様に所定のパラメーターを設定しEnter-PSSessionを実行することでFSx for Windowsのリモートコンソールにログインできます。

# PowerShell RemotingでFSxに接続
$cred = Get-Credential '<FSx管理者ユーザー名>'
$params = @{
    ComputerName = '<FSx for WindowsのPowerShellエンドポイント>'
    Credential = $cred
    ConfigurationName = 'FSxRemoteAdmin'
    SessionOption = (New-PSSessionOption -UICulture 'en-US')
}
Enter-PSSession @params

1. 重複排除の有効化

データ重複排除を有効にするにはEnable-FSxDedupを使います。

# データ重複排除を有効にするには Enable-FSxDedup を使う
PS > Enable-FSxDedup

これでデータ重複排除が有効になります。

2. 重複排除スケジュールの確認と変更

データ重複排除のスケジュールを確認するにはGet-FSxDedupScheduleコマンドを使います。

# Get-FSxDedupSchedule で重複排除を行うスケジュールを確認
PS > Get-FSxDedupSchedule

結果はこの様にWindows Serverの既定の設定と同じ結果を返します。
なおFSx for Windows内部はUTCで動作しているため返される時間はすべてUTCとなります。

  • 最適化(Optimization) : 1時間ごと
  • ガベージコレクション(GarbageCollection) : 毎週土曜 午前2時45分 (UTC)
  • 整合性スクラブ(Scrubbing) : 毎週土曜 午前3時45分 (UTC)

このスケジュールを変更したい場合はSet-FSxDedupScheduleNew-FSxDedupScheduleを使います。
これらのコマンドの引数はSet-DedupScheduleNew-DedupScheduleと大体同じです。

# Set-FSxDedupSchedule で重複排除を行うスケジュールを更新
#  * 毎週土曜 午前2時45分 (UTC) を 毎週土曜 午前2時45分 (JST) に更新
PS > Set-FSxDedupSchedule -Name "WeeklyGarbageCollection" -Type GarbageCollection -Days Fri -Start 17:45
#  * 毎週土曜 午前3時45分 (UTC) を 毎週土曜 午前3時45分 (JST) に更新
PS > Set-FSxDedupSchedule -Name "WeeklyScrubbing" -Type Scrubbing -Days Fri -Start 18:45

# New-FSxDedupSchedule で重複排除を行うスケジュールを新規に追加
#  * 平日 20:00 (JST) に高い優先度で最適化を行うスケジュールを追加
PS > New-FSxDedupSchedule -Name "MyCustomOptimization" -Type Optimization -Days Mon,Tues,Wed,Thu,Fri -Start 11:00 -Priority High

増やしたスケジュールを削除する場合はRemove-FSxDedupScheduleを使います。

# Remove-FSxDedupSchedule で重複排除を行うスケジュールを削除
PS > Remove-FSxDedupSchedule -Name "MyCustomOptimization"

3. 実行中の重複排除ジョブを確認する

実行中の重複排除ジョブを確認するにはGet-FSxDedupJobを使います。

# Set-FSxDedupSchedule で重複排除ジョブを取得
PS > Get-FSxDedupJob

ただ、このコマンドはまさにジョブが実行中でないとエラーを返すので正直あまり使いどころは無いかと思います。

ちなみに実行中のジョブを停止するにはStop-FSxDedupJobを使うそうですが、流石に今回は試せませんでした...

4. 重複排除の全体設定を確認する

重複排除全体の設定に関わる情報はGet-FSxDedupConfigurationGet-FSxDedupMetadataで確認できます。

# Get-FSxDedupConfiguration で全体的な設定を確認
PS > Get-FSxDedupConfiguration

# SGet-FSxDedupMetadata で各種メタデータを確認
PS > Get-FSxDedupMetadata

得られる情報は基本的に内部情報ですのでコマンドの使用頻度は低いかと思います。
確認しておきたい点としては「使用法(UsageType)」がDefaultになっている点くらいでしょうか。

また、Set-FSxDedupConfigurationを使うとSet-DedupVolumeと同様の高度な設定変更ができるのですが、正直よほどの事情が無い限りはデフォルトのままで良いのではないかと思います。

# 一応 Set-FSxDedupConfiguration で高度な設定も可能
# * ヘルプにある設定例を例示 : jpgファイルを重複排除から除外、最小経過期間を21日に、40000Byte未満のファイルを重複排除から除外に
PS > Set-FSxDedupConfiguration -ExcludeFileType jpg -MinimumFileAgeDays 21 -MinimumFileSize 40000

5. 重複排除の状況を確認する

Get-FSxDedupStatusを使うと重複排除の直近のジョブの実行結果や、最適化されたファイル数、容量の圧縮率、圧縮されたサイズといった情報を取得することができます。

# Get-FSxDedupStatus を使うと重複排除の状況を確認できる
PS > Get-FSxDedupStatus

ベストプラクティスにも載っていますがInvoke-Commandで以下の様にすると手っ取り早く圧縮率などの統計を取得することができます。

$cred = Get-Credential '<FSx管理者ユーザー名>'
$params = @{
    ComputerName = '<FSx for WindowsのPowerShellエンドポイント>'
    Credential = $cred
    ScriptBlock = { Get-FSxDedupStatus }
    ConfigurationName = 'FSxRemoteAdmin'
    SessionOption = (New-PSSessionOption -UICulture 'en-US')
}
Invoke-Command @params | Select-Object OptimizedFilesCount, OptimizedFilesSize, SavedSpace, OptimizedFilesSavingsRate

OptimizedFilesCountが最適化対象のファイル数、OptimizedFilesSizeが最適化対象のファイルサイズ、SavedSpaceが圧縮後の容量、OptimizedFilesSavingsRateが圧縮率となります。
これらの値はMSFT_DedupVolumeStatusから算出されているので詳細はこちらをご確認ください。

6. 重複排除の状況を確認する - 2

Get-FSxDedupStatus以外にUpdate-FSxDedupStatusを使っても重複排除の状況を確認することが可能です。

# Update-FSxDedupStatus でも重複排除の状況を確認できる
PS > Update-FSxDedupStatus

Update-FSxDedupStatusは特定のボリュームに対しGet-FSxDedupStatusよりより直近の詳細情報を取得するためにあるそうなのですが正直違いがわかりませんでした...

Update-DedupStatusを元にしていると思われますので、Get-DedupStatusとの違いを意識すれば良いでしょう。
(個人的にはGet-FSxDedupStatus一本で良いのではと思います。)

7. ファイル単位の重複排除状況の取得

Measure-FSxDedupFileMetadataコマンドを使うとファイル単位での重複排除状況を取得することができます。
このコマンドでは-Pathパラメーターで調べたいファイルを指定するのですが、このパスはFSx for Windows内部から見たローカルパスを指定する必要があります。

FSx for Windowsのファイルシステムは内部的にはD:ドライブに作成されており、デフォルトのファイルシステムであればD:\shareフォルダを共有しています。
このため共有フォルダ直下にあるファイルを調べる場合はD:\share\ほげほげ.txtの様に指定する必要があります。

# Measure-FSxDedupFileMetadata を使うとファイルごとの重複排除状況を確認できる
PS > Measure-FSxDedupFileMetadata -Path D:\share\<ファイル名>

上図の例では共有フォルダ直下にKEN_ALL.csv(11.7MB)を置いて試しているのですが、144のチャンクに分割され2.36MB排除できていることがわかります。

ちなみにこのコマンドはMeasure-DedupFileMetadataが元になっている様です。

8. 重複排除の無効化

データ重複排除を有効にするにはDisable-FSxDedupを使います。

# データ重複排除を無効にするには Disable-FSxDedup を使う
PS > Disable-FSxDedup

これでデータ重複排除が無効になります。

ただし、データ重複排除を無効にしてもこれまでのデータは重複排除されたままとなります。
このコマンド実行後は対象ボリュームが重複排除ジョブの対象外になる形となり、以後新規作成、更新されるファイルが重複排除されない形で保存されることになります。

より細かい挙動についてはこのコマンドの元になっているであろうDisable-DedupVolumeをご覧ください。

ちなみに、通常のWindows ServerであればStart-DedupJob -Type Unoptimizationで非最適化ジョブを呼び出すことができるのですがFSx for Windowsに同等の機能は無い様です。
完全に重複排除前に戻したい場合はファイルシステムを作り直すしか無いと思われます。

最後に

以上となります。

あまり使われない機能のせいかFSx for Windowsの重複排除機能に関する情報は公式ドキュメントですら少ない状況です。
本記事で試してみた結果、この機能はシンプルにWindows Serverの重複排除機能をラップしてる感じでした。
このため公式ドキュメントに情報が無い場合はWindows Serverの同等機能で情報が無いか探してみると良いでしょう。

本記事の内容もある程度は役に立てると思いますのでぜひ参考にしてください。

脚注

  1. Microsoftの表記では「重複除去」ですが本記事ではAWSの表記に合わせてすべて「重複排除」としています