10人程度で用いる安価NASの構成検討メモ

# はじめに
- 10人程度の団体でNASを導入する場合の検討メモ。
    - システムドライブは**PC内蔵のSSD**を用いる。
    - データドライブは**NASのデータ**を用いる。
        - ここで用いるNASをどう構成するか
- これはあくまで構想メモであり、実際にこの構成で行うわけではない
- 本記事の情報は自己責任で利用すること
    - 本記事の内容に関しトラブル、損害が生じた場合であっても、損害賠償その他一切の責任を負担しない


## 参考リンク
[Raid-Z, Mirrored VDEV, ハードウェアRAIDの性能比較](https://arstechnica.com/gadgets/2020/05/zfs-versus-raid-eight-ironwolf-disks-two-filesystems-one-winner/)


# 必要条件
- 早い書き込み、読み出し速度
    - ZFSの以下の条件を用いる
        - HDDはCMRのものを用いる(SMRだと速度が大幅減少する)
        - RAIDzではなくmirrored VDEVを使う
        - SSD、RAMキャッシュを用いる
- NASへの接続速度をスイッチングハブでボトルネックさせない
    - __2Gbps以上__の速度が出ると考えられる
    - __安価__に通信速度の改善を行う
        - 2.5Gbeのスイッチは高価
        - __link aggregation(LAG)__を行う
            - 複数のギガビット配線をまとめて通信速度を底上げすることができる
            - スマートなL2スイッチの購入が必要
                - 安価なものをヤフオクで購入することができる
                    - 数千円
                    - ファンレス、ファンを止められる機種を選ぶことが必要
            - NASにも複数ポートのNICが必要
            - 部屋間は非常に長い1本のLANケーブルでつながれている
                - 別の部屋にある場合は配線の交換工事が必要
                - **サーバーと各PCは同じ部屋に置く**必要がある
- __冗長性__（VDEV中のドライブ1つまで故障可）
    - mirrored VDEVの場合2-way mirror
- 停電への対応
    - UPSの利用
- 現在運用しているサーバーを再利用する
    - 8個の3.5inch HDDが入る
    - 既存の配線でsata接続数が十分に確保されている
- __素人でも簡単に管理__できるようにする
    - **GUIは必須**
        - TrueNASかOpenMediaVault
    - **HDD交換の簡単さ**
        - ホットスワップできる機構が必要（ケースに付いている既存のものを用いる）

# 導入の利点
- ランサムウェアへの対策が可能
- HDDの故障への耐性が上がる
- 各自のPCにHDDを積むよりも速度は上がる

# ZFSのディスク構成
## RAIDz
- mirrored VDEVに比べて同じ冗長性の時の__保存容量が大きい__
- 速度はVDEV中の__最も遅いHDD__に近い性能が出る
- HDDの一つが壊れた時に新しいHDDを入れてresilvering（再構成）を行う
    - RAIDに比べて再構成時間はだいぶ短いが、それでも容量によっては__半日程度__かかることもある
    - 再構成中はHDDの負荷が大きくほかのHDDが壊れる可能性が大きいため（VDEV中の2個のHDDが壊れても大丈夫な）RAIDz2を使うことを勧められることが多い
- **今回は（読み込み）速度の面から採用しない**
    - 書き込み速度はキャッシュでどうにかなる


## mirrored VDEV[^1]
- 読み書き速度を出しやすい
    - pool中のVDEVの数をM、VDEV中のHDDの数をN、HDDの読み書き速度をそれぞれR,Wとする。
    - 読み込み速度:**MNR**
    - 書き出し速度:MW
- resilveringの際の残りのHDDが故障する確率がRAIDzに比べて__少ない__
    - 残りのHDDへの負担が少ない
        - resilveringにかかる計算時間が少ない
        - 残ったHDDへの書き込みが少ない

# キャッシュ、ログ[^3][^4]
- 書き込みキャッシュ
    - 書き込まれたファイルを一時的に速いストレージに保存し、書き込み速度向上を図る
    - RAMのキャッシュ
        - 過去5秒間の書き込まれたファイルをRAMに保存
    - ZIL（ZFS intent log）
        - RAMキャッシュで保存されたデータをさらに一時的にHDDの一か所に保存
        - ここに書き込まれた後、本来のHDDの保存場所に書き込まれる
    - SLOG（Separate ZFS intent log）
        - ZILは2重にHDDに書き込んでいるため非効率
        - ZILの保存場所をSSDにすることで書き込みの高速化を図るもの
- 読み込みキャッシュ
    - よく読まれるファイルを一時的に速いストレージに保存し、読み込み速度向上を図る
    - ARC（RAMキャッシュ）
        - よく使われるファイルを保存
    - L2ARC（SSDキャッシュ）
        - ARCで使用頻度が低く捨てられたデータを保存

# チューニング
- 同期・非同期モード
    - 安全のため、`sync=always`にする
    - **すべての書き込みを同期書き込み**に指定
- レコードサイズ
    - デフォルトは128KB
    - 今回はチューニングを行わない
- 容量
    - 2-way mirrored VDEV x 4
    - $6\times 4=24$ 
        - **24TB**
- SLOGサイズ
    - SLOGサイズが足りないとあるサイズを超えるファイルを転送すると**途中から転送速度が減少**
    - 大きくなると
        - より大きな容量のファイルでも高速な書き込みが可能
        - 必要なSLOGサイズ
            - 今回用いるネットワークは4Gbit/sの速度が出る
            - RAMキャッシュからSSDへは5秒間分のデータが送信される
            - $4/8\times 5=2.5$
                - **2.5GB**必要
    - Optane SSD 32GB[^7]が値段、性能的にちょうどいい
        - 読み出し1350MB/s、書き込み290MB/s
        - **冗長化**のため2個mirrorする
        - **4000円 x 2**
- RAMサイズ
    - ARC
        - 保存容量1TB当たりARCが1GB必要といわれることが多い
    - OS用に2GB必要
    - $24+2=26<32$
        - **32GB**必要
- L2ARCサイズ
    - RAMが64GB以下のシステムでは用いないことが推奨されている[^8]ため、**用いない**

## 同期書き込みと非同期書き込み[^3][^5]
- 同期書き込み（syncronous write）
    - ZILに書き込んだ時点でアプリケーション側に書き込んだと伝える
    - 不揮発であるZILに書き込んでいるため、非同期書き込みよりも安全
    - 書き込みの順序 
        - `アプリケーション` -> `RAMキャッシュ` -> `ZIL/SLOG` -> `HDDの保存場所`

- 非同期書き込み（asyncronous write）
    - （HDDに書き込んでいないのに）RAMに書いた時点でアプリケーション側に書き込んだと伝える
    - カー以下のニック、電源断の時に過去5秒間のデータが失われる
        - データベースでは致命的
    - 読み込み、書き込みが速い

## バックアップ
- snapshot
    - バージョン情報を保存
        - 同じpool中に保存
    - 前回のsnapshotへの巻き戻しが可能
        - ランサムウェアへの対応
            - Windowsクライアント側では完全に防ぎきれる保証はない
        - 間違えてファイルを消してしまった場合への対応
    - 4種類のsnapshotを用いる
        - 以下の容量のファイルが編集されるとする
            - 一時間当たり100MB
            - 一日当たり1GB
            - 一か月当たり20GB
        - 10分に一回のsnapshot
            - 過去5日間分保持
            - $6(/hour)*24(/day)*5(days)=720$
            - 合計のsnapshotの大きさ（非圧縮時）は$0.1\times24\times5=12GB$
        - 1時間に一回のsnapshot
            - 過去1か月間分保持
            - $24(/day)*30(days)=720$
            - 合計のsnapshotの大きさ（非圧縮時）は$0.1\times24\times30=72GB$
        - 1日に一回のsnapshot
            - 過去2年間分保持
            - $365(/year)*2(years)=730$
            - 合計のsnapshotの大きさ（非圧縮時）は$1\times365\times2=730GB$
        - 1か月に一回のsnapshot
            - 無制限の期間保持
            - $12(/year)*10(years)=120$
- **遠隔地のHDD**へのバックアップ
    - resilveringに失敗する可能性もある 
    - **毎日朝4時くらいに一回**バックアップ
        - TruenasのCloud Backup機能を用いる
        - **SFTPやWebDAV**の場所に保存可能
    - ただのバックアップのため、HDDは**SMRであっても問題ない**

# 費用
- サーバー
    - サーバー自体は既存のものを用いる
- HDD
    - Seagate IronWolf 6TB (CMR) * 8
    - $15000\times8=120000JPY$
    - **12万円**
- SSD
    - キャッシュ用
        - Intel Optane Memory 32GB * 2
        - $4000\times2=8000JPY$
        - **0.8万円**
    - 各PCのSSD化
        - 20個のPCがあるとする
        - 500GBのSSDを用いる
            - BX500 CT480BX500SSD1
        - $6000\times20=120000$
        - **12万円**
        - 240GBだと執筆時に¥4,380でコスパ的に損
- NIC (1GbE*4port)
    - 4000JPY
    - **0.4万円**
- L2スイッチ x 2
    - $2000\times2=4000JPY$
    - **0.4万円**
- UPS
    - 1200VA
        - Backup UPS CPJ1200
    - **2.6万円**
- バックアップサーバー
    - サーバー自体は既存のものを用いる
    - HDDは現在各PC内に用いているHDDを集めて用いる


## 合計金額
- $12+0.8+12+0.4+0.4+2.6=28.2$
- **28.2万円**


[^1]: https://static.ixsystems.co/uploads/2020/09/ZFS_Storage_Pool_Layout_White_Paper_2020_WEB.pdf
[^2]: https://jrs-s.net/2019/05/02/zfs-sync-async-zil-slog/
[^3]: https://www.45drives.com/community/articles/zfs-caching/
[^4]: https://www.ixsystems.com/blog/zfs-zil-and-slog-demystified/
[^5]: https://www.servethehome.com/what-is-the-zfs-zil-slog-and-what-makes-a-good-one/
[^6]: https://www.ixsystems.com/blog/why-zil-size-matters-or-doesnt/
[^7]: https://www.intel.com/content/www/us/en/products/sku/99742/intel-optane-memory-series-32gb-m-2-80mm-pcie-3-0-20nm-3d-xpoint/specifications.html
[^8]: https://www.ixsystems.com/documentation/freenas/11.2-U5/zfsprimer.html