[Amazon FSx for NetApp ONTAP] ONTAP CLIでスナップショットからファイルをまとめてリストアしてみた

ONTAP CLIでファイルをスナップショットからリストアしてみました
2022.12.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

全ファイルの状態をスナップショット時点に戻したいな

こんにちは、のんピ(@non____97)です。

皆さんは「Amazon FSx for NetApp(以降FSx for ONTAP)のスナップショットを使って、全ファイルの状態をスナップショット時点に戻したいな」と思ったことはありますか? 私はあります。

以下記事ではスナップショットによって保持されたファイルを個別にリストアしました。

しかし、リストアしたいファイルが大量にある場合は個別にリストアするのは大変です。

ONTAP CLIではスナップショットからボリューム全体をまとめてリストアすることが可能です。

「そういえばやったことないな」と思ったので、やってみました。

いきなりまとめ

  • ONTAP CLIを使えば、ボリューム全体をスナップショット取得時点にリストアすることが可能
  • 各ファイル毎に最新の状態にするのではない
    • スナップショットに含まれないファイルは削除される
  • 最新でないスナップショットからリストアした場合は、使用したスナップショット以降に取得されたスナップショットは削除される
  • ファイル単位でリストアすることも可能
    • ファイル単位でリストアしても、使用したスナップショット以降に取得されたスナップショットは削除されない
    • デフォルトだと同じパスにリストアしようとする
    • 任意のパスにリストアすることも可能

検証環境

検証環境は以下の通りです。

ファイル名がUTF-8の4バイト文字に対応するよう設定してみたの検証環境構成図

AD DCは以下記事の検証をしたときの環境をそのまま使用します。

NFSクライアントから作成された複数のファイルを一旦削除して、ONTAP CLIを使ってスナップショットからリストアします。

検証で使用するFSx for ONTAPファイルシステム、SVMは以下の通りです。

# FSx for ONTAPファイルシステム
$ aws fsx describe-file-systems
{
    "FileSystems": [
        {
            "OwnerId": "<AWSアカウントID>",
            "CreationTime": "2022-12-17T02:28:47.691000+00:00",
            "FileSystemId": "fs-01f8ffb4adbf236d1",
            "FileSystemType": "ONTAP",
            "Lifecycle": "AVAILABLE",
            "StorageCapacity": 1024,
            "StorageType": "SSD",
            "VpcId": "vpc-08b84da1f793ed513",
            "SubnetIds": [
                "subnet-08dc789896a48a3b4"
            ],
            "NetworkInterfaceIds": [
                "eni-06051c9f12db688c3",
                "eni-07ce745e24b85f6f3"
            ],
            "KmsKeyId": "arn:aws:kms:us-east-1:<AWSアカウントID>:key/365ae19c-8016-4963-9afd-05f703509254",
            "ResourceARN": "arn:aws:fsx:us-east-1:<AWSアカウントID>:file-system/fs-01f8ffb4adbf236d1",
            "Tags": [
                {
                    "Key": "aws:cloudformation:stack-name",
                    "Value": "FsxnStack"
                },
                {
                    "Key": "aws:cloudformation:logical-id",
                    "Value": "FSxforONTAPfilesystem"
                },
                {
                    "Key": "aws:cloudformation:stack-id",
                    "Value": "arn:aws:cloudformation:us-east-1:<AWSアカウントID>:stack/FsxnStack/78cdb890-5423-11ed-81fb-0eac30df53d1"
                },
                {
                    "Key": "Name",
                    "Value": "fsx-for-ontap-file-system"
                }
            ],
            "OntapConfiguration": {
                "AutomaticBackupRetentionDays": 7,
                "DailyAutomaticBackupStartTime": "16:00",
                "DeploymentType": "SINGLE_AZ_1",
                "Endpoints": {
                    "Intercluster": {
                        "DNSName": "intercluster.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com",
                        "IpAddresses": [
                            "10.0.1.113",
                            "10.0.1.84"
                        ]
                    },
                    "Management": {
                        "DNSName": "management.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com",
                        "IpAddresses": [
                            "10.0.1.106"
                        ]
                    }
                },
                "DiskIopsConfiguration": {
                    "Mode": "AUTOMATIC",
                    "Iops": 3072
                },
                "PreferredSubnetId": "subnet-08dc789896a48a3b4",
                "ThroughputCapacity": 128,
                "WeeklyMaintenanceStartTime": "6:17:00"
            }
        }
    ]
}

# SVM
$ aws fsx describe-storage-virtual-machines 
{
    "StorageVirtualMachines": [
        {
            "ActiveDirectoryConfiguration": {
                "NetBiosName": "SVM1",
                "SelfManagedActiveDirectoryConfiguration": {
                    "DomainName": "corp.non-97.net",
                    "OrganizationalUnitDistinguishedName": "OU=FSxForONTAP,DC=corp,DC=non-97,DC=net",
                    "UserName": "FSxServiceAccount",
                    "DnsIps": [
                        "10.0.1.10"
                    ]
                }
            },
            "CreationTime": "2022-12-17T02:35:55.509000+00:00",
            "Endpoints": {
                "Iscsi": {
                    "DNSName": "iscsi.svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.1.100",
                        "10.0.1.69"
                    ]
                },
                "Management": {
                    "DNSName": "svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.1.119"
                    ]
                },
                "Nfs": {
                    "DNSName": "svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com",
                    "IpAddresses": [
                        "10.0.1.119"
                    ]
                },
                "Smb": {
                    "DNSName": "SVM1.corp.non-97.net",
                    "IpAddresses": [
                        "10.0.1.119"
                    ]
                }
            },
            "FileSystemId": "fs-01f8ffb4adbf236d1",
            "Lifecycle": "CREATED",
            "Name": "SVM1",
            "ResourceARN": "arn:aws:fsx:us-east-1:<AWSアカウントID>:storage-virtual-machine/fs-01f8ffb4adbf236d1/svm-0b0149bf226af89a4",
            "StorageVirtualMachineId": "svm-0b0149bf226af89a4",
            "UUID": "90ccba40-7db3-11ed-a26f-3df7250d3ffe"
        }
    ]
}

テスト用ファイルの作成

それではテスト用ファイルを作成します。

# /vol1. を事前に作成していたマウントポイントにマウント
$ sudo mount -t nfs svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com:/vol1 /mnt/fsxn/

# マウントされていることを確認
$ df -hT -t nfs4
Filesystem                                                                   Type  Size  Used Avail Use% Mounted on
svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com:/vol1 nfs4   95G  256K   95G   1% /mnt/fsxn

# テスト用ファイル用のディレクトリの作成
$ sudo mkdir /mnt/fsxn/snapshot_test
$ cd /mnt/fsxn/snapshot_test

# テスト用ファイルの作成
$ sudo dd if=/dev/urandom of=/mnt/fsxn/snapshot_test/random_block_file bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 6.65228 s, 161 MB/s

# テスト用ファイルが作成完了確認
$ ls -l /mnt/fsxn/snapshot_test/
total 1052712
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file

ONTAP CLIで現在のボリュームの使用サイズを確認しましょう。

::> volume show-footprint -volume vol1


      Vserver : SVM1
      Volume  : vol1

      Feature                                         Used       Used%
      --------------------------------             ----------    -----
      Volume Data Footprint                            1.01GB       0%
             Footprint in Performance Tier
                                                       1.14GB     100%
             Footprint in FSxFabricpoolObjectStore
                                                           0B       0%
      Volume Guarantee                                     0B       0%
      Flexible Volume Metadata                        107.5MB       0%
      Delayed Frees                                   135.9MB       0%

      Total Footprint                                  1.24GB       0%

1.14GB使用していますね。

1ファイルだと面白くないので、このファイルのコピーを10個作成します。

# テスト用ファイルのコピーを10個作成
$ for i in {00..10}; do
   sudo cp -p /mnt/fsxn/snapshot_test/random_block_file "/mnt/fsxn/snapshot_test/random_block_file_${i}.txt"
done

# テスト用ファイルのコピーが10個作成されたことを確認
$ ls -l /mnt/fsxn/snapshot_test/
total 12632544
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_00.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_01.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_02.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_03.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_04.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_05.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_06.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_07.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_08.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_09.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_10.txt

# ボリュームの使用率を確認
$ df -hT -t nfs4
Filesystem                                                                   Type  Size  Used Avail Use% Mounted on
svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com:/vol1 nfs4   95G   13G   83G  13% /mnt/fsxn

ONTAP CLIで現在のボリュームの使用サイズを確認しましょう。

# 現在のボリュームの使用サイズの確認
::> volume show-footprint -volume vol1


      Vserver : SVM1
      Volume  : vol1

      Feature                                         Used       Used%
      --------------------------------             ----------    -----
      Volume Data Footprint                           12.07GB       1%
             Footprint in Performance Tier
                                                      12.25GB     100%
             Footprint in FSxFabricpoolObjectStore
                                                           0B       0%
      Volume Guarantee                                     0B       0%
      Flexible Volume Metadata                        214.9MB       0%
      Delayed Frees                                   185.3MB       0%

      Total Footprint                                 12.46GB       1%

# 重複排除・圧縮がされていないことを確認
::> volume show -volume vol1 -fields total, used, available, percent-used, sis-space-saved, sis-space-saved-percent, dedupe-space-saved, dedupe-space-saved-percent, dedupe-space-shared, compression-space-saved, compression-space-saved-percent
vserver volume available total used    percent-used sis-space-saved sis-space-saved-percent dedupe-space-saved dedupe-space-saved-percent dedupe-space-shared compression-space-saved compression-space-saved-percent
------- ------ --------- ----- ------- ------------ --------------- ----------------------- ------------------ -------------------------- ------------------- ----------------------- -------------------------------
SVM1    vol1   82.93GB   95GB  12.07GB 12%          0B              0%                      0B                 0%                         0B                  0B                      0%

重複排除・圧縮をしていないので12.7GBしっかり使用しています。

スナップショットの作成

それではスナップショットを作成します。

# 現在のスナップショットの数とスナップショット領域の使用量の確認
::> volume show -volume vol1 -fields snapshot-space-used, snapshot-count
vserver volume snapshot-space-used snapshot-count
------- ------ ------------------- --------------
SVM1    vol1   0%                  0


# スナップショットの作成
::> snapshot create -vserver SVM1 -volume vol1 -snapshot snapshot1

# スナップショットのサイズの確認
::> snapshot show -volume vol1
                                                                 ---Blocks---
Vserver  Volume   Snapshot                                  Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
SVM1     vol1
                  snapshot1                                172KB     0%    0%

# スナップショットの数とスナップショット領域の使用量の確認
::> volume show -volume vol1 -fields snapshot-space-used, snapshot-count
vserver volume snapshot-space-used snapshot-count
------- ------ ------------------- --------------
SVM1    vol1   0%                  1

snapshot1というスナップショットの作成ができました。

スナップショットのサイズが172KBなので、スナップショット用として予約された領域の内、使用された割合は0%となっています。なお、スナップショット用として予約された領域(Snapshot Reserve)はデフォルトではボリュームサイズの5%です。

Snapshotコピー リザーブは、ディスク スペースの特定の割合をSnapshotコピー用に設定します。 FlexVolの場合、Snapshotコピー リザーブはデフォルトで、ディスク スペースの5%に設定されます。 デフォルトのSnapshotコピー リザーブは、FlexVolの場合はディスク スペースの5%で、アグリゲートの場合は0%です。

Snapshotコピー リザーブとは

vol1のボリュームサイズは100GiBなので、スナップショット用として予約された領域のサイズは5GiBです。

NFSクライアントからスナップショットディレクトリを確認します。

# スナップショットディレクトリの確認
$ ls -l /mnt/fsxn/.snapshot
total 4
drwxr-xr-x 3 root root 4096 Dec 17 03:01 snapshot1

# スナップショットディレクトリ配下の確認
$ ls -l /mnt/fsxn/.snapshot/snapshot1/
total 4
drwxr-xr-x 2 root root 4096 Dec 17 03:02 snapshot_test

$ ls -l /mnt/fsxn/.snapshot/snapshot1/snapshot_test/
total 12632544
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_00.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_01.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_02.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_03.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_04.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_05.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_06.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_07.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_08.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_09.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_10.txt

スナップショットディレクトリにスナップショットに含まれるディレクトリ、ファイルを確認できました。

スナップショットからボリューム全体をリストア

それではスナップショットからボリューム全体をリストアします。

その前にテスト用ファイルを削除します。

$ sudo rm -rf /mnt/fsxn/snapshot_test

$ ls -l /mnt/fsxn/
total 0

$ df -hT -t nfs4
Filesystem                                                                                       Type  Size  Used Avail Use% Mounted on
svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com:/vol1                     nfs4   95G  7.1G   88G   8% /mnt/fsxn
svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com:/vol1/.snapshot/snapshot1 nfs4  5.0G  5.0G     0 100% /mnt/fsxn/.snapshot/snapshot1

テスト用ファイルが削除されました。ボリュームの空き領域を確認すると、全てのファイルを削除したはずがボリュームが7.1GB使用されていますね。またスナップショット領域も5GB中5GB全て使っています。

これはスナップショット用として予約された領域(Snapshot Reserve)の5GB分を超過したため、ボリュームのユーザーデータ領域まで使用してしまっている状態です。

削除されたテスト用ファイルのスナップショットが取得されています。そのため、ファイルを削除してもスナップショットがデータブロックを確保しているため、空き領域としては解放されません。その際、スナップショットのみが確保しているデータブロックはSnapshot Reserveに保存されます。Snapshot Reserve以上のデータブロックを確保する場合は、ボリュームのユーザーデータ領域にも保存されます(Snapshotオーバーフロー)。Snapshotオーバーフローは以下NetApp公式ドキュメントの図が非常に分かりやすいです。

  • Snapshotオーバーフローが発生していないボリューム Snapshotオーバーフローが発生していないFlexVol
  • Snapshotオーバーフローが発生しているボリューム Snapshotオーバーフローが発生しているFlexVol

抜粋 :

ONTAP CLIからもボリュームの使用量とスナップショットの使用量を確認してみます。

# ボリュームの使用量を確認
::> volume show-footprint -volume vol1


      Vserver : SVM1
      Volume  : vol1

      Feature                                         Used       Used%
      --------------------------------             ----------    -----
      Volume Data Footprint                           12.07GB       1%
             Footprint in Performance Tier
                                                      12.25GB     100%
             Footprint in FSxFabricpoolObjectStore
                                                           0B       0%
      Volume Guarantee                                     0B       0%
      Flexible Volume Metadata                        214.9MB       0%
      Delayed Frees                                   189.3MB       0%

      Total Footprint                                 12.46GB       1%

# Snapshot Reserveの使用割合とスナップショットの数の確認
::> volume show -volume vol1 -fields snapshot-space-used, snapshot-count
vserver volume snapshot-space-used snapshot-count
------- ------ ------------------- --------------
SVM1    vol1   241%                1

# スナップショットのサイズの確認
::> snapshot show -volume vol1
                                                                 ---Blocks---
Vserver  Volume   Snapshot                                  Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
SVM1     vol1
                  snapshot1                              12.06GB    12%  100%

Snapshot Reserveの使用割合が241%となっていますね。Snapshotオーバーフローが発生しているのがよく分かります。

ちなみに、Snapshotオーバーフローの対応方法は以下の4つです。

  1. Increase snap reserve (Increase volume's size or enable volume's autosize mode)
  2. Change the Snapshot retention rate
  3. Configure Snapshot autodelete
  4. Backup Snapshots to DR

What can impact snapshot size and cause snapshot spill - NetApp Knowledge Base

Snapshotオーバーフローが発生しているか気になるようでしたら、CloudWatchメトリクスのStorageUsedDataTypeディメンションSnapshotについて監視すると良いでしょう。

それでは、スナップショットからボリューム全体をリストアします。

# 現時刻の確認
::> date show
  (cluster date show)
Node      Date                      Time zone
--------- ------------------------- -------------------------
FsxId01f8ffb4adbf236d1-01
          12/17/2022 05:17:10       Etc/UTC
          +00:00
FsxId01f8ffb4adbf236d1-02
          12/17/2022 05:17:07       Etc/UTC
          +00:00
2 entries were displayed.

# スナップショットからボリューム全体をリストア
::> snapshot restore -vserver SVM1 -volume vol1 -snapshot snapshot1

Warning: Quota rules currently enforced on volume "vol1" might change during this operation. If the currently enforced
         quota rules are different from those in Snapshot copy "snapshot1", you might have to resize or reinitialize
         quotas on this volume after this operation.
Do you want to continue? {y|n}: y

Warning: Export policies currently enforced on the qtrees of volume "vol1" will not change during this operation. If
         the currently enforced export policies are different from those in Snapshot copy "snapshot1", reassign the
         export policies of the qtrees on this volume after this operation.
Do you want to continue? {y|n}: y

リストアを開始して、どのぐらいでNFSクライアントから認識されるか確認します。

$ while sleep 1; do
  date
  ls -l /mnt/fsxn/snapshot_test/
done

Sat Dec 17 05:17:18 UTC 2022
ls: cannot access /mnt/fsxn/snapshot_test/: No such file or directory
Sat Dec 17 05:17:19 UTC 2022
ls: cannot access /mnt/fsxn/snapshot_test/: No such file or directory
Sat Dec 17 05:17:20 UTC 2022
ls: cannot access /mnt/fsxn/snapshot_test/: No such file or directory
Sat Dec 17 05:17:21 UTC 2022
ls: cannot access /mnt/fsxn/snapshot_test/: No such file or directory
Sat Dec 17 05:17:22 UTC 2022
ls: cannot access /mnt/fsxn/snapshot_test/: No such file or directory
Sat Dec 17 05:17:23 UTC 2022
total 12632544
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_00.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_01.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_02.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_03.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_04.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_05.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_06.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_07.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_08.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_09.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_10.txt
^C

大体10秒ほどで12GBのファイルをリストアできました。ボリューム自体をリストアする場合は数分かかるのでかなりお手軽にリストアできますね。

NFSクライアントからボリュームのユーザー領域とスナップショット領域の現在の使用量を確認します。

$ df -hT -t nfs4
Filesystem                                                                                       Type  Size  Used Avail Use% Mounted on
svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com:/vol1                     nfs4   95G   13G   83G  13% /mnt/fsxn
svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com:/vol1/.snapshot/snapshot1 nfs4  5.0G  192K  5.0G   1% /mnt/fsxn/.snapshot/snapshot1

スナップショット領域が5GBから192KBに、ユーザー領域が7.1GBから13GBに使用量が変化しました。データブロックがスナップショット領域ではなくユーザーデータ領域に紐づくようになったのが分かります。

ONTAP CLIから確認してもSnapshot Reserveのほとんどが解放されていることが分かります。

::> volume show -volume vol1 -fields snapshot-space-used, snapshot-count
vserver volume snapshot-space-used snapshot-count
------- ------ ------------------- --------------
SVM1    vol1   0%                  1

::> snapshot show -volume vol1 -instance

                              Vserver: SVM1
                               Volume: vol1
                             Snapshot: snapshot1
                        Creation Time: Sat Dec 17 03:09:16 2022
                        Snapshot Busy: false
                       List of Owners: -
                        Snapshot Size: 216KB
           Percentage of Total Blocks: 0%
            Percentage of Used Blocks: 0%
                              Comment: -
                      7-Mode Snapshot: false
      Label for SnapMirror Operations: -
                       Snapshot State: -
                 Constituent Snapshot: false
                          Expiry Time: -
                 SnapLock Expiry Time: -

スナップショットに含まれないファイルがある状態でリストア

次に、スナップショットに含まれないファイルがある状態で、ボリューム全体をリストアします。

スナップショットからリストアする場合、「ボリューム全体」をスナップショットが取得されたタイミングにリストアするので、スナップショット取得時に含まれないファイルは削除されると予想します。

test.txtというテキストファイルを作成します。

# テキストファイルの作成
$ echo test | sudo tee /mnt/fsxn/snapshot_test/test.txt > /dev/null

# テキストファイルが作成されたことを確認
$ ls -l /mnt/fsxn/snapshot_test/
total 12632544
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_00.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_01.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_02.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_03.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_04.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_05.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_06.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_07.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_08.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_09.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_10.txt
-rw-r--r-- 1 root root          5 Dec 17 05:32 test.txt

この状態で先ほど取得したスナップショットからリストアします。スナップショットからボリューム全体をリストアする際はvolume snapshot restoreで行います。

# 現時刻の確認
::> date show
  (cluster date show)
Node      Date                      Time zone
--------- ------------------------- -------------------------
FsxId01f8ffb4adbf236d1-01
          12/17/2022 05:33:48       Etc/UTC
          +00:00
FsxId01f8ffb4adbf236d1-02
          12/17/2022 05:33:46       Etc/UTC
          +00:00
2 entries were displayed.

# スナップショットからボリューム全体をリストア
::> snapshot restore -vserver SVM1 -volume vol1 -snapshot snapshot1

Warning: Quota rules currently enforced on volume "vol1" might change during this operation. If the currently enforced
         quota rules are different from those in Snapshot copy "snapshot1", you might have to resize or reinitialize
         quotas on this volume after this operation.
Do you want to continue? {y|n}: y

Warning: Export policies currently enforced on the qtrees of volume "vol1" will not change during this operation. If
         the currently enforced export policies are different from those in Snapshot copy "snapshot1", reassign the
         export policies of the qtrees on this volume after this operation.
Do you want to continue? {y|n}: y

リストアを開始して、どのぐらいでNFSクライアントからtest.txtが認識されなくなるか確認します。

$ while sleep 1; do
  date
  ls -l /mnt/fsxn/snapshot_test/
done

Sat Dec 17 05:33:47 UTC 2022
total 12632544
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_00.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_01.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_02.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_03.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_04.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_05.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_06.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_07.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_08.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_09.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_10.txt
-rw-r--r-- 1 root root          5 Dec 17 05:32 test.txt
Sat Dec 17 05:33:48 UTC 2022
total 12632544
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_00.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_01.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_02.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_03.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_04.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_05.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_06.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_07.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_08.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_09.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_10.txt
^C

リストアした瞬間にスナップショット取得時に含まれないファイルtest.txtが削除されました。スナップショット取得時点のボリュームの状態に戻すため、各ファイル毎に最新の状態にするのではないことが分かります。

最新でないスナップショットからリストア

次に、最新でないスナップショットからリストアをしてみます。スナップショット取得時点のボリュームの状態に戻すのであれば、最新でないスナップショットからリストアすると、それ以降に取得されたスナップショットは削除されるのか確認します。

まず、snapshot2というスナップショットを作成します。

# スナップショットの作成
::> volume snapshot create -vserver SVM1 -volume vol1 -snapshot snapshot2

# スナップショットが作成されたことを確認
::> snapshot show -volume vol1
                                                                 ---Blocks---
Vserver  Volume   Snapshot                                  Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
SVM1     vol1
                  snapshot1                                220KB     0%    0%
                  snapshot2                                144KB     0%    0%
2 entries were displayed.

# Snapshot Reserveの使用量の確認
::> volume show -volume vol1 -fields snapshot-space-used, snapshot-count
vserver volume snapshot-space-used snapshot-count
------- ------ ------------------- --------------
SVM1    vol1   0%                  2

# 2つのスナップショットの差分を確認
::> snapshot show-delta -vserver SVM1 -volume vol1 -snapshot1 snapshot1 -snapshot2 snapshot2
A total of 819200 bytes (200 blocks) are different. Elapsed time between the Snapshot copies: 2h 28m 37s.

NFSクライアントからスナップショットディレクトリにアクセスして、スナップショット取得時点のファイルを確認します。

# スナップショットディレクトリから snapshot2 というスナップショットがあることを確認
$ ls -l /mnt/fsxn/.snapshot/
total 8
drwxr-xr-x 3 root root 4096 Dec 17 03:01 snapshot1
drwxr-xr-x 3 root root 4096 Dec 17 03:01 snapshot2

# snapshot2 内のディレクトリとファイルを確認
$ ls -l /mnt/fsxn/.snapshot/snapshot2
total 4
drwxr-xr-x 2 root root 4096 Dec 17 03:02 snapshot_test

$ ls -l /mnt/fsxn/.snapshot/snapshot2/snapshot_test/
total 12632544
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_00.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_01.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_02.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_03.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_04.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_05.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_06.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_07.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_08.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_09.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_10.txt

# ボリュームの使用量の確認
$ df -hT -t nfs4
Filesystem                                                                                       Type  Size  Used Avail Use% Mounted on
svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com:/vol1                     nfs4   95G   13G   83G  13% /mnt/fsxn
svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com:/vol1/.snapshot/snapshot2 nfs4  5.0G  320K  5.0G   1% /mnt/fsxn/.snapshot/snapshot2
svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com:/vol1/.snapshot/snapshot1 nfs4  5.0G  320K  5.0G   1% /mnt/fsxn/.snapshot/snapshot1

それではテスト用ファイルを削除します。

# テスト用ファイルの削除
$ sudo rm -rf /mnt/fsxn/snapshot_test

# ボリュームの使用量の確認
$ df -hT -t nfs4
Filesystem                                                                                       Type  Size  Used Avail Use% Mounted on
svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com:/vol1                     nfs4   95G  7.1G   88G   8% /mnt/fsxn
svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com:/vol1/.snapshot/snapshot2 nfs4  5.0G  5.0G     0 100% /mnt/fsxn/.snapshot/snapshot2
svm-0b0149bf226af89a4.fs-01f8ffb4adbf236d1.fsx.us-east-1.amazonaws.com:/vol1/.snapshot/snapshot1 nfs4  5.0G  5.0G     0 100% /mnt/fsxn/.snapshot/snapshot1

Snapshot Reserve以上のサイズのファイルを削除したため、Snapshotオーバーフローが発生しています。snapshot1snapshot2どちらも100%になっていますね。

ONTAP CLIからも確認してみましょう。

::> volume show -volume vol1 -fields snapshot-space-used, snapshot-count
vserver volume snapshot-space-used snapshot-count
------- ------ ------------------- --------------
SVM1    vol1   241%                2

::> snapshot show -volume vol1
                                                                 ---Blocks---
Vserver  Volume   Snapshot                                  Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
SVM1     vol1
                  snapshot1                                220KB     0%    3%
                  snapshot2                              12.06GB    12%  100%
2 entries were displayed.

どうやらsnapshot2の方でSnapshotオーバーフローが発生しているようです。1つ前のスナップショットであるsnapshot1snapshot1snapshot2との差分情報のみ保持するので220KBと変動ありません。一方、最新のスナップショットであるsnapshot2snapshot2と現時点との差分を保持しているので、12.06GBとなっています。

それでは、この状態でsnapshot1からリストアします。

# 現時刻の確認
::> date show
  (cluster date show)
Node      Date                      Time zone
--------- ------------------------- -------------------------
FsxId01f8ffb4adbf236d1-01
          12/17/2022 05:46:36       Etc/UTC
          +00:00
FsxId01f8ffb4adbf236d1-02
          12/17/2022 05:46:34       Etc/UTC
          +00:00
2 entries were displayed.

# スナップショットからボリューム全体をリストア
::> snapshot restore -vserver SVM1 -volume vol1 -snapshot snapshot1

Warning: Snapshot copy "snapshot1" is not the most recent copy. Promoting this Snapshot copy will delete all copies
         made after it.
Do you want to continue? {y|n}: y

Warning: Quota rules currently enforced on volume "vol1" might change during this operation. If the currently enforced
         quota rules are different from those in Snapshot copy "snapshot1", you might have to resize or reinitialize
         quotas on this volume after this operation.
Do you want to continue? {y|n}: y

Warning: Export policies currently enforced on the qtrees of volume "vol1" will not change during this operation. If
         the currently enforced export policies are different from those in Snapshot copy "snapshot1", reassign the
         export policies of the qtrees on this volume after this operation.
Do you want to continue? {y|n}: y

「最新じゃないsnapshot1からリストアすると以降のスナップショットは削除されるよ」と警告されました。そんなことお構いなしです。リストアします。

リストアを開始して、どのぐらいでNFSクライアントから認識されるか確認します。

$ while sleep 1; do
  date
  ls -l /mnt/fsxn/snapshot_test/
done

Sat Dec 17 05:46:32 UTC 2022
ls: cannot access /mnt/fsxn/snapshot_test/: No such file or directory
Sat Dec 17 05:46:33 UTC 2022
ls: cannot access /mnt/fsxn/snapshot_test/: No such file or directory
.
.
(中略)
.
.
Sat Dec 17 05:47:26 UTC 2022
ls: cannot access /mnt/fsxn/snapshot_test/: No such file or directory
Sat Dec 17 05:47:27 UTC 2022
ls: cannot access /mnt/fsxn/snapshot_test/: No such file or directory
Sat Dec 17 05:47:28 UTC 2022
ls: cannot access /mnt/fsxn/snapshot_test/: No such file or directory
Sat Dec 17 05:47:29 UTC 2022
total 12632544
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_00.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_01.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_02.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_03.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_04.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_05.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_06.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_07.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_08.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_09.txt
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_10.txt

今回は50秒ほどでリストアできました。

ONTAP CLIからスナップショットの一覧を確認します。

# スナップショットの個数の確認
::> volume show -volume vol1 -fields snapshot-space-used, snapshot-count
vserver volume snapshot-space-used snapshot-count
------- ------ ------------------- --------------
SVM1    vol1   0%                  1

# スナップショットの確認
::> snapshot show -volume vol1
                                                                 ---Blocks---
Vserver  Volume   Snapshot                                  Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
SVM1     vol1
                  snapshot1                                216KB     0%    0%

snapshot2は削除され、リストアに使用したsnapshot1のみになりました。スナップショットからリストアするとユーザーデータ領域だけでなく、スナップショット領域もリストアされることが分かりました。

スナップショットからファイル単位でリストア

最後にスナップショットからファイル単位でリストアしてみます。併せて1ファイルのみリストアする場合は、リストアに使用したスナップショット以降のスナップショットが削除されないことを確認します。

snapshot2というスナップショットを作成します。

# スナップショットの作成
::> volume snapshot create -vserver SVM1 -volume vol1 -snapshot snapshot2

# スナップショットが作成されたことを確認
::> snapshot show -volume vol1
                                                                 ---Blocks---
Vserver  Volume   Snapshot                                  Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
SVM1     vol1
                  snapshot1                                220KB     0%    0%
                  snapshot2                                144KB     0%    0%
2 entries were displayed.

スナップショットが作成されたら、テスト用ファイルを削除します。テスト用ファイル削除後、ボリューム全体がスナップショット取得時点に巻き戻らないことを確認するラメにtest.txtというテキストファイルを作成します。

# テスト用ファイルの削除
$ sudo rm -rf /mnt/fsxn/snapshot_test

# テスト用ファイルが削除されたことを確認
$ ls -l /mnt/fsxn/
total 0

# テキストファイルの作成
$ echo test | sudo tee /mnt/fsxn/test.txt > /dev/null

# テキストファイルが作成されたことを確認
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root 5 Dec 17 05:58 test.txt

それでは、スナップショットからファイル単位でリストアします。リストアするファイルは/snapshot_test/random_block_fileです。ファイル単位でのリストアはvolume snapshot restore-fileで行います。

# Snapshot Reserveの使用割合とスナップショットの数の確認
::> volume show -volume vol1 -fields snapshot-space-used, snapshot-count
vserver volume snapshot-space-used snapshot-count
------- ------ ------------------- --------------
SVM1    vol1   241%                2

# スナップショットのサイズの確認
::> snapshot show -volume vol1
                                                                 ---Blocks---
Vserver  Volume   Snapshot                                  Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
SVM1     vol1
                  snapshot1                                220KB     0%    2%
                  snapshot2                              12.06GB    12%  100%
2 entries were displayed.

# /snapshot_test/random_block_file のリストア
::> volume snapshot restore-file -vserver SVM1 -volume vol1 -snapshot snapshot1 -path /snapshot_test/random_block_file

Error: command failed: Failed to restore file from Snapshot copy snapshot1 for volume "vol1" on Vserver "SVM1".
       Reason: Directory does not exist.

# リストア先のディレクトリを指定してリストア
::> volume snapshot restore-file -vserver SVM1 -volume vol1 -snapshot snapshot1 -path /snapshot_test/random_block_file -restore-path /random_block_file_restore

# Snapshot Reserveの使用割合とスナップショットの数の確認
::> volume show -volume vol1 -fields snapshot-space-used, snapshot-count
vserver volume snapshot-space-used snapshot-count
------- ------ ------------------- --------------
SVM1    vol1   221%                2

# スナップショットのサイズの確認
::> snapshot show -volume vol1
                                                                 ---Blocks---
Vserver  Volume   Snapshot                                  Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
SVM1     vol1
                  snapshot1                                220KB     0%    0%
                  snapshot2                              11.06GB    11%   92%
2 entries were displayed.

リストアしたいファイルのパス上のディレクトリも一緒にリストアしてくれると思いましたが、そのような挙動はしないようです。-restore-pathでリストア先のパスを指定したところリストアできました。

また、リストアに使用したスナップショット以降に取得されたスナップショットは削除されてませんでした。加えて、1ファイルのみリストアしたのでsnapshot2のサイズが12.06GBから11.06GBと減っています。

NFSクライアントからsnapshot2取得後に作成したテキストファイルが残っていることを確認します。

$ ls -l /mnt/fsxn/
total 1052712
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_restore
-rw-r--r-- 1 root root          5 Dec 17 05:58 test.txt

残っていますね。ファイル単位でリストアする場合は、他のファイルやスナップショットに影響を与えないようです。

最後に、リストアしたいファイルのパス上のディレクトリを用意した状態でリストアします。

snapshot_testというディレクトリを作成します。

# ディレクトリの作成
$ sudo mkdir /mnt/fsxn/snapshot_test

# ディレクトリが作成できたことを確認
$ ls -l /mnt/fsxn/
total 1052716
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file_restore
drwxr-xr-x 2 root root       4096 Dec 17 06:25 snapshot_test
-rw-r--r-- 1 root root          5 Dec 17 05:58 test.txt

この状態で-restore-pathを指定せずにリストアします。

# スナップショットからリストア
::> volume snapshot restore-file -vserver SVM1 -volume vol1 -snapshot snapshot1 -path /snapshot_test/random_block_file

# スナップショットのサイズの確認
::> snapshot show -volume vol1
                                                                 ---Blocks---
Vserver  Volume   Snapshot                                  Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
SVM1     vol1
                  snapshot1                                220KB     0%    0%
                  snapshot2                              11.06GB    11%   92%
2 entries were displayed.

# Snapshot Reserveの使用割合とスナップショットの数の確認
::> volume show -volume vol1 -fields snapshot-space-used, snapshot-count
vserver volume snapshot-space-used snapshot-count
------- ------ ------------------- --------------
SVM1    vol1   221%                2

エラーなくリストアできました。先の検証で/random_block_file_restoreにもリストアしているため、スナップショットのサイズは変わりませんでした。/random_block_file_restore/snapshot_test/random_block_fileとで別ファイルですが参照している同じデータブロックのようです。

NFSクライアントからもリストアできていることを確認します。

$ ls -l /mnt/fsxn/snapshot_test/
total 1052712
-rw-r--r-- 1 root root 1073741824 Dec 17 02:59 random_block_file

リストアできていますね。

ONTAP CLIでファイルをスナップショットからリストアしてみました

ONTAP CLIでスナップショットでファイルをまとめてリストアしてみました。

バックアップからボリューム自体をリストアするのはかなり時間がかかるので、スナップショットからリストアするのがかなり便利そうですね。

ただし、ボリューム内の全てのファイルやディレクトリをスナップショットからリストアする際は影響範囲も大きくなります。複数の部門やグループ、プロジェクトなどで一つのボリュームを共有して使用している場合は、合意形成にかなり時間がかかると予想されます。その場合、リストアする際は基本的にファイル単位になるのかなと考えます。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!