3.5. データストライピング
ストレージデバイスにはスループットの制限があり、パフォーマンスとスケーラビリティーに影響を及ぼします。したがって、ストレージシステムは多くの場合、複数のストレージデバイス間で連続した情報の連続した情報プライピングに対応し、スループットとパフォーマンスを向上させることができます。データストライピングの最も一般的な形式は RAID から来ています。Ceph のストライピングに最も類似する RAID タイプは、RAID 0、つまり「ストライプ化ボリューム」です。 Ceph のストライピングでは、RAID 0 ストライピングのスループット、n-way RAID ミラーリングの信頼性、および迅速なリカバリーを提供します。
Ceph には、Ceph Block Device、Ceph Filesystem、および Ceph Object Storage の 3 種類のクライアントがあります。Ceph クライアントは、提供される表現形式からユーザー(ブロックデバイスイメージ、RESTful オブジェクト、CephFS ファイルシステムディレクトリー)から Ceph Storage クラスターのストレージのオブジェクトに変換します。
Ceph Storage Cluster に Ceph が格納するオブジェクトはストライプ化されていません。Ceph Object Storage、Ceph Block Device、および Ceph Filesystem は、複数の Ceph Storage Cluster オブジェクトにデータのストライプ化を行います。librados
経由で Ceph Storage クラスターに直接書き込む Ceph クライアントは、これらの利点を得るためにストライピング(および並列 I/O)を実行する必要があります。
最も単純な Ceph のストライプ化形式には、1 つのオブジェクトのストライプ数が含まれます。Ceph クライアントは、オブジェクトが最大容量になるまで Ceph Storage Cluster オブジェクトにストライプユニットを書き込みます。その後、データの追加のストライプ用に別のオブジェクトを作成します。ストライプ化の最も単純な形式は、小さなブロックデバイスイメージ、S3 または Swift オブジェクトにとって十分と言えます。ただし、この単純な形式では、配置グループ全体にデータを分散する Ceph の機能をを最大限に活用しないため、パフォーマンスはそれほど向上しません。以下の図は、ストライプ化の最も単純な形式を示しています。
大規模なイメージサイズ、大規模な S3 または Swift オブジェクト(ビデオなど)を予測できる場合には、オブジェクトセット内の複数のオブジェクトにクライアントデータを取り除くことで、パフォーマンスを大幅に改善できる可能性があります。クライアントが対応するオブジェクトに並列にストライプユニットを書き込むと、書き込みパフォーマンスが大幅に向上します。オブジェクトは異なる配置グループにマッピングされ、さらに異なる OSD にマッピングされるため、それぞれの書き込みは最大書き込み速度で並行して行われます。1 つのディスクへの書き込みは、ヘッドの移動(シークあたり 6 ミリ秒など)と 1 つのデバイスの帯域幅(例: 100MB/s)によって制限されます。Ceph は、(異なる配置グループおよび OSD にマップする)複数のオブジェクトへの書き込みを分散することで、ドライブごとのシーク数を減らし、複数のドライブのスループットを組み合わせて書き込み(または読み取り)の速度を大幅に向上させることができます。
ストライプ化は、オブジェクトレプリカとは独立しています。CRUSH は OSD 間でオブジェクトを複製するため、ストライプは自動的に複製されます。
以下の図では、クライアントデータは、4 つのオブジェクトで構成されるオブジェクトセット (以下の図の object set 1
) でストライプ化されます。最初のストライプユニットは、object 0
の stripe unit 0
です。4 番目のストライプユニットは、object 3
の stripe unit 3
です。4 番目のストライプを作成したら、クライアントはオブジェクトセットがいっぱいかどうかを判断します。オブジェクトセットが満杯でない場合は、クライアントは最初のオブジェクトにストライプを書き始めます(以下の図のオブジェクト 0
)。オブジェクトセットが満杯になると、クライアントは新しいオブジェクトセット(以下の図のobject set 2
)を作成し、新しいオブジェクトセット(以下の図のオブジェクト4
)の最初のオブジェクトで最初のストライプ(ストライプユニット 16
)への書き込みを開始します。
3 つの重要な変数が、Ceph によるデータのストライプ化方法を決定します。
- オブジェクトサイズ: Ceph Storage クラスターのオブジェクトには、設定可能な最大サイズ(2MB、4MB など)があります。オブジェクトのサイズは、多くのストライプユニットを収容するのに十分な大きさであり、ストライプユニットの倍数である必要があります。Red Hat は、安全な最大値 16 MB を推奨します。
- ストライプの幅: Stripes には設定可能なユニットサイズ(64kb など)があります。Ceph クライアントは、オブジェクトに書き込むデータを、最後のストライプユニットを除いて、同じサイズのストライプユニットに分割します。ストライプ幅は、オブジェクトに多くのストライプユニットが含まれるように、オブジェクトサイズのごく一部にする必要があります。
- ストライプ数: Ceph クライアントは、ストライプ数で決定される一連のオブジェクトに一連のストライプユニットを書き込みます。一連のオブジェクトは、オブジェクトセットと呼ばれます。Ceph クライアントがオブジェクトセットの最後のオブジェクトに書き込みした後に、オブジェクトセットの最初のオブジェクトに戻ります。
クラスターを実稼働環境に移行する前に、ストライプ化設定のパフォーマンスをテストします。データをストライプ化してオブジェクトに書き込んだ後は、これらのストライプ化パラメーターを変更することはできません。
Ceph クライアントがデータをストライプユニットにストライプ化し、ストライプユニットをオブジェクトにマッピングすると、Ceph の CRUSH アルゴリズムは、オブジェクトをストレージディスクにファイルとして保存する前に、オブジェクトを配置グループにマッピングし、配置グループを CephOSD デーモンにマッピングします。
クライアントは単一のプールに書き込むため、オブジェクトにストライプ化されたすべてのデータは、同じプールの配置グループにマッピングされます。したがって、同じ CRUSH マップと同じアクセス制御を使用します。