Storage
sds

分散ストレージを語る

もぉーいーくつねーるとぉー○○○○○~。さて○に入る文字は何でしょう?

そうですね、クリスマスですね!!
アイスタイル アイスタイル Advent Calendar 2017 8日目担当します、廣瀬です。
皆さんはリース飾りましたか?私は今日の朝、「さっさと飾れやヴォケェ!」とたたき起こされて気分↑↑でかざりましたヨ♪

で、本題。

早いもので昨年はウマいストレージの選び方。というお題でストレージの性能、何を軸に選んだらいいか、などインフラなお話をしました。
私はインフラエンジニアなので、今回もインフラなことを話そうと思います。

分散ストレージの種類。

SDS(Software Defined Storage)のカテゴリでもある分散ストレージ、様々なものがありますね。
分散ストレージといっても、ストアの方法から大きく2つに大別できます。

オブジェクトストレージ

オブジェクトストレージは読み込み・書き込みの最小単位が「ファイル」になることが特徴です。
AWSのS3もオブジェクトストレージであることは皆さんもよくご存知かと思います。
それだけではなく入出力の方法も主にAPI経由であることも一つの特徴ですね。

ブロックストレージ

ブロックストレージの読み込み・書き込みの最小単位は「ブロック」になります。
普段使っているHDD,SSDもブロックストレージと言われますが、大きく違いうのはブロックの大きさです。
HDD,SSDの場合は数KB程度のブロックで読み書きを行いますが、分散ストレージはネットワークを使うため、ネットワークでKBをやり取りするとオーバヘッドが大きくなりすぎるため、数MBのブロックでやり取りされることが多いです。
ブロックストレージではたいていの場合、APIではなくドライバをとおしてPOSIX準拠で読み書きを行います。

で、どうやってつかうの?

では実際にどう使うか。
PHPの場合、オブジェクトストレージの場合は下記のようにライブラリを通して、ファイルにアクセスすることになります。
また、アクセスをする前に基本的な認証はすべて終えていることが前提となります。

// Get an object.
$result = $s3->getObject(array(
'Bucket' => $bucket,
'Key' => $keyname
));

※参考 : AWS SDK for PHP を使用したオブジェクトの取得

ブロックストレージの場合はどうなるか? POSIXでアクセスが可能なので、普通にローカルストレージをアクセスするように読み書きができますね。
こちらも、事前にマウントされていることが前提となります。

$result = file_get_contents('/path/to/target.file');

※参考 : PHP Manual - file_get_contents()
大きな違いとしては、この場合では、オブジェクトストレージは複数のクライアントから同時に読むことができますが、ブロックストレージは共有可能なファイルシステム(ex. OCFS2)等、特殊な構成でない限り、複数のクライアントからの同時読み込みはできない、ということです。

このことから、オブジェクトストレージは主に、複数のクライアントからドキュメントなどの共有リソースを読むのに最適な分散ストレージであり、ブロックストレージは仮想マシンのディスクイメージなど排他アクセスが必要なケースで利用される、と考えてよいかと思います。

で、使えんの?

そもそもなぜ分散するか?ですが、これはストレージが壊れた時等の可用性の向上のためにに分散をかけます。
たいていの分散ファイルシステムはデータノードが1台故障しただけではデータロストや不整合は起きないように設計されています。
また、複数ノードで全く同じ数のファイルを持つことは、リソースの無駄になってしまいます。
そのため、ある一定の単位で複数ノードにコピーを置きながら、可用性を高めるような設計になっています。この点ではオブジェクトストレージもブロックストレージも共通しています。
一番の弱点はそれがネットワークを介して制御されていることです。

現在のコンピュータネットワークは早くなったものの、まだ、内部Busの速度に比べてはるかに遅いです。
※しかし、Diskのインターフェイスの速度には近づきつつある。

下記は物理Diskと分散ストレージ(Sheepdog 4Node)のIOPSを比較したものです。構成はすべて1HDD(SAS Disk)しか使っていません。
image.png

Sheepdog 1プロセス時のシーケンシャルリードの値が悪いですが、プロセスを多重化するとIOPSレベルでは物理Diskとほぼ同一、場合によっては物理ディスクを抜くパフォーマンスが出ていることが確認できます。(特にRandom Read/Writeのパフォーマンスが物理を抜いている傾向にある)
※さらに未チューニングであるため、チューニングの内容によってはこれ以上のパフォーマンスが期待できます。

このことから、分散ストレージはネットワークを使う分、物理ディスクよりもパフォーマンスが落ちることも想定はされますが、昨今のネットワーク性能を鑑みると、データベース等のよほど高IOPSが求められる環境でないかぎりは十分に実用に耐えうるものではないかと推測されます。

っていうことでまとめ。

今回は分散ストレージの概略から特徴、ブロックストレージだけにはなりますが、物理ディスクとのIOPSの比較をご紹介いたしました。
分散ストレージはノードが増えればその分パフォーマンスが上がり、可用性の向上にもつながるスケールアウト型のシステムであるので少しでも興味を持っていただき、より障害に強い、運用のしやすいシステムの構築のきっかけになればと思います。

さて、明日のAdvent Calendarは@hirotsumさんの「新卒エンジニアさんの成長を見守った記録」とのことです!お楽しみに!!