オンプレデータをクラウドに階層化するONTAP FabricPoolカンタンCLI設定ガイド


#概要
NetApp ONTAPの階層化機能であるFabricPoolを検証する際に、コピペで簡単に設定できるようにCLIをまとめます。
FabricPoolの技術的な詳細は、「3. 関連情報」をご確認ください。
ノウハウや注意事項、ハマりポイントを文中に記載しています。
Proxyを経由したFabricPool設定は少しややこしいので、別記事で紹介予定です。

#目次
1. FabricPoolの前提条件
2. 設定手順
2.0. FabricPoolライセンスキーの投入
2.1. 時刻同期
2.2. ONTAPのhosts/DNS設定
2.3. 名前解決の確認と疎通確認
2.4. FabricPool設定
2.5. 簡易性能テスト
2.6. 各種運用コマンド

3. 関連情報

#1. FabricPoolの前提条件
- NetAppストレージの対応機種
    - FAS2600シリーズ、FAS2700シリーズ
    - FAS8000シリーズ
　(FAS8040/FAS8060/FAS8080/FAS8200/FAS8300/FAS8700/FAS9000)
    - AFFシリーズ
　(C190/A200/A220/A250/A300/A320/A400/A700/A800/AFF8040/AFF8060/AFF8080)
**※FAS25xxシリーズとFAS/AFF8020はCPUコア数の関係で非対応**

- ONTAPバージョン
    - ONTAP9.2以上  
※ここでの手順はONTAP9.8を想定して記載しています。  
※旧バージョンでもほぼ同じ手順を利用できますが、エラーになった場合にはそのバージョンのONTAPマニュアルを参照ください。

- 対象オブジェクトストレージ
    - AWS S3とその互換ストレージや、NetApp StorageGRIDのS3 APIを前提に記載しています。
    - AzureやIBM ICOS等の設定はCLIの引数に多少違いがあります。ONTAPにFabricPoolのライセンスキーを入れた状態でCLIの引数に「?」を入力して、引数を確認してみてください。  
    -  例1：storage aggregate object-store config create -object-store-name aaaa -server aaa.bbb.com -container-name bucket -provider-type ?  
    -  例2：storage aggregate object-store config create -object-store-name aaaa -server aaa.bbb.com -container-name bucket -provider-type **<font color="Red">GoogleCloud ?</font>**   


- オブジェクトストレージの設定
    - 階層化先のS3バケットを手動で作成済であること。
    - FAS/AFFシリーズからPUT/GET等を受けられること。  
※AWS S3をCloud Tierに設定する際はONTAP OSにAccess KeyとSecret Access Keyを設定しますが、以下の権限が必要です。  
"s3:ListAllMyBuckets",  
"s3:ListBucket",  
"s3:GetBucketLocation",  
"s3:GetObject",  
"s3:PutObject",  
"s3:DeleteObject  
■AWSのマニュアルリンク(Creating a role to delegate permissions to an IAM user)  
https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html  
事前にS3ブラウザやAWS CLI等で操作可能か確認しておくと確実です。  


- 本手順でカバーしないONTAPに必要な事前設定
    - オブジェクトストレージと通信するInterCluster LIFの作成  
(SnapMirror用途のLIFをFabricPool用に流用可能。)  
**<font color="Red">FAS/AFFのコントローラ毎にIntercluster LIFを1つずつ作る必要があります。</font>**  
    - ~~FabricPoolライセンスの投入~~  手順を追記しました。  
評価ライセンスキーの入手は、以下の情報を添えてNetApp社の営業・SEまで依頼してください。  
::> cluster identity show  
~~::> system node show -node NODE_NAME　(HA構成の場合は2コントローラ分)~~  
::> license show-serial-numbers -instance  

※ 階層化先のオブジェクトストレージがStorageGRIDの場合はライセンス不要。
※ 階層化先が富士通クラウドの「FUJITSU Hybrid IT Service FJcloud-O」の第三リージョンのオブジェクトストレージの場合はライセンス不要だが、Proxyサーバが最低1台必要(冗長は２台)。
※ 階層化元のストレージがNetApp CVO(Cloud Volumes ONTAP)の場合は、階層化先オブジェクトストレージの種類にかかわらずライセンス不要。


#2. 設定手順
##2.0. FabricPoolライセンスキーの投入
ライセンスキーが不要な使い方をしている人は手順2.1から実行してください。
ここではONTAP9.8のSystem ManagerのGUIを使っています。

System Manager GUIからライセンスキーを投入します。 (ここだけGUIです)
「Cluster」→「Settings」→「License」画面の右矢印を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001215/588772a2-8e29-2c6b-075a-626dfa175448.png)

「Add」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001215/5d7afe00-5dc3-5bf9-5e7f-7beb6e997a1b.png)

「Browse」でNetApp社から入手したライセンスキーファイルを選択し、「Add」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001215/47c95343-1f88-4107-5265-b91177d98222.png)

ライセンス画面の「FabricPool」でキーが入っているか確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001215/ff151b5e-a439-0a16-643c-a62dca20c973.png)


CLIでライセンスキーの状態確認
(Cloud Tierに階層化済みの容量と、許可されたライセンス上限を確認。)

```
ise-select::> system license show-status
Status    License              Scope     Detailed Status
--------- -------------------  --------- ----------------------
eval
          Select               node      ise-select-01: Currently using 0B. Evaluation license expires as of: 6/8/2021 10:03:28.
valid
          NFS                  cluster   -
          CIFS                 cluster   -
          iSCSI                cluster   -
          SnapRestore          cluster   -
          SnapMirror           cluster   -
          FlexClone            cluster   -
          SnapVault            cluster   -
          VE                   cluster   -
          FabricPool           cluster   The system is using 0B. The system can use up to 1TB.
not-installed
          FCP                  -         -
          SnapLock             -         -
          SnapManagerSuite     -         -
          SnapProtectApps      -         -
          V_StorageAttach      -         -
          Insight_Balance      -         -
          OCShift              -         -
          TPM                  -         -
          DP_Optimized         -         -
          SnapMirror_Sync      -         -
          NVMe_oF              -         -
          MT_EK_MGMT           -         -
          S3                   -         -
          SnapMirror_Cloud     -         -
not-applicable
          Cloud                -         -
          CapacityPool         -         -
26 entries were displayed.
```

##2.1. 時刻同期

```
(1) タイムゾーン設定
::> time -timezone Japan
::> date

(2) NTPサーバ指定
::> cluster time-service ntp server show
::> cluster time-service ntp server create -server ntp.nict.jp

(2)' NTPを使わず、手動設定の場合
::> date –u YYYYMMDDHHMM.SS
::> cluster date modify -u YYYYMMDDHHMM.SS
```

##2.2. ONTAPのhosts/DNS設定
ONTAPがオブジェクトストレージのFQDNを名前解決するために必要です。

```
(1) Hostsを使う場合
::> vserver services name-service dns hosts show
::> vserver services name-service dns hosts create -vserver <AdminSVM> -address <解決先IPアドレス> -hostname <CloudTierのFQDN>

(1)' DNSを使う場合
::> vserver services name-service dns show
::> vserver services name-service dns create -vserver <AdminSVM> -domains <任意の文字列> -name-servers <DNSサーバIP1>,<DNSサーバIP2>
```

##2.3. 名前解決の確認と疎通確認
名前解決の確認は必須で行います。
疎通確認は対向のオブジェクトストレージがPingに応答しないこともあるので、応答が無くても正常な場合もあります。この場合はInterCluster LIFからtracerouteで途中まで通信できているかを確認すると同時に、InterCluster LIFと同じセグメントに仮想サーバを立てて、S3ブラウザ等でPUT/GETのテストをすると確実です。

```
(1) 名前解決の確認
::> ping -lif <InterCluster_LIF-A> –vserver <AdminSVM> -destination <CloudTierのFQDN>
::> traceroute -lif <InterCluster_LIF-A> -vserver <AdminSVM> -destination <CloudTierのFQDN>

(2) 疎通確認
::> ping -lif <InterCluster_LIF-A> –vserver <AdminSVM> -destination <CloudTierのIPアドレス>
::> ping -lif <InterCluster_LIF-B> –vserver <AdminSVM> -destination <CloudTierのIPアドレス>
::> traceroute -lif <InterCluster_LIF-A> -vserver <AdminSVM> -destination <CloudTierのIPアドレス>
::> traceroute -lif <InterCluster_LIF-B> -vserver <AdminSVM> -destination <CloudTierのIPアドレス>
```

##2.4. FabricPool設定
実際の設定コマンドを順に記載しますが、(2)の手順で一度アグリゲートにバケットを登録すると後で解除するにはアグリゲートを壊す必要があるため、以下の(1)の操作が終わって(2)を行う前に手順の「2.5. 簡易性能テスト」を行うことをおすすめします。

```
(1) オブジェクトストレージのクラスタへの登録
::> storage aggregate object-store config show
::> storage aggregate object-store config create -object-store-name <CloudTier名(=任意の文字列)> -provider-type SGWS -server <CloudTierのFQDN> -is-ssl-enabled true -port 443 -container-name <手動作成したバケット名> -ipspace Default -use-http-proxy false -access-key <ACCESS_KEY> -secret-password <SECRET_ACCESS_KEY> -is-certificate-validation-enabled false

(2) アグリゲートとオブジェクトストレージの紐づけ
::> storage aggregate object-store attach -aggregate <アグリゲート名> -object-store-name <CloudTier名(前の手順で付けたobject-store-name)> -allow-flexgroup false
::> storage aggregate object-store show

(3) FlexVolumeの階層化をONにする設定 (これを設定しないとnone(=OFF)の状態です。)
::> volume modify -vserver <SVM名> -volume <対象Volume名> -tiering-policy auto
::> volume object-store tiering show    <---ONTAP9.8以降で追加されました
```


###(1) オブジェクトストレージのクラスタへの登録
::> storage aggregate object-store config create
アグリゲートのFabricPool関連の各種オプションの説明は以下に記載があります。
(ONTAP9.8マニュアル)
https://docs.netapp.com/ontap-9/index.jsp?topic=%2Fcom.netapp.doc.dot-cm-cmpr-980%2Fstorage__aggregate__object-store__config__create.html

`storage aggregate object-store config create`で-provider-typeはAWS_S3, Azure_Cloud, SGWS, IBM_COS, AliCloud, GoogleCloud, ONTAP_S3, 等を指定できますが、SGWSとONTAP_S3以外はFabricPoolライセンスを入力しないとCLIの引数の候補が表示されません。また、S3互換ストレージ(Ceph, EMC ECS, Scality, Cloudian等)を使う場合には、`S3_Compatible`を指定します。

```
ise-select::> storage aggregate object-store config create -object-store-name aaaa -server aaa.bbb.com -container-name bucket -provider-type ?
  AWS_S3                      AWS S3
  SGWS                        StorageGRID Webscale
  Azure_Cloud                 Microsoft Azure Cloud
  S3_Compatible               S3 Compatible
  IBM_COS                     IBM Cloud Object Storage
  AliCloud                    Alibaba Cloud Object Storage Service
  GoogleCloud                 Google Cloud Storage
  ONTAP_S3                    ONTAP S3
```

`-server <CloudTierのFQDN>`ではONTAPにオブジェクトストレージのFQDNを指定していますが、ONTAP9.7P3以降はさらに追加の`-url-style`引数でオブジェクトストレージ側の仕様に合わせて以下の2種類を選べるようになっています。(指定をしなければpath-styleがデフォルト。)

```
ise-select::> storage aggregate object-store config create -object-store-name aaaa -server aaa.bbb.com -container-name bucket -provider-type S3_Compatible -url-style ?
  path-style
  virtual-hosted-style
```

設定例) NTT Communications社のWasabiオブジェクトストレージを登録する場合

```
ise-select::> storage aggregate object-store config create -object-store-name NTTCOM_WASABI -provider-type S3_Compatible -server s3.ap-northeast-1.wasabisys.com -is-ssl-enabled true -port 443 -container-name bucket01 -ipspace Default -use-http-proxy false -access-key ******************** -secret-password **************************************** -is-certificate-validation-enabled false

Warning: Object store provider type "S3_Compatible" is a third party Object Store Service. NetApp does not support nor will be liable
         for any issues arising from any third party Object Store Service, specifically where it does not have agreed support
         arrangements with the third party with whom the product originated. It is acknowledged and agreed that NetApp shall not be
         liable for any associated damage or otherwise be required to provide support on that third party product.
Do you want to continue? {y|n}: y

Warning: Disabling certificate validation prevents verification of identities of an object store server.
Do you want to continue? {y|n}: y
```

設定例) 設定結果の確認

```
ise-select::> object-store config show -object-store-name NTTCOM_WASABI
  (storage aggregate object-store config show)

                  Object Store Configuration Name: NTTCOM_WASABI
           UUID of the Object Store Configuration: 67e9a794-96b5-11eb-b63c-00a0b8e196af
                Type of the Object Store Provider: S3_Compatible
   Authentication Used to Access the Object Store: key
URL to Request Temporary Credentials for C2S Account: -
Fully Qualified Domain Name of the Object Store Server: s3.ap-northeast-1.wasabisys.com
                               Is SSL/TLS Enabled: true
                  Port Number of the Object Store: 443
                       Data Bucket/Container Name: bucket01
   Access Key ID for S3 Compatible Provider Types: ********************
                                    Azure Account: -
IPspace to Use in Order to Reach the Object Store: Default
             IAM Role for AWS Cloud Volumes ONTAP: -
        Is SSL/TLS Certificate Validation Enabled: false
                                   Use HTTP Proxy: false
The Name of the Cluster to which the Configuration Belongs: ise-select
               URL Style Used to Access S3 Bucket: path-style
```

###(2) アグリゲートとオブジェクトストレージの紐づけ
::> storage aggregate object-store attach -aggregate　コマンド

(1)の作業はクラスタにオブジェクトストレージの定義を設定しました。しかしそのオブジェクトストレージがどのアグリゲートのデータの階層化を受けるかはまだ決まっていません。そこでアグリゲートとオブジェクトストレージを紐づける必要があります。
このコマンドは以下のマニュアル(9.8)をみても、引数は少ないので迷わず設定できるかと思います。
https://docs.netapp.com/ontap-9/topic/com.netapp.doc.dot-cm-cmpr-980/storage__aggregate__object-store__attach.html
1点だけ注意としては、一度アグリゲートに割り当てたオブジェクトストレージは割り当て解除ができません。（アグリゲートを壊すことで外すことはできます。）

余談ですが、もしできるだけクラウドコストを下げるためにオブジェクトストレージにデータを送信したくない場合は、上記設定を行った後にスレッシュホールドを変更することも可能です。

```
::> set advanced
::> storage aggregate object-store modify -aggregate <アグリゲート名> -tiering-fullness-threshold <数字>
```

デフォルトではアグリゲートの使用率が50％を超えないとクラウドに階層化しません。ローカルディスクが空いているのにクラウドを使うのは無駄だからです。この数値を70や80に増やすことで、階層化が行われ始めるタイミングを遅くできます。しかしこの値を大きくしすぎるとオンプレミス側で急激な書き込みがあった場合にDISK FULLになるので、過去1か月間のデータ増加率などを確認しながら設定をチューニングしてみてください。


###(3) FlexVolumeの階層化をONにする設定 (これを設定しないとnone(=OFF)の状態です。)
アグリゲートにオブジェクトストレージを割り当てても、まだ階層化は行われません。FabricPoolの階層化はFlexVolume単位でON/OFFできます。この変更はFlexVolumeのオプションを指定することで制御します。

FlexVolumeのFabricPool関連の各種オプションの説明は以下です。
(ONTAP9.8マニュアル)
http://docs.netapp.com/ontap-9/topic/com.netapp.doc.dot-cm-cmpr-980/volume__modify.html
　
　-tiering-policy {snapshot-only|auto|none|all} 
　-cloud-retrieval-policy {default|on-read|never|promote}  <--ONTAP9.8以降。advanced権限が必要
　-tiering-minimum-cooling-days {2..183} 
　-tiering-object-tags <text>, ... 

詳細は上記マニュアルに記載されているので、ご確認ください。
最低限、`-tiering-policy`をautoかsnapshot-onlyにして、`-tiering-minimum-cooling-days`を最小の2日にすると、その期間アクセスのない4Kブロック(ファイル単位ではなくブロック単位です)は1000個まとめて1つのオブジェクトとしてオブジェクトストレージに格納されます。

##2.5. 簡易性能テスト
以下のコマンドを実行すると、1-2分かけてオブジェクトストレージにPUT/GETを繰り返します。object-store profiler showを何度か実行して、途中経過を確認してみてください。
このコマンドは2.4.の手順の(1)が終わった後に実行できるので、次の(2)のアグリゲートへの紐づけをする前にテストすることをお勧めします。(オブジェクトストレージを外すためにアグリゲートを壊さなくても良いように・・・。)

```
SR-A200-03::*> set advanced
SR-A200-03::*> storage aggregate object-store profiler start -object-store-name <CloudTier名(=任意の文字列)> -node SR-A200-03-01
SR-A200-03::*> storage aggregate object-store profiler show
Object store config name: sgws_985
Node name: SR-A200-03-01
Status: Done
Start time: 11/19/2019 18:06:25

Op      Size       Total     Failed             Latency(ms)          Throughput
                                        min       max       avg
-------------------------------------------------------------------------------
PUT     4MB        1137      0         1112      7391      2677      73.98MB
GET     4KB        35836     0         88        1398      333       3.08MB
GET     8KB        35192     0         155       1408      753       6.00MB
GET     32KB       30038     0         81        2123      1400      20.21MB
GET     256KB      12173     0         347       9038      2313      65.47MB
5 entries were displayed.
```

ここでFailedが多発する、もしくはスループットが途中経路の回線速度に比べて極端に低い場合は実用に耐えられない場合があるので、実運用を始める前に原因を調査して安定してオブジェクトストレージと通信できるようにすることを推奨します。

オブジェクトストレージ側でTCPコネクション数の制限をかけている場合は、上記テストでFailedが多発することがあります。1つのソースIPからオブジェクトストレージに何本のTCPコネクションを確立できるのか、クラウド側の制限を確認してみてください。


**注意：
ここでのテスト結果と実際のFabricPoolの性能は異なります。特にクラウドへのPUTに関しては、FAS/AFFコントローラのCPU負荷が高くなると自動でコントローラ単位で帯域制限がかかり、ユーザI/Oなどを優先するようになっています。**


##2.6. 各種運用コマンド

###Aggregateコマンド

```
::*> storage aggregate object-store show –aggregate *

  (storage aggregate object-store show)
Aggregate      Object Store Name Availability   Mirror Type
-------------- ----------------- -------------  -----------
aggr1          sgws_001          available      primary
```

```
::> storage aggregate object-store show-space –aggregate *
　　　　　　　　　　　　　　　　　　　　　　　　　　　　License 
Aggregate    Object Store Name Provider Type Used Space Space Used% 
------------ ----------------- ------------- ---------- ------------ 
aggr1        aws_bucket        AWS_S3        423.3GB    41% 
```

```
::*> node run –node <ノード名> aggr status -v
```

↑「tier_unavailable」となっていないことを確認。

```
::*> aggr show-space

Aggregate : aggr1
Performance Tier
Feature                                          Used      Used%
--------------------------------           ----------     ------
Volume Footprints                              6.53TB        49%
Aggregate Metadata                                 0B         0%
Snapshot Reserve                                   0B         0%
Total Used                                     5.30TB        40%

Total Physical Used                            5.24TB        39%

Aggregate : aggr1
Object Store: SGWS-FabricPool
Feature                                          Used      Used%
--------------------------------           ----------     ------
Referenced Capacity                            2.96TB          -
Metadata                                           0B          -
Unreclaimed Space                             20.08MB          -
Space Saved by Storage Efficiency             356.8GB          -

Total Physical Used                            2.61TB          -
```

↑ 物理的に消費しているのが2.61TB。
Performance Tierから参照されているデータ量は2.96TB
＝356.8GBはPerformance Tier側から複数のブロックがクラウド上のデータを参照している。(オンプレ側で重複排除が効いたデータがコールドと判定され、クラウドに移動している。)

###FlexVolume系のコマンド

```
::> volume object-store tiering show   <---ONTAP9.8以降
                                                  Policy
Vserver Volume Aggregate State   %Complete  Tiering   CloudRetrieve LastStatus
------- ------ --------- -------- --------- --------- ------------- ----------
vs1     vol    aggr1     waiting          - snapshot-only
                                                      default       completed
```


```
::> volume show-footprint 
　Vserver : svm1
　Volume  : volume_fabricpool_on
　
　Feature                                          Used    Used%
　--------------------------------           ----------    -----
　Volume Data Footprint                         364.9GB       2%
　Footprint in Performance Tier                  7.01GB       2%
　Footprint in sgws_304                         360.0GB      98%
　Volume Guarantee                                   0B       0%
　Flexible Volume Metadata                       2.09GB       0%
　Deduplication                                  2.12GB       0%
　Delayed Frees                                  2.11GB       0%
　
　Total Footprint                               371.2GB       2%
```

###その他コマンド

```
::*> event log show -event *object.store.full*
Time                Node             Severity      Event
------------------- ---------------- ------------- ---------------------------
7/28/2019 18:01:15  cluster-01        ALERT         object.store.full: Failed to write to object store sgws_985 because it is out of space.
```

```
::*> statistics show -object wafl_comp_aggr_bin -counter cloud_bin_operation –raw

Object: wafl_comp_aggr_bin
Instance: aggr1_bin_1
Start-time: 11/21/2018 11:00:50
End-time: 11/21/2018 11:00:50
Scope: anilt-vsim1
 
    Counter                                                     Value
    -------------------------------- --------------------------------
    cloud_bin_operation                                             -
                                 GET                            21271
                                 PUT                              570
                              DELETE                              274
```


##2.7. トラブルシュートのログ
基本的には以下のevent log showで概要がわかりますが、

```
::> event log show –node * –message-name *
```

根が深い場合やもっとオブジェクトストレージからの応答を確認したい場合は、以下の方法でmgwd.logとsktrace.logも確認してみてください。

ブラウザで以下にアクセスし、クラスタ管理者でログインすると、
　　**https://クラスタ管理IP/spi/**
ノード単位でlogs -> mlog下にログが格納されているのでそのままローカルにログファイルをダウンロードできます。


#3. 関連情報
1. 富士通 ETERNUS AX/HXのFabricPool設定マニュアル  
    https://www.fujitsu.com/downloads/JP/jstrg/manual/abhb_axhx/p3ag-5662.pdf  
FJCLOUD-Oのオブジェクトストレージに階層化する場合はテクニックが必要なので、製品マニュアルとサポートページをご確認ください。(Tipsが載ったサイトを見つけたら、リンクを追記します。)
2. NetApp社のFabricPoolのテクニカルレポート  
    https://www.netapp.com/pdf.html?item=/media/17239-tr4598pdf.pdf
3. **＜追記中＞**  

※ Proxyを経由したFabricPool設定は少し長くなるので別記事にします。


**SoftBank C&S社のブログ**

https://licensecounter.jp/engineer-voice/blog/articles/20200903_netappfabricpool.html