第29章 VDO 統合

29.1. VDO の論理概要

Virtual Data Optimizer (VDO) は、ブロックストレージの圧縮したプールと重複排除したプールを簡単に作成できるブロック仮想化テクノロジーです。
  • 重複排除とは、重複ブロックの複数のコピーを削除することで、ストレージリソースの消費を低減させるための技術です。
    同じデータを 1 度以上書き込むのではなく、VDO は各重複ブロックを検出し、オリジナルブロックへの参照として記録します。VDO は論理ブロックアドレス (VDO 上のストレージレイヤーによって使用) から物理ブロックアドレス (VDO 下のストレージ層によって使用) へのマッピングを維持します。
    重複排除を行った後、複数の論理ブロックアドレスが同じ物理ブロックアドレスにマッピングできます。これらは、shared blocks と呼ばれます。ブロック共有は、ブロックの読み書きを行うストレージのユーザーには表示されません。VDO が存在していない場合は表示されます。共有ブロックが上書きされると、新しい物理ブロックが新しいブロックデータを格納するために割り当てられ、共有物理ブロックにマッピングされているその他の論理ブロックアドレスが変更されないようにします。
  • Compression は、ログファイルやデータベースなどブロックレベルの冗長性を見せる必要がないファイル形式で動作するデータ低減技術です。詳細は「圧縮の使用」を参照してください。
VDO ソリューションは、以下のコンポーネントから成ります。
kvdo
重複排除、圧縮、シンプロビジョニングしたブロックストレージボリュームを利用できるようするために Linux デバイスマッパー層に読み込むカーネルモジュール。
uds
ボリューム上で Universal Deduplication Service (UDS) インデックスと通信して、重複排除を行うためにデータを分析するカーネルモジュール。
コマンドラインツール
最適化したストレージの設定と管理について。

29.1.1. UDS カーネルモジュール (uds)

UDS インデックスは、VDO 製品の基盤を形成します。新しいデータの断片ごとに、その断片が以前に格納されたものと同じであるかどうかを素早く判別します。インデックスが一致を見つけた場合、ストレージシステムは、同じ情報を複数にわたり格納しないように既存の項目を内部的に参照します。
UDS インデックスは、uds カーネルモジュールとしてカーネル内で実行します。

29.1.2. VDO カーネルモジュール (uds)

kvdo Linux カーネルモジュールは、Linux デバイスマッパー層内でブロック層の重複排除サービスを利用できるようにします。Linux カーネルで、デバイスマッパーは、ブロックストレージのプールを管理するためのジェネリックフレームとして機能します。これにより、ブロックプロセスモジュールの、カーネルブロックインターフェースと実際のストレージデバイスドライバー間のストレージスタックへの挿入が可能になります。
kvdo モジュールは、ブロックストレージに直接アクセスできる、または XFS や ext4 などの多くの利用可能な Linux ファイルシステムの 1 つから表示できるブロックデバイスとして表示されます。kvdo が VDO ボリュームからデータの (論理) ブロックの読み込みをリクエストされると、リクエストされた論理ブロックが基礎となる物理ブロックにマッピングされ、リクエストされたデータを読み込んで返します。
kvdo が、VDO ボリュームにブロックデータを書き込むリクエストを受信すると、まず、DISCARD または TRIM リクエストであるかどうかや、データが統合的にゼロであるかどうかをチェックします。どちらかである場合は、kvdo がブロックマップを更新し、リクエストを承認します。そうでなければ、リクエストによって使用する物理ブロックが割り当てられます。

VDO 書き込みポリシーの概要

kvdo モジュールが同期モードで動作している場合:
  1. リクエストのデータを一時的に、割り当てられたブロックに書き込み、リクエストを承認します。
  2. 承認が完了すると、ブロックデータの MurmurHash-3 署名を計算してブロックの重複排除が試行されます。これは、VDO インデックスに送信されます。
  3. VDO インデックスに同じ署名とともにブロックのエントリーが含まれる場合、kvdo は示されたブロックを読み込み、同一であるかを検証するために 2 つのブロックのバイト対バイトの比較を行います。
  4. 同一であることが確認されると、kvdo はブロックマップを更新します。よって、論理ブロックが、一致する物理ブロックに向き、割り当てられた物理ブロックをリリースします。
  5. VDO インデックスに、書き込まれているブロックの署名のエントリーを含まない場合や、示されたブロックが同じデータを含まない場合は、kvdo はブロックマップを更新して、一時的な物理ブロックを永続的にします。
kvdo が非同期モードで動作している場合:
  1. データを書き込む代わりに、リクエストをすぐに承認します。
  2. 上記の説明と同じようにブロックの重複排除試行が行われます。
  3. ブロックが重複していることがわかると、kvdo はブロックマップを更新して、割り当てられたブロックをリリースします。そうでなければ、リクエストのデータを、割り当てられたブロックに書き込み、ブロックマップを更新して物理ブロックを永続なものにします。

29.1.3. VDO ボリューム

VDO はバッキングストアとしてブロックデバイスを使用します。これは、1 つ以上のディスク、パーティション、あるいはフラットからなる物理ストレージの集合を含めることができます。VDO ボリュームがストレージ管理ツールによって作成されると、VDO は UDS インデックスと VDO ボリュームの両方のボリュームから容量を保有します。これは、ともに作用し、ユーザーやアプリケーションが重複排除したブロックストレージを利用できるようになります。図29.1「VDO ディスク整理」 では、これらのつながりの仕組みを説明しています。
VDO ディスク整理

図29.1 VDO ディスク整理

スラブ

VDO ボリュームの物理ストレージは、数多くのスラブに分割されます。これらのそれぞれは、物理容量の隣接する領域です。指定のボリュームのすべてのスラブが同じサイズになります。これは、128 MB のべき乗で最大 32 GB のサイズとなります。
デフォルトのスラブサイズは、より小さなテストシステムで VDO の評価を行えるように 2 GB となっています。単一の VDO ボリュームは最大 8096 スラブを利用できます。よって、2 GB スラブのデフォルトの設定では、最大許容物理ストレージは 16 TB となります。32 GB のスラブを使用すると、最大許容ストレージは 256 TB となります。メタデータ用に VDO によって最低 1 つの完全スラブが予約されます。そのため、ユーザーデータの格納には使用できません。
スラブのサイズは、VDO ボリュームのパフォーマンスには影響しません。

表29.1 物理ボリュームサイズによる推奨の VDO スラブサイズ

物理ボリュームサイズ推奨スラブサイズ
10–99 GB1 GB
100 GB – 1 TB2 GB
2–256 TB32 GB
スラブのサイズは、vdo create コマンドに --vdoSlabSize=megabytes オプションを指定することで制御できます。

物理サイズと利用可能な物理サイズ

物理サイズと利用できる物理サイズの両方で、VDO が利用できるブロックデバイス上のディスク容量が説明されています。
  • 物理サイズは、基礎となるブロックデバイスと同じサイズです。VDO は、このストレージを以下に使用します。
    • 重複排除・圧縮できるユーザーデータ
    • UDS インデックスなどの VDO メタデータ
  • 利用可能な物理サイズは、VDO がユーザーデータ使用できる 物理サイズの部分です。
    これは、物理サイズからメタデータのサイズを引き、指定のスラブサイズでスラブにボリュームを分割した後に残りを引いたものと同等です。
たとえば、さまざまなサイズのブロックデバイスに必要なストレージ VDO メタデータの数などについては、「物理ボリュームサイズによる VDO システム要件の例」 を参照してください。

論理サイズ

--vdoLogicalSize オプションが指定されると、論理ボリュームサイズはデフォルトで利用できる物理ボリュームサイズになります。図29.1「VDO ディスク整理」 では、VDO が重複排除したストレージターゲットがブロックデバイスの上に完全に配置していて、VDO ボリュームの物理サイズが基礎となるブロックデバイスと同じサイズであることを意味することに注意してください。
VDO は現在、絶対最大論理サイズ 4PB の物理母リュームンのサイズの最大 256 倍の論理サイズに対応しています。

29.1.4. コマンドラインツール

VDO には、設定と管理を行うための以下のコマンドラインツールが含まれます。
vdo
VDO ボリュームの作成、設定、制御
vdostats
使用率とパフォーマンスの統計を表示