45個のHDDを使ったNASを作る

## 設計
45本のハードディスクでNASを作ろうと思ったとき、どのように構成したらいいでしょうか？
それはその用途によってかなり異なると思います。並列計算機で多数のユーザ、多数のタスクが同時にR/Wを行う場合には分散ストレージが向いていると思いますし、多少遅くてもいいから容量とコストを重視したい場合もあると思います。

今回は容量と（少々の）速度を重視したzfsを使用したRAIDカードレスのNASを作ります。ブートも含めて冗長構成をとり、HDDもRAID Z2構成をとります。

## ハードウェア構成
### Disks
12TB HDD 45台
2TB SSD x1台
240GB boot SSD x2台
(あとでsync=enabledできるように)ZIL用のSSDもあっていいかと思っています。

### その他
- CPU: Intel Silver 4214R x2ソケット分
- memory:16GB @2400MHz x12チャネル（６チャネル/ソケット） 192GB(total)
- 1000W冗長電源
- 2x 10GbE

RAIDカードは使っていません。今回はすべてソフトウェアRAIDで構成します。
CPUは、あまりグレードを上げず安価なパーツにしています。あまり差異は出ないと思います。
メモリは容量を少し多めに確保してキャッシュを有効に利用できるようにしました。SSDのキャッシュには、そのインデックスに巨大なRAMを利用します。余裕をもってRAMを確保しておいた方がいいと思います。
1000Wの電源ですが、45台のHDDともなると電力供給を安定して確保する必要がありますので、この程度の容量が必要です。100Vで利用するときは45台が限度でしょうね。200Vだと60台とかもっと大きい電源が利用できるので、可能性が広がります。(今のところピークで723Wですが、ストレージの負荷とCPUの負荷が重なればもっと上がると思います。900Wくらいはいきそう。)
あとはHDDなので10GbE程度で飽和してしまうのでこんな感じです。


## RAID構成
これは、使うアプリケーションのアクセスパターンによって大きく変わります。パフォーマンスの考え方、容量を重視する場合や冗長性を重視する場合など様々挙げられます。
一般にRAIDのパフォーマンスを上げるためにはRAID Z2などをさらにストライプする必要があります。今回はそこまでパフォーマンスはいらないけど44枚すべてで構成することもあまり得策ではないので22枚ずつ構成することにしました。
22枚をRAID Z2で構成してそれを２つストライプします。残りの１枚はホットスペアにして残しておきます。
2TBのSSDに関してはリードキャッシュに使うので壊れても多少のパフォーマンスを犠牲にしてそのまま使い続けることができます。

### RAIDカードを利用しない理由は２つあります。
- RAIDカード＋バックアップキャパシタは一般的に高価であるため
- RAIDカードは十分なパフォーマンスが得られないことがあるため

CPUの性能向上やソフトウェアRAIDの発達によりRAIDカードによるオフロードの効果は少なく、今回はRAIDカードを使いません。

ブート領域はソフトウェアRAIDを構成します。このようなソフトウェアのRAIDで構築する際はブートローダを２つのデバイスに別々にインストールする必要があるため少々面倒ですが、RAIDカードを搭載するよりもコストを削減することができます。

### 構築
OSにはCentOS 8.3を利用しました。
後々Rocky linuxとかに移行するのでしょうかね？

次のような手順でインストールします。
0. RAIDを設定する。
1. RAID1の上でCentOSをインストールする
2. ブートディスクをソフトウェアRAID1にする
3. zfsを構成する
4. NASに向けた設定を行う。

### RAIDのセットアップ
BIOS=>AdvancedのタブからSATAポートなどの設定で、RAIDモードにします。
起動時にCtrl+IでRAIDのセットアップ画面に入り、起動ディスク２つでRAID1を組みます。
選択の切り替えはTabで、RAIDモードの選択はRAID0と表示されているところで**上下矢印キーで行います。**
RAIDのセットアップでディスクは初期化される点に留意してください。
自分で名前を付けられるので、わかりやすい名前にしておくといいと思います。

### OSのセットアップ
先ほど構成したRAID1にＯＳをインスコします。
特に加筆する点もありません。OSのインストール方法は他で検索してください。

### zfsのインストール
https://openzfs.github.io/openzfs-docs/Getting%20Started/index.html
ここに書いてあります（雑）

### zfsを構成する。
lsblkでストレージデバイスを確認します。
あとはインストール構成に従ってインストールします。

```
zpool create tank raidz2 sda adb (省略) sdv raidz2 sdw sdx (省略) sdar
```

L2ARCを追加します。

```
zpool add tank cache nvme0n1
```

hotspareを用意します。

```
zpool add tank spare sdas
```

正しく構成すると以下のようになります。

```
[xxx@localhost ~]$ zpool status
  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            sda     ONLINE       0     0     0
            sdb     ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0
            sde     ONLINE       0     0     0
            sdf     ONLINE       0     0     0
            sdg     ONLINE       0     0     0
            sdh     ONLINE       0     0     0
            sdi     ONLINE       0     0     0
            sdj     ONLINE       0     0     0
            sdk     ONLINE       0     0     0
            sdl     ONLINE       0     0     0
            sdm     ONLINE       0     0     0
            sdn     ONLINE       0     0     0
            sdo     ONLINE       0     0     0
            sdp     ONLINE       0     0     0
            sdq     ONLINE       0     0     0
            sdr     ONLINE       0     0     0
            sds     ONLINE       0     0     0
            sdt     ONLINE       0     0     0
            sdu     ONLINE       0     0     0
            sdv     ONLINE       0     0     0
          raidz2-1  ONLINE       0     0     0
            sdw     ONLINE       0     0     0
            sdx     ONLINE       0     0     0
            sdy     ONLINE       0     0     0
            sdz     ONLINE       0     0     0
            sdaa    ONLINE       0     0     0
            sdab    ONLINE       0     0     0
            sdac    ONLINE       0     0     0
            sdad    ONLINE       0     0     0
            sdae    ONLINE       0     0     0
            sdaf    ONLINE       0     0     0
            sdag    ONLINE       0     0     0
            sdah    ONLINE       0     0     0
            sdai    ONLINE       0     0     0
            sdaj    ONLINE       0     0     0
            sdak    ONLINE       0     0     0
            sdal    ONLINE       0     0     0
            sdam    ONLINE       0     0     0
            sdan    ONLINE       0     0     0
            sdao    ONLINE       0     0     0
            sdap    ONLINE       0     0     0
            sdaq    ONLINE       0     0     0
            sdar    ONLINE       0     0     0
        cache
          nvme0n1   ONLINE       0     0     0
        spares
          sdas      AVAIL

errors: No known data errors
```

### 圧縮を有効にする
いろいろ見ていると、lz4圧縮はデメリットが少ないみたいなので有効にします。というか、zfsのデフォルトみたいですね。

```
zfs set compress=on tank
```

### 非同期書き込みにする
書き込みのシグナルを無視するようにします。これは、データベースなどで行うとデータの整合性が取れなくなる可能性があるので推奨されませんが、NASで行えば同期漏れのファイルがロストするだけなので、あまり問題にはならないと思います。

```
zfs set sync=disable tank
```

以上です。