3.3. layering
Ceph は、ブロックデバイススナップショットの多数のコピーオンライト (COW) またはコピーオンリード (COR) のクローンを作成する機能をサポートしています。スナップショットの階層化により、Ceph ブロックデバイスクライアントはイメージを非常に迅速に作成できます。たとえば、Linux 仮想マシンに書き込まれた Linux 仮想マシンを使用してブロックデバイスイメージを作成し、そのイメージをスナップショットを作成してスナップショットを保護し、必要に応じてクローンを作成します。スナップショットは読み取り専用であるため、スナップショットのクローンを作成するとセマンティクスが簡素化され、クローンの作成時間を短縮できます。
![diag 967b328072067089c89ce979bb26daff](https://access.redhat.com/webassets/avalon/d/Red_Hat_Ceph_Storage-3-Block_Device_Guide-ja-JP/images/be4976e5fbcb7b94226f9f84666a21d7/diag-967b328072067089c89ce979bb26daff.png)
親
および 子
という用語は、Ceph ブロックデバイスのスナップショット (親)、およびスナップショットからクローン作成された対応のイメージ (子) を意味します。以下のコマンドラインを使用する場合に、これらの用語が重要です。
クローン作成された各イメージ (子) は、親イメージへの参照を保存し、クローン作成されたイメージで親スナップショットを開き、読み取ることができるようになります。この参照は、クローンが フラット化
(スナップショットからの情報が完全にクローンにコピー) されると、削除されます。フラット化の詳細は、「クローンしたイメージのフラット化」 を 参照
してください。
スナップショットのクローン作成は、他の Ceph ブロックデバイスイメージのように動作します。クローン作成されたイメージを読み取り、書き込み、クローンし、サイズを変更できます。クローン作成されたイメージには、特別な制限はありません。ただし、スナップショットのクローンはスナップショットを参照するので、クローンを作成する前にスナップショットを保護する 必要があります。
スナップショットのクローンは、コピーオンライト (COW) またはコピーオンリード (COR) のいずれかです。クローンではコピーオンライト (COW) は常に有効で、コピーオンリード (COR) は明示的に有効化する必要があります。コピーオンライト (COW) は、クローン内の未割り当てのオブジェクトへの書き込み時に、親からクローンにデータをコピーします。コピーオンリード (COR) は、クローン内の未割り当てのオブジェクトから読み取る時に、親からクローンにデータをコピーします。クローンからデータの読み取りは、オブジェクトがクローンに存在しない場合、親からのデータのみを読み取ります。RADOS ブロックデバイスでは、大規模なイメージを複数のオブジェクトに分割し(デフォルトは 4 MB)、すべてのコピーオンライト(COW)および Copy-on-read(COR)操作が完全なオブジェクト(つまり 1 バイトをクローンに書き込む)で行われます(つまり、クローンに 1 バイトを書き込む)、宛先オブジェクトが親から読み取られ、以前の COW/COR 操作からクローンに存在しない場合は、クローンに書き込まれます。
コピーオンリード (COR) が有効になっているかどうか。クローンから下層にあるオブジェクトを読み取ることができない場合には、親に再ルーティングされます。実質的に親の数に制限が特にないため、クローンのクローンを作成できます。これは、オブジェクトが見つかるまで、またはベースの親イメージに到達するまで、この再ルーティングが続行されます。コピーオンリード (COR) が有効になっている場合には、クローンから直接読み取ることができない場合には、親からすべてのオブジェクトを読み取り、そのデータをクローンに書き込むことで、今後、親から読み取る必要なく、同じエクステントの読み取りがクローン自体で行われるようにします。
これは基本的に、オンデマンドのオブジェクトごとのフラット化操作です。これは、クローンが親から離れた高遅延接続の場所 (別の地理的場所の別のプールにある親など) にある場合に特に便利です。コピーオンリード (COR) では、読み取りのならし遅延が短縮されます。最初の数回読み取りは、親から追加のデータが読み取られるため、レイテンシーが高くなっています。たとえば、クローンから 1 バイトを読み取る場合に、4 MB を親から読み取り、クローンに書き込みする必要がありますが、それ以降はクローン自体からすべての読み取りが行われます。
スナップショットからコピーオンリード (COR) のクローンを作成するには、ceph.conf
ファイルの [global]
セクションまたは [client]
セクションに rbd_clone_copy_on_read = true
を追加してこの機能を明示的に有効にする必要があります。
3.3.1. レイヤーの使用開始
Ceph ブロックデバイスの階層化は単純なプロセスです。イメージが必要です。イメージのスナップショットを作成する必要があります。スナップショットを保護する必要があります。これらの手順を実行すると、スナップショットのクローン作成を開始できます。
![diag ac00bea462a56481a9db915ac61f1523](https://access.redhat.com/webassets/avalon/d/Red_Hat_Ceph_Storage-3-Block_Device_Guide-ja-JP/images/592c75b65f1641b828aa3665bc014cb8/diag-ac00bea462a56481a9db915ac61f1523.png)
クローン作成されたイメージには、親スナップショットへの参照があり、プール ID、イメージ ID、およびスナップショット ID が含まれます。プール ID が含まれると、あるプールから別のプールにスナップショットのクローンを作成できます。
-
イメージテンプレート: ブロックデバイスの階層化における一般的なユースケースとして、マスターイメージと、クローンのテンプレートとして機能するスナップショットが作成されます。たとえば、RHEL7 ディストリビューションのイメージを作成して、そのスナップショットを作成できます。定期的に、ユーザーはイメージを更新して新規スナップショットを作成することができます(
yum update
、yum upgrade
、rbd snap create
など)。イメージが成熟すると、ユーザーはスナップショットのいずれかのクローンを作成できます。 - 拡張テンプレート: より高度なユースケースには、ベースイメージよりも多くの情報を提供するテンプレートイメージの拡張が含まれます。たとえば、ユーザーはイメージのクローンを作成し(仮想マシンテンプレートなど)、他のソフトウェア(データベース、コンテンツ管理システム、解析システムなど)をインストールし、ベースイメージと同様に更新できる拡張イメージをスナップショットできます。
- テンプレートプール: ブロックデバイスの階層化を使用する方法は、テンプレートとして機能するマスターイメージを含むプールと、それらのテンプレートのスナップショットを作成することです。その後、ユーザーに読み取り専用の権限を拡張して、プール内で読み書きや実行を実行せずにスナップショットのクローンを作成できます。
- イメージの移行/リカバリー: ブロックデバイスの階層化を使用する方法は、あるプールから別のプールにデータを移行または復元することです。
3.3.2. スナップショットの保護
親スナップショットのクローン作成は、親スナップショットにアクセスします。ユーザーが親のスナップショットを誤って削除した場合に、クローンはすべて破損します。データの損失を防ぐには、クローンを作成する前にスナップショットを保護する 必要 があります。これには以下のコマンドを実行します。
[root@rbd-client ~]# rbd --pool {pool-name} snap protect --image {image-name} --snap {snapshot-name} [root@rbd-client ~]# rbd snap protect {pool-name}/{image-name}@{snapshot-name}
以下に例を示します。
[root@rbd-client ~]# rbd --pool rbd snap protect --image my-image --snap my-snapshot [root@rbd-client ~]# rbd snap protect rbd/my-image@my-snapshot
保護されたスナップショットは削除できません。
3.3.3. スナップショットのクローン作成
スナップショットのクローンを作成するには、親プール、イメージ、スナップショット、および子プールおよびイメージ名を指定する必要があります。スナップショットのクローンを作成する前に、スナップショットを保護する必要があります。これには以下のコマンドを実行します。
[root@rbd-client ~]# rbd --pool {pool-name} --image {parent-image} --snap {snap-name} --dest-pool {pool-name} --dest {child-image} [root@rbd-client ~]# rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}
以下に例を示します。
[root@rbd-client ~]# rbd clone rbd/my-image@my-snapshot rbd/new-image
スナップショットは、あるプールから別のプールのイメージにクローンできます。たとえば、読み取り専用のイメージやスナップショットを 1 つのプール内のテンプレートとして維持し、別のプール内の書き込み可能なクローンとして維持することができます。
3.3.4. スナップショットの保護解除
スナップショットを削除する前に、そのスナップショットを保護解除する必要があります。さらに、クローンからの参照があるスナップショットは、削除できません。スナップショットを削除する前に、スナップショットの各クローンをフラット化する必要があります。これには以下のコマンドを実行します。
[root@rbd-client ~]#rbd --pool {pool-name} snap unprotect --image {image-name} --snap {snapshot-name} [root@rbd-client ~]# rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}
以下に例を示します。
[root@rbd-client ~]# rbd --pool rbd snap unprotect --image my-image --snap my-snapshot [root@rbd-client ~]# rbd snap unprotect rbd/my-image@my-snapshot
3.3.5. スナップショットの子の一覧表示
スナップショットの子を一覧表示するには、以下のコマンドを実行します。
rbd --pool {pool-name} children --image {image-name} --snap {snap-name} rbd children {pool-name}/{image-name}@{snapshot-name}
以下に例を示します。
rbd --pool rbd children --image my-image --snap my-snapshot rbd children rbd/my-image@my-snapshot
3.3.6. クローンしたイメージのフラット化
クローン作成されたイメージは、親スナップショットへの参照を保持します。子クローンから親スナップショットに参照を削除すると、スナップショットからクローンに情報をコピーして、イメージを効果的に「フラット化」します。スナップショットのサイズでクローンのフラット化にかかる時間が増加します。
子イメージに関連付けられた親イメージのスナップショットを削除するには、最初に子イメージをフラット化する必要があります。
[root@rbd-client ~]# rbd --pool <pool-name> flatten --image <image-name> [root@rbd-client ~]# rbd flatten <pool-name>/<image-name>
以下に例を示します。
[root@rbd-client ~]# rbd --pool rbd flatten --image my-image [root@rbd-client ~]# rbd flatten rbd/my-image
フラット化イメージにはスナップショットからのすべての情報が含まれるため、フラット化されるイメージは階層化されたクローンよりも多くのストレージ領域を使用します。
イメージで ディープフラット
機能が有効になっている場合には、イメージのクローンは、デフォルトで親から分離されます。