Virtual SAN – RAID-5/6


Virtual SAN 6.2 がリリースされるまでは、データを保護するためには RAID-1 (ミラーリング) を利用するしかありませんでした。耐障害性を 1 ホストとするならば、2 倍の容量が必要でした。耐障害性を 2, 3 ホストと増やすと、必要な容量が 3, 4 倍となりかなりの容量が必要となってしまいました。

Virtual SAN 6.2 では、外部ストレージや内蔵 SAS-RAID カードでも利用できる RAID-5/6 相当の機能を、ネットワーク越しに行える機能が新しく導入されました。これにより、容量をこれまでよりも節約しながらも、耐障害性のレベルを維持できるようになりました。

RAID-5/6 の導入

Virtual SAN 6.2 の新機能の話題が出始めた頃、この機能を Erasure Coding と呼んだり (分散) RAID-5/6 と呼んだりしていました。多少混乱を呼んだようですが、ある意味どちらも正しくもあります。RAID-5/6 はリードソロモン符号の一種であり、リードソロモン符号は Erasure Coding の一種であるためです。

Virtual SAN の RAID-5/6 の機能では、ESXi ホストの筐体内のディスクと内蔵 SAS-RAID カードで RAID-5/6 を構成するのではなく、ネットワーク越しに RAID-5/6 相当のデータ配置を実現します。ネットワーク越し、というのは、ESXi ホスト跨ぎ、あるいは、フォルトドメイン跨ぎのネットワーク越えとなります。つまり、RAID-5/6 を実現するために分割されたフラグメントとパリティは、それぞれ別々の ESXi ホストに配置されることになります。

RAID-5/6 は VSAN 仮想ディスク ストレージ ポリシーの「耐障害性方式 (Fault Tolerance Method [FTM])」 を 「RAID-5/6(イレージャ コーディング) – キャパシティ (RAID-5/6 (Erasure Coding) – Capacity)」にすることで利用することが出来ます。RAID-5 となるか RAID-6 なるかはポリシー「許容する障害の数 (Number of failures to tolerate [FTT])」の数によって決まります。FTT=1 とすると、パリティを 1 つ用いて RAID-5 になります。FTT=2 とすると、パリティを 2 つ用いて RAID-6 となります。

後述しますが、この機能は I/O を余分に発生させるため、そのオーバーヘッドをモノともしない IOPS を叩き出せる All Flash 環境限定の機能となります。重複排除、圧縮機能と同様です。SSD と HDD のハイブリッド構成では RAID-5/6 を利用できません。

RAID-5

FTM=Capacity、FTT=1 とすると、その VSAN オブジェクトは RAID-5 として構成されます。RAID-5 の構成で構成されるデータは、3 つのフラグメントに分割され 3 つの ESXi ホストの各ディスクに配置されます。そして分割された 3 つのフラグメントから算出されるパリティが、さらに異なる 1 つの ESXi ホストのディスクに保存されます。このパリティは、単一の ESXi ホストや単一のディスクにのみ保存され続けるのではなく、4 つの ESXi ホストの各ディスクに分散されて保存されます。

Virtual SAN 6.2 における RAID-5 は、3 Fragments + 1 Parity の構成に固定されています。現在のバージョンでは、4+1 や 5+1 といった構成はサポートされていません。しかしながら、Storage Availability Business Unit (SABU) の CTO の Blog によれば、Virtual SAN のコードは 3+1 に依存していないので、将来的に RAID-5 の構成にバリエーションを持たせることは可能であるとされています。

選択の幅が広がるのは良いことですが、あまり拡げすぎるのもいかがなモノかと…

3+1 となるので、保護対象のデータ容量に対して 133% の Raw 容量のみで FTT=1 が実現できることになります。RAID-1 で FTT=1 を実現しようとすると Raw 容量は 200% となるので、RAID-1/FTT=1 に対し RAID-5 は、Raw 容量を 33% 節約できることになります。しかしながら、オイシイ話だけではなく後述の「I/O の増加」で記述しているように Write のオーバーヘッドと容量の節約とのトレードオフになります。

RAID-6

FTM=Capacity、FTT=2 とすると その VSAN オブジェクトは RAID-6 として構成されます。RAID-6 の構成で構成されるデータは、4 つのフラグメントに分割され 4 つの ESXi ホストの各ディスクに配置されます。そして分割された 4 つのフラグメントから算出される 2 つのパリティが、さらに異なる 2 つの ESXi ホストの各ディスクに保存されます。このパリティは、単一の ESXi ホストや単一のディスクにのみ保存され続けるのではなく、6 つの ESXi ホストの各ディスクに分散されて保存されます。

Virtual SAN 6.2 における RAID-6 は、4 Fragments + 2 Parities の構成に固定されています。現在のバージョンでは (以下略

4+2 となるので、保護対象のデータ容量に対して 150% の Raw 容量のみで FTT=2 が実現できることになります。RAID-1 で FTT=2 を実現しようとすると Raw 容量は 300% となるので、RAID-1/FTT=2 に対し RAID-5 は、Raw 容量を 50% 節約できることになります。しかしながら、(以下略

RAID-6 は FTT=2 を実現するために、6 ESXi ホストを必要とします。それに対して RAID-1 では FTT=2 を 5 ホストで実現します。FTT=2 を実現するには RAID-1 の方が ESXi ホストの必要台数が少なくて済みます。

I/O の増加

RAID-5/6 では RAID-0 よりも、遙かに少ない容量で同じ数のホスト障害に耐えることが出来るようになります。しかしながら、その代償として余計なオーバーヘッド コストが発生します。発生するコストは、以下になります。

  1. パリティ計算のコスト (後述)
  2. Write I/O における追加の Read/Write I/O
  3. 障害発生時の Read I/O における追加の Read I/O

さらに、これら I/O はネットワーク越しに行われるため、ネットワーク帯域も余計に消費します。なお、障害が発生していない場合の Read I/O は代償は全くありません。必要なフラグメントを必要なだけ読み込むだけです。パリティに操作を行うこともありません。

ここでは 2. 3. について説明します。

いずれも従来からある外部ストレージや内蔵 SAS-RAID カードでも行われている処理と同様です。

Write I/O における追加の Read/Write I/O

RAID-5/6 の Write I/O では以下の処理が行われます。

  • Write I/O が行われるフラグメントの読み込み
  • そのフラグメントのパリティデータを読み込み
  • 新しいパリティを再計算
  • Write I/O が行われた新しいフラグメントを書き込み
  • 新しいパリティを書き込み

RAID-5 であれば 1 Write I/O が、2 Read I/O、2 Write I/O に増幅されてしまいます。これが RAID-6 であれば、パリティが一つ増えるので 1 Write I/O が 3 Read I/O、3 Write I/O に増幅されます。

新しいパリティは、Write I/O が行われるフラグメントの新旧の内容と古いパリティから再計算されます。全てのフラグメントが必要になるわけではありません。

障害発生時の Read I/O における追加の Read I/O

RAID-5/6 を構成するフラグメントの 1 つが障害でアクセス出来ない場合、そのフラグメントに関連する生き残りのフラグメントとパリティから、アクセス出来ないフラグメントを再構成する必要があります。つまり、RAID-5 であれば 1 Read I/O が 3 Read I/O に増幅された上にフラグメントの再構成計算のコストが発生します。RAID-6 であれば 1 Read I/O が 4 Read I/O に増幅された上にフラグメントの再構成計算のコストが発生します。

All Flash がペナルティを癒やす

このように RAID-5/6 はどうしても要求される I/O 数よりも、実際に発行される I/O 数が多くなってしまいます。HDD が主役の時代であればこれはスピンドルが持つ IOPS を食いつぶし性能劣化を引き起こす悪の元凶でした。数万 IOPS を誇るフラッシュデバイスと、十分な数の ESXi ホスト数と、十分な数のフラッシュデバイス数の掛け算による数の暴力により RAID-5/6 の IOPS 増加をもろともしない膨大な IOPS キャパシティを誇る Virtual SAN 環境ができあがります。

今暫くはハードウェアのイノベーションが傷を癒やしてくれる時代なのかも知れません。

ただし、レイテンシは如何ともしがたいため、レイテンシに厳しい仮想マシンは無理せず RAID-1 構成をお勧め致します。

パリティの計算コスト

パリティの計算は XOR (排他的論理和) で計算され、RAID-6 の追加のパリティはより複雑な多項式で生成されています。古の時代には、この RAID-6 のパリティ計算コストが大きいため、対角のフラグメントの XOR を 2 つ目のパリティとしていました。しかし、こと現代に至っては SSSE3 (Supplemental Streaming SIMD Extensions 3) や AVX2 があるので、極めて低コストで RAID-6 のパリティを計算できるようになっています。Virtual SAN では Haswell 世代以降の CPU であれば AVX2 を、それより前の世代の CPU では SSSE3 を使ってより低コストでパリティの計算を行っています。

データ ローカリティ

原理上 RAID-5/6 ではデータ ローカリティを維持することが出来ません。拡張クラスタ (Stretched Cluster) を除き、現時点では Virtual SAN にデータ ローカリティの概念がありません。これは 10GbE のネットワーク遅延が極めて低いのでデータローカリティの恩恵がそれほど高くないことと、読み込みにしか効果がないこと、そして vMotion/DRS と絶望的なほど相性が悪いことが理由として挙げられます。

まぁ、特定の VM を ESXi ホストに塩漬けし、その仮想ディスクをその ESXi ホストに持ってくる、といったケースでは有用かも知れません。あるいは VDI のリンククローンの元ネタとなる仮想ディスクを密かに全 ESXi ホストにコピーするなどは有用でしょう (それでも CBRC のサイズが今後拡大されれば必要なくなるかな)。が、パラメータやら設計項目を増やす苦労が忍ばれるので今後もいらんよなぁ、と思う次第。今後 40GbE、50GbE、100GbE さらには RDMA と夢は広がるので、データ ローカリティに力を注ぐよりも新しいデバイス対応やデータ サービスの強化に力を割いて欲しいところ。

RAID-5/6 と RAID-0 の組み合わせ

RAID-5/6 は RAID-0 (ストライプ) と組み合わせることが出来ます。しかしながら、ESXi ホスト数が少ない All Flash 構成では Write に関してストライプの効果が Read より低いで、ストライプで分散しただけの性能向上が得られないことがあります。

All Flash 構成の Read I/O はキャッシュティアを経由せずにキャパシティティアから直接 Read します。このため、ストライプでキャパシティ ティアのデバイスを増やすことは有効です。しかしながら、All Flash 構成の Write I/O は Hybrid 構成の Wirte I/O と同様、一旦キャッシュティアで Write I/O を受け Ack を返した後、キャパシティ ティアにデステージを行います。RAID-0 はキャパシティ ティアのディスクを分散することは保証してくれますが、残念ながら ESXi ホストやディスクグループを分散しより多くのキャッシュティアに分散することは保証してくれません。つまり、同じキャッシュティア配下の複数のキャパシティティアを利用することもあるのです。このケースでは Write 性能は上がりません。

RAID-5 と RAID-0 を組み合わせた場合、(3+1) * 2 = 8 フラグメントに分散されます。RAID-6 と RAID-0 であれば、(4+2) * 2 = 12 フラグメントに分散されます。ESXi ホストに散らばってもらう確率をあげるには、それ相応の数の ESXi ホストが必要となります。しかしそれでも ESXi ホストにキレイに分散されるかどうかは神頼みとなってしまいます。Write に関してはストライプした分だけの性能向上の期待を極限まで持っていくことはできませんが、それでも Read/Write ともに向上するので 8, 12 ESXi ホストといった環境でも RAID-5/6 と RAID-0 を組み合わせるのはありかもしれません。その際は VSAN クラスタあたりのコンポーネントの上限に注意する必要があります。

幸い RAID-5/6 を含む仮想マシン ストレージ ポリシーは、仮想マシン起動中でも変更することが出来ます。動作・性能確認を行った上でポリシーを適用するのがよいでしょう。もちろん、ポリシーの変更中は通常よりも余計な I/O が発生しますので、I/O ピークの時間帯をさけて変更して頂ければと思います。

All Flash 構成における Read I/O とストライプに関して指摘して頂いた @interto さん、ありがとうございました。

まとめ

  • RAID-5/6 の機能は All Flash 構成のみで利用可能
  • RAID-5/6 はキャパシティの節約にはなるが、パフォーマンス ペナルティがある
  • パフォーマンスを至上とする VM は RAID-1 を適用する。パフォーマンスがそれほど必要ではなく容量重視であれば RAID-5/6 を適用
  • 最近の CPU であればパリティ計算のコストは心配する必要はない
  • 仮想マシン毎、より正確に言えば仮想ディスク毎にに RAID-1/5/6 設定できるので適宜
  • 心配であれば検証すること。後から仮想マシン ストレージ ポリシーを変更することも出来る。

参考

コメントを残す