ウマいストレージの選び方。

こんにちは。アイスタイルでインフラエンジニアしてます、インフラグループの廣瀬です。
ネットワーク設計からサーバ・ミドルウェアの設定まで社内の開発の要望を受けて構築したり、時には故障の対応などを行っています。（同業のインフラエンジニアの皆さま、お疲れ様です！）

さて、アドベントカレンダーということで何を書くか迷ったのですが、Webサービスの品質にも影響を及ぼしかねない、ストレージの種類や選定についてまとめたいと思います！
##ストレージの種類
ストレージといっても種類・性能・性質など大きく違うため、何を選ぶか悩む方も多いのではないでしょうか。
最近はAWS利用やIaaS,PaaS利用などのCloud化であまり意識していない方もいらっしゃいますが、ハードウェアレベルまで見て実際にどのよう選定するか？そのパフォーマンスなどを簡単にまとめます。

ストレージは大きく分けて直接接続型とネットワーク接続型と分かれます。
##直接接続型 (DAS)
コンピュータに内蔵して専用バスで接続をするものです。
専用バスとしてはSAS(Serial Attached SCSI),NVMe(NVM Express)などが用いられます。

IO性能の表現はなかなか難しいのですがざっくりいうとBps(Byte per Sec)やIOPSで表現されます。
直接接続型ではRAIDなどの接続構成によりIO性能が違ってきますが、まずはドライブ単体での比較を行います。

|  | HDD (15K) | HDD (10K) | HDD(7.2K) | SSD |
|:-:|:-:|:-:|:-:|:-:|
| 接続I/F | SAS | SAS | SAS (NL-SAS) | SAS<BR>NVMe  |
| 速度(例) | 300MB～210MB[^1] | 241MB～117MB[^2] | 136MB[^3] | 1,100MB (Read)<br>850MB (Write)[^4] |
| IOPS(例) | 210～175[^5] | 150～125[^5] | 100～75[^5] | 200,000 (Read)<br>120,000 (Write)[^4] |

[^1]: http://www.seagate.com/www-content/datasheets/pdfs/enterprise-performance-15k-hddDS1897-1-1608JP--ja_JP.pdf
[^2]: http://www.seagate.com/www-content/product-content/savvio-fam/enterprise-performance-10k-hdd/savvio-10k-7/_shared/docs/ent-performance-10k-hdd-ds1785-6c-1509gb.pdf
[^3]: http://www.seagate.com/www-content/product-content/enterprise-hdd-fam/enterprise-capacity-2-5-hdd/en-us/docs/ent-capacity-2-5-hdd-ds1719-8-1602gb.pdf
[^4]: http://www.seagate.com/www-content/product-content/ssd-fam/1200-ssd/en-us/docs/1200-2-sas-ssd-ds1858-5-1608us.pdf
[^5]: https://www.symantec.com/connect/articles/getting-hang-iops-v13

HDDの場合、速度・IOPSにバラツキがあるのはHDDは回転している円盤であるため、時間当たりのアクセスするデータ量で比較すると内側ほど少なく、外側ほど多くなります。
しかし最近ではHDDにキャッシュメモリ(NVRAM)を搭載して性能の向上を図ったりしています。
SSDの場合は回転のバラツキはないものの、Writeするときは一度削除しなければならないという構造であるため、Read特性よりWrite特性が下回ります。
またSSDはアクセス性能・寿命を向上させるため、ドライバの性能がドライブの性能を左右するといっても過言ではありません。メーカなどによりIOPSがちがうのはチップの性能だけでなくドライバの性能も大きな要素となります。

上記のほかにRAIDを構成している場合にはRAIDカードの性能によるものも大きいですが、原則的には分散すればするほど内部ストレージとしての性能は向上します。（例えばRAID0の場合、HDDの数が倍になれば単純計算アクセス性能も倍になります)

##ネットワーク接続型
Ethernet,Fiber-Channelなどのネットワークを介して接続するものです。 広義ではAmazon S3などのオブジェクトストレージも含まれます。(今回は説明を省略します)
ネットワーク接続型ストレージの性能は採用されているドライブの性能に加え、ネットワーク速度、コントローラ（ミドルウェア）の性能を考慮する必要があります。
例えば、1GbpsのNICを搭載している場合は当然、1Gbps以上の性能が出たりするわけではありません。
※ミドルウェアによる性能の比較はまたの機会に。

### SAN (Storage Area Network)
SANには接続形態によりFC(Fiber-Channel)-SANとIP-SANと分かれます。

**FC-SAN**
FC-SANは高速で高信頼性が必要なネットワークストレージを構築する場合に用いられていました。しかし現在ではより安価なIP-SANが採用されるケースが多くなり、高価ゆえに新規システムでは敬遠される存在となっています。
光ファイバを用いて構築するケースが多いですが、数年前からFCoEというEhternet上でFC-SANを構成する方法も取られています。

**IP-SAN**
IP-SANはiSCSIなどのIP上で動作するプロトコルでストレージを接続する方法です。NFSなどとの違いは直接IP上でコマンド(iSCSIであればSCSIコマンド)を転送するため、ネットワーク上のHDDを操作する感覚で接続されます。

### NAS (Network Attached Storage)
NASはネットワーク上にアタッチ(接続)して利用されるストレージです。主にTCP/IPが使われるのが特徴です。
NASではファイルロックなどの排他制御はNASシステム上で解決します。また、クライアントはNAS上のファイルシステムが何であるかを意識せずに使うことができます。
主なプロトコルとしてはNFS, CIFS(samba)などがあります。

### 分散ストレージシステム・分散ファイルシステム
最近よく耳にするのが分散ストレージです。主にTCP/IP上で複数の物理ストレージをミドルウェア上で結合を行う仕組みです。
分散ストレージではOS上からはデバイスとして認識され、そのうえでXFSなどのファイルシステムを構築する必要がありますが、分散ファイルシステムは専用のドライバでOS上にマウントをすることにより、コマンドによるファイル管理が可能になります。
（この違いはまるでSANとNASの違いのようですね）

**分散ストレージシステム・SDS(Software Defined Storage)**
分散ストレージとしてSheepdog, DRBD, VSAN, ScaleIOなどがあります。最近ではSDS(Software Defined Storage)とカテゴライズされることも多いです。

**分散ファイルシステム (DFS: Distributed File System)**
分散ファイルシステムとしてはGlusterFS, Ceph, HDFSなどがあります。
分散ストレージと分散ファイルシステムの大きな違いはOSのドライバを利用し、ファイル単位でアクセスを行います。

##結局何を選べばいいの？
一番簡単な方法は一度構築をしてスループットを測定することです。
ハードウェアは日々進化していますし、コントローラ・ミドルウェアもそれを動かすCPUもネットワークも日々進化しています。
ただ、その特徴から大まかに分類することは可能です。

|  | DAS | SAN | NAS | SDS | DFS |
|:-:|:-:|:-:|:-:|:-:|:-:|
| パフォーマンス | ○ | ○ | × | △ | △ |
| 高可用性 | ○ | ○ | △ | ○ | ○ |
| 耐障害性 | △ | ○ | △ | ○ | ○ |
| 拡張性 | × | △ | △ | ○ | ○ |
| 保守性 | × | △ | △ | ○ | ○ |
| コストパフォーマンス | ○ | × | △ | ○ | ○ |
| 適するアプリケーション | ・DBサーバ<br>・HTTP Cacheサーバ | ・DBサーバ<br>・FT要件が求められるサーバ | ・画像サーバ<br>・ログ保存サーバ | ・VMイメージストレージ | ・画像サーバ<br>・動画サーバ<br>・ログ保存サーバ  |

##まとめ
そのほかに、説明や比較が複雑になるため今回は説明を省略したオブジェクトストレージなどWebサービスで利用するストレージは様々なものがあります。
最近は分散ストレージ・分散ファイルシステムが主流になっていますが、かといって直接接続型が一切なくなるわけではなく、要件によっては直接接続型が一番コストパフォーマンスに優れていたりします。
このようにそれぞれに特徴、得意不得意などがありますので、アプリケーションが必要とするのは速度なのか、拡張性なのか、保守性なのか、要件を見極めてからどのストレージを利用するのか？を決めることがWebサービスのコスト・品質を決めますので、コードを書く前にどのストレージを使うのか？を考えておくのも重要かと思いますので、ぜひ参考にしていただけたらと思います。