乱流の数値計算用にZFSで大容量RAIDを組む

# はじめに
　数値計算の研究のためには、シミュレーションデータを保存するためのハードディスク容量が必要です。実問題ではレイノルズ数が大きく、数値解析に必要なメッシュ数は１辺あたりに$Re^{3/4}$倍で増えます。空間３方向と時間方向を考えるので、ざっくりというと$Re^3$~$Re^4$くらいのスケールでデータが増えます（時間方向の見積もりは諸説あり）。流れの速さを2倍にすると、10~20倍くらいのデータ量になります。最新の乱流の超高精度数値シミュレーションのデータは、簡単に言うと, 4K動画のスローモーションを4K個保存するくらいの容量が必要です！ 乱流などの数値計算を利用した研究のボトルネックはハードディスク容量といっても過言ではありません。

　最近のハードディスクは安く大容量のものが手に入ります。詳しくは --> [息を吹き返すHDD](https://xtech.nikkei.com/atcl/nxt/column/18/00001/06536/?i_cid=nbpnxt_ranking)

　この記事では、ZFSのファイルシステムを自分で構築する方法を紹介します。今回は、NAS用の8TBを5台をつなげて、ZFSファイルシステムRAIDZを構築します。デスクトップコンピュータがすでにあれば、15万円くらいの投資です。RAID5と同様に１台冗長性をもたせますので、実容量はだいたい, 8TB $\times $(5-1)台 $\times$ 0.9 $\approx$ 28TBくらいです。 正確な計算は[こちら。](https://enterprise-nas.qnap.com/ja-jp/calculator/)

:::note warn
ベンダーに頼んでNASを購入すると、同じくらいの容量で50-60万円でしょうか（2021年７月）。構築の手間と、壊れたときの手間を考えると、こちらの方が良いでしょう。突然の停電などで、ファイルシステムが壊れるリスクはZFSの方が低いらしいです。
:::

　RAIDZはハードディスクの１つが壊れてもHDを交換すれば復旧可能なはずです。が、復旧できた経験はありません。壊れても大丈夫な規模で、貴重なデータは別のところにバックアップがあるというスタンスでやります。

:::note alert
リスクを下げるには、新品のNAS用のハードディスクを使ってください。私のものは３年稼働しています。NAS用でない中古HDで作ったRAIDzは１年でだめになりました。バックアップや復旧も考えた上でご利用ください。
:::

:::note info
手元に余っている古いHDで練習すると良いでしょう。同じ容量のHDをご使用ください。ソフトウェアRAIDなので、ホストコンピュータのメモリも多く積んでおくと良いです。
:::

----

# ハードディスクを取り付けます

　使用するのは普通のタワー型のPCケースです。研究室に眠っている古いPCで良いですがメモリは増設しておくと良いです。
配線はPC内部の空気の流れを妨げないようにきれいに。ハードディスクはやけどするくらい熱くなります。時々、ファンやフィルターの相似をしましょう。ケース前面のファンも必要でしょう．

<img width="320" alt="IMG_0271.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684341/9c97553b-6bf4-a44c-1a3f-cfc09cbd999a.jpeg">

ハード・ディスクのバーコードに赤線が入っているものがZFS用の５台です。
<img width="320" alt="IMG_0273.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684341/b0b0e844-a995-010d-451e-4dda004a1bde.jpeg">

　取り付けた後のチェックです。

:::note
2TB以上のハードディスクのパーティション管理にはGPTを使います。
:::

```
# All disk (more than 2TB) should be GPT managed disks. 
$sudo parted -l
```
で確認します。


##[1] IDでハードディスクを識別します。

```
$ls -l /dev/disk/by-id
```
/dev/disk/by-id/ata-WDC_WD40EZRX-22SPEB0_WD-WCC4E3NA1C21 (sda)
/dev/disk/by-id/ata-WDC_WD40EZRZ-22GXCB0_WD-WCC7K2RL4289 (sdb)
/dev/disk/by-id/ata-WDC_WD40EZRX-22SPEB0_WD-WCC4E5JVYPF2 (sdc)
/dev/disk/by-id/ata-WDC_WD40EZRZ-22GXCB0_WD-WCC7K4PNK7LD (sdd)
/dev/disk/by-id/ata-WDC_WD40EZRZ-22GXCB0_WD-WCC7K4PNKAT6 (sde)
 
##[2] ZFSモジュールの読み込み 
```
$sudo /sbin/modprobe zfs
```

##[3] RAIDZストレージプールの作成
```
$sudo zpool create tank raidz /dev/disk/by-id/ata-WDC_WD40EZRX-22SPEB0_WD-WCC4E3NA1C21 /dev/disk/by-id/ata-WDC_WD40EZRZ-22GXCB0_WD-WCC7K2RL4289 /dev/disk/by-id/ata-WDC_WD40EZRX-22SPEB0_WD-WCC4E5JVYPF2 /dev/disk/by-id/ata-WDC_WD40EZRZ-22GXCB0_WD-WCC7K4PNK7LD ata-WDC_WD40EZRZ-22GXCB0_WD-WCC7K4PNKAT6 
```

:::note alert
create を使ってRaidzを構成すると、中のデータは全部消えます。
:::

##[4] データスペースの作成 
```
$sudo zfs create tank/data
```

##[5] NFSで共有
* サーバーPC側の設定

> 
```
$sudo zfs set sharenfs=on tank
```
```
$sudo vi /etc/exports
```
```
/tank/data [IP addr]/24(rw,async,no_root_squash)
```
```
$sudo exportfs -avr
```

* クライアントPCからNFSマウント

>
```
$showmount -e [IP address]
```
```
$sudo mount -t nfs [IP addr]:/tank/data /mnt/($mount_point)
```

:::note warn
NFS用に各WSのユーザーIDを一致させる必要があります。
:::
### ユーザーIDの確認
```
$id user_name
```

### ユーザーIDの変更
```
$usermod -u 15001 user_name
$groupmod -g 15001 user_name
$chown -R user_name: /home/user_name 
$chown -R user_name: /tank/data/user_name
```
---
# PCの再起動後に ZFS ファイルシステムを再度マウントする
```
#recalling ZFS tank

$sudo zpool list
```
で探して、見つからなければ、 

```
$sudo zpool import
pool: tank
id: 10275846496795298111
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

tank ONLINE
ata-WDC_WD20EADS-00R6B0_WD-WCAVY2884985 ONLINE
ata-WDC_WD20EZRX-00DC0B0_WD-WCC300262352 ONLINE
ata-WDC_WD20EZRX-00DC0B0_WD-WCC300319982 ONLINE
```
pool名 tankが見つかりましたので、以下のようにインポートすればOK.

``` 
$sudo zpool import tank
```

# 障害発生時
RAIDZはハードディスクの１つが壊れてもHDを交換すれば復旧可能なはずです。
[マニュアル](https://docs.oracle.com/cd/E19253-01/819-6260/gbctt/index.html)を見ながら暇なときにやれば良いです。

```
$ sudo zpool import    
pool: tank     
id: 10784953625292869930  
state: DEGRADED 
status: One or more devices contain corrupted data. 
action: The pool can be imported despite missing or damaged devices.  The fault tolerance of the pool may be compromised if imported.   
see: http://zfsonlinux.org/msg/ZFS-8000-4J config:
    tank      DEGRADED      raidz1-0                                    
DEGRADED      ata-WDC_WD40EZRX-22SPEB0_WD-WCC4E3NA1C21  
ONLINE        ata-WDC_WD40EZRZ-22GXCB0_WD-WCC7K2RL4289  
ONLINE        ata-WDC_WD40EZRX-22SPEB0_WD-WCC4E5JVYPF2  
ONLINE        ata-WDC_WD40EZRZ-22GXCB0_WD-WCC7K4PNK7LD  
ONLINE        ata-WDC_WD40EZRZ-22GXCB0_WD-WCC7K4PNKAT6  
ONLINE        ata-WDC_WD40EZRZ-22GXCB0_WD-WCC7K4PNKKLH 
```
とかが出ても、落ち着いて対応。
　至急、バックアップを取るように周知してください。
壊れるまで使えますが、再起動するとマウントできなくなるかも。

# バックアップ
　勉強中。というか、まるごとスナップショットを取るくらいなら、ちゃんとしたNASかファイルサーバーを購入してください。壊れるのが前提の一時的な高負荷の処理用です。壊れる前に必死にデータ処理を走らせます。重要なデータはこまめにバックアップを取ります。バックアップ先はより信頼性の高いファイルサーバーもしくは、紙媒体、つまり、ジャーナル論文です。