技術情報
とよぢぃのねっとあっぷ四方山話 第6回

DISのとよぢぃと申します。
『ねっとあっぷ四方山話・ストレージの基礎技術紹介(1)』をお届けします。
基礎技術紹介ではネットアップに限らずストレージ製品で使われている非常に基本的・基礎的な技術についてご紹介していきます。
その第一弾としてRAIDについてご紹介します。
RAIDという技術は決して新しいものではありません。始まりはなんと1988年。実は1970年代から1980年代と言う時代は現在のコンピュータやネットワーク技術のベースができてきた時代で、RAIDもそのうちの一つと位置付けることができます。ちなみに今のICTにおいてなくてはならないTCP/IPやEthernetと言った技術も1970年代前半にベースはできあがっています。
Cisco Systems社の設立は1984年ですし、NFSも1985年に(今は亡き)Sun Microsystemsによって最初のバージョンがリリースされています。
余談はこれくらいにして、さてRAID。RAIDは1988年にUCB(University of California, Berkeley)のDavid Patterson博士らの論文で提唱されたものです。当時RAIDは「Redundant Arrays of Inexpensive Disks」の略として紹介されました。信頼性のあまり高くない低価格のディスクを複数並べて冗長構成とすることで全体として信頼性を高めようという狙いです。また、このころのディスクは1台当たりの容量が100MB(TBでもGBでもなくMBです!)にも満たない容量だったので複数のディスクをまとめて一つのディスクに見せることでディスクの見た目の大容量化も実現することができました。
その後、ディスクの信頼性は大幅に向上し、1台当たりの容量も目覚ましい勢いで大きくなっていきます。ディスクの大容量化は今でも進んでいます。ディスクの価格はGBやTB当たりの単価は間違いなく下がり続けていますが、1台当たりの容量が大きくなっているので、結果としてディスク1台当たりの価格は高くなっています。しかし、信頼性の方はそろそろ頭打ちかも知れません。コンピュータの構成要素の中で唯一と言っていい非常に激しい可動部分を持つのがディスクなので、どんなに使用環境がよくてもある程度の故障率があるからです。まぁ、昔のディスクから見たらはるかに壊れなくなっているのは間違いないところですが、やはりディスクはコンピュータの構成要素の中ではもっとも壊れやすい部品になります。そんなわけで、RAIDと言う技術は今でも現役でバリバリに使われているんですね。
そんな状況(高価格、高信頼、大容量)を受けて今では、と言ってもずいぶん前からですが、
RAIDは「Redundant Arrays of Independent Disks」の略とされています。別に安価な(Inexpensive)ディスクと言うわけではなく、独立(自立)した(Independent)ディスクをたくさん並べることでさらに信頼性をあげ、大容量化もでき、実は性能向上も見込める仕組みとして今ではRAIDが使われています。
さて、背景はこのくらいにしてRAIDそのものの話し。
RAIDにはいろいろなレベルがあります。提唱された当初はRAID-1からRAID-5までの5つでしたが、冗長性がまったくないストライピングのような構成もRAID-0と呼ばれたり、冗長構成をとるためのパリティを1つから2つに増やしたRAID-6が追加されたりしています。
また、ストレージベンダーが独自の仕組みを編み出してそれに独自の名前を付けているものもあります。ネットアップのRAID-TECや
PureStorageのRAID-3Dなどはそれぞれ独自のものですね。
ではRAIDの各レベルについて説明します。

RAID-0:ストライピング
冗長性がまったくないので元々のRAIDの定義にははまらないが、他のRAIDレベル(特に
RAID-1)と合わせて使われることが多く、一般的にRAIDの一つのレベルとして扱われている
長所1:全ディスクの容量を使用することができる(容量面でのオーバーヘッドがない)
長所2:性能へのインパクトがない(性能面でのオーバーヘッドがない)
長所3:ディスク数に応じてリニアなI/O性能の向上が見込める
短所1:冗長性が全くない!(RAIDとしては致命的)
短所2:I/O性能はリニア向上するかもしれないが、それを吸収できるだけのバス帯域が必要

RAID-1:ミラーリング
高性能を必要とするストレージで使われることが多いが、最近では高性能なストレージではディスクのように物理的な可動部分があるドライブではなくSSDが使用されることが一般的になってきたので、RAID-1の必要性は以前ほど高くない(ように思われる)
長所1:障害からの復旧が速い
長所2:障害があっても性能劣化がない
長所3:特別なH/WやS/Wがなくても実現可能
短所1:格納するデータ量の2倍の容量が必要(容量面でのオーバーヘッド)
RAID-1とRAID-0を組み合わせたRAIDをサポートしているストレージもある
RAID-0+1(RAID-01):ストライプをミラーリング

RAID-1+0(RAID-10):ミラーをストライピング

どちらも冗長度としてはとても高いが、RAID-1の短所である容量面でのオーバーヘッドは大きい
RAID-2:ハミングコード
ハミングコードは非常に強力な誤り訂正機能を実現できるが容量面・性能面でのオーバーヘッドが大きいためほとんど使われていない
RAID-3:ビットやバイト単位での専用パリティ
ビットやバイトという小さい単位でパリティを計算するため、計算量が非常に多くなりCPU負荷が非常に大きい(性能面でのオーバーヘッド)
また、特定のディスクにパリティデータを書込むため、パリティデータがボトルネックとなり性能への影響が出やすい
と言った理由でRAID-3もRAID-2同様ほぼ使われることがない

RAID-4:ブロック単位での専用パリティ
初期のネットアップストレージで採用されたRAID
現在もサポートはされているが、使用は非推奨
長所1:ブロック単位でパリティを計算するので
RAID-3よりもCPU負荷やディスクアクセスの負荷が少ない
長所2:データディスクの追加/増設が容易
短所1:RAID-3同様パリティディスクが固定なので書込み時にパリティディスクがボトルネックになる
そのためネットアップ以外のストレージでは使われていないが、ネットアップではこのボトルネックを解消するための仕組みが合わせて実装されているのでほぼ問題ない
短所2:パリティによる保護は一般的に障害からの復旧
に時間がかかる
短所3:2台以上のディスクの同時障害には対応不可
(システム停止やデータロストにつながる可能性あり)

RAID-5:ブロック単位での分散パリティ
もっとも広く使われているRAIDレベルと思われるが、ネットアップでは非サポート
長所1:RAID-4同様ブロック単位なのでCPUやディスクI/Oの負荷はRAID-3のように大きくない
長所2:パリティはRAID-5を構成するディスクに分散して書込まれるのでRAID-3やRAID-4のようにパリティディスクがボトルネックになることがない
短所1:ディスク単位での追加/増設はパリティの再配置を伴うためほぼ不可
短所2:RAID-4同様、障害からの復旧には時間はかかる
短所3:RAID-4同様、ディスクの多重障害には対応できない
さて、ここまで一般的な仕組みとしてRAIDの各レベルについて簡単にご紹介してきましたが、これで終わっちゃうとネットアップ四方山話にならないので、ここからはネットアップの話しにしたいところですが、これまでに出てきた技術用語中で一つだけ少し詳しく解説しておきたいものがあります。それは「パリティ」です。「パリティ」ってIT系の技術用語としては結構お目にかかる言葉だと思いますが、皆さんも目にしたことありますかね?
例えば、通信系だと「偶数パリティ(Even Parity)」とか「奇数パリティ(Odd Parity)」なんていう言葉をよく目にします。これは通信時にやり取りされるビット列の一塊の中の1のビットの数を偶数個や奇数個に設定することで、通信路上での1ビットのエラー(ビット化けやビット落ち)を検出できるようにするものです。検出だけで修復はできないので、もしこれでエラーが見つかったら受信者は送信者に対して再送要求を出すことになります。
ストレージのRAID-4やRAID-5で使われるパリティはエラーの検出だけでなく修復もできるようになっている優れモノです。ここで使われるパリティにはコンピュータの演算の一つであるXOR(Exclusive OR、排他的論理和)という演算が一般的に使われます。XORと言うのはこんな演算になります。ちょっと変わっていますよね。でもこれがとても便利なんです。

例えば、以下のような演算をしてみましょう。普通の足し算とか同じように、縦にXORを行います。縦に並んでいる1の数が奇数個なら結果は1、偶数個なら結果は0になります。

ここで上から3番めの行の値がわからなくなってしまったとします。

3番めの行の値を復旧したいわけですが、普通の足し算や引き算だったら、4つの値を足した結果から残っている3つの値を引けばわからなくなってしまった3行めの値を求めることができるのはすぐにおわかりいただけますよね。ここのポイントは「足し算」と「引き算」という二種類の演算が必要だということです。ではXORだとどうなるでしょう? XORでは3行めの値がないものとして残りの値がわかっている3つの行と結果行を合わせて4つの行に対して縦にXOR実行します(以下の左側の式)。右側は最初に示した式です。青字のところに注目です。

最初に4つの値のXORを計算しましたが、これがXORを使って求めた「パリティ」になります。パリティを求めるのにもXOR、パリティを使ってわからなくなってしまった値を復旧するのにもXORという同じ演算だけでできるということがわかります。足し算と引き算のように2つの異なる演算をしないで済むというのはとても大きなことです。バグが入り込む余地がそれだけ減ることにもなりますし。しかも、このXORという演算はANDやOR、NOTなどと一緒でコンピュータにとってもっとも負荷のかからない演算の一つなんですね。
さて、ネットアップの話し。ネットアップは創業当初から独自のストレージOSであるData ONTAP(今はONTAP)でソフトウェア的に
RAID-4をサポートしてきました。ディスク1台当たりの容量が大きくなるとRAIDリコンストラクション(パリティを使ったデータ復旧)と呼ばれる障害からの復旧プロセスにかかる時間が長くなり、その間に別のディスクで障害が発生し結果としてディスクの二重障害になってしまう確率が高くなります。そんな状況に対応するために2003年リリースのData ONTAP6.5に実装されたのがRAID-DP
(RAID-6)で、RAID-4では1台しかなかったパリティディスクを2台にしてディスクの二重障害に対応できるようにしました。その後
2016年にリリースされたONTAP9.0ではさらにもう1台パリティディスクを追加してディスクの三重障害まで対応できるRAID-TECが実装されました。ネットアップの独自性は2台めや3台めのパリティディスクに格納されるパリティ値の算出をすべてXORで行うというものです。他社でもRAID-6を実装しているものはあるようですが、2つめのパリティ値の算出にXORのように単純で負荷の少ない演算ではなくて、複雑で負荷の大きな演算(例えば、RAID-2で使われるハミングコードやメモリの誤り訂正で使われるECCなど)を使用しています。そのため、CPUに対する負荷が上昇することになり、結果として性能への影響が出たりするようです。もちろんネットアップの
RAID-DPやRAID-TECもRAID-4と比べればパリティの計算量は増えるわけですから、当然負荷は上昇しますが、XORだけで算出できるので上昇の幅は最小限と言えます。
以下の3つの図は左からRAID-4、RAID-DP、RAID-TECを表したものです。データはD1~D4の4つのディスクに格納されています。RP(Row Parity)はRAID-4の横パリティ、DP(Diagonal Parity)はRAID-DPで追加された対角(斜め)パリティ、ADP(Anti-Diagonal Parity)はRAID-TECで追加されるもう一つの対角パリティです。パリティはすべてXORで計算された値です。

上図で縦一列が1台のディスクとお考え下さい。RAID-4では4台のデータディスクに対して1台のパリティディスクがありますから全部で5台のディスクがあることになります。実際のデータ復旧の手順は長くなる(特にRAID-DPやRAID-TECでは)のでここでは割愛しますが、すべてXORだけの手順になります。
なお、RAID-DPとRAID-TECの仕組みは特許を取得していてネットアップ独自のものとなっています。当面(特許の有効期間が切れるまで)はネットアップ以外で実装されることありません。
今回はストレージにまつわる基礎技術としてRAIDをご紹介させていただきました。
次はぁ… まだ考え中ですが、まだ書いていない非技術的な読み物的なものにするか、ネットアップの技術紹介あたりにしようかなと思っています。暑い日が続いていますが、お体に気を付けてお過ごしください。ではでは。
