設計
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チャネル(6チャネル/ソケット) 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で構成してそれを2つストライプします。残りの1枚はホットスペアにして残しておきます。
2TBのSSDに関してはリードキャッシュに使うので壊れても多少のパフォーマンスを犠牲にしてそのまま使い続けることができます。
RAIDカードを利用しない理由は2つあります。
- RAIDカード+バックアップキャパシタは一般的に高価であるため
- RAIDカードは十分なパフォーマンスが得られないことがあるため
CPUの性能向上やソフトウェアRAIDの発達によりRAIDカードによるオフロードの効果は少なく、今回はRAIDカードを使いません。
ブート領域はソフトウェアRAIDを構成します。このようなソフトウェアのRAIDで構築する際はブートローダを2つのデバイスに別々にインストールする必要があるため少々面倒ですが、RAIDカードを搭載するよりもコストを削減することができます。
構築
OSにはCentOS 8.3を利用しました。後々Rocky linuxとかに移行するのでしょうかね?
次のような手順でインストールします。
0. RAIDを設定する。
- RAID1の上でCentOSをインストールする
- ブートディスクをソフトウェアRAID1にする
- zfsを構成する
- NASに向けた設定を行う。
RAIDのセットアップ
BIOS=>AdvancedのタブからSATAポートなどの設定で、RAIDモードにします。
起動時にCtrl+IでRAIDのセットアップ画面に入り、起動ディスク2つでRAID1を組みます。
選択の切り替えはTabで、RAIDモードの選択はRAID0と表示されているところで上下矢印キーで行います。
RAIDのセットアップでディスクは初期化される点に留意してください。
自分で名前を付けられるので、わかりやすい名前にしておくといいと思います。
OSのセットアップ
先ほど構成したRAID1にOSをインスコします。
特に加筆する点もありません。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
以上です。