(57)【特許請求の範囲】
【請求項１】
書き込み対象データを複数のブロックデータに分割するデータ分割手段と、
前記データ分割手段にて分割した前記各ブロックデータが、記憶装置に既に記憶されているか否かを調べるブロック検出手段と、
前記データ分割手段にて分割した前記各ブロックデータを記憶装置に記憶すると共に、当該記憶装置に既に記憶されているブロックデータと同一内容の他のブロックデータを記憶装置に記憶する場合には、当該記憶装置に既に記憶されているブロックデータを前記他のブロックデータとして参照させるデータ書き込み手段と、を備え、
前記ブロック検出手段は、前記データ分割手段にて分割した前記ブロックデータのうち前記書き込み対象データ中の所定範囲を構成する連続する複数のブロックデータと、記憶装置に既に連続して記憶されている所定範囲の複数のブロックデータと、の共通部分の割合を表す共通割合を検出し、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて、前記データ分割手段にて分割した前記ブロックデータを、新たに記憶装置に記憶する、
ストレージ装置。
【請求項２】
請求項１に記載のストレージ装置であって、
前記ブロック検出手段は、前記データ分割手段にて分割した特定の前記ブロックデータが記憶装置に既に記憶されていることを検出した場合に、前記書き込み対象データ中の所定範囲を構成する前記特定のブロックデータから連続する複数のブロックデータと、記憶装置内に既に記憶されている前記特定のブロックデータと同一内容のブロックデータから連続する所定範囲の複数のブロックデータと、の前記共通割合を検出し、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて、前記特定のブロックデータを新たに記憶装置に記憶する、
ストレージ装置。
【請求項３】
請求項１又は２に記載のストレージ装置であって、
前記ブロック検出手段は、前記データ分割手段にて分割した前記ブロックデータのうち前記書き込み対象データ中の所定範囲を構成する連続する複数のブロックデータのそれぞれが、当該連続する複数のブロックデータの並び順に関係なく、記憶装置に既に連続して記憶されている所定範囲の複数のブロックデータのそれぞれと一致する割合を、前記共通割合として検出する、
ストレージ装置。
【請求項４】
請求項１乃至３のいずれかに記載のストレージ装置であって、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合が予め設定された値以下である場合に、前記データ分割手段にて分割した前記ブロックデータを新たに記憶装置に記憶する、
ストレージ装置。
【請求項５】
請求項１乃至４のいずれかに記載のストレージ装置であって、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて新たに記憶装置に記憶する前記ブロックデータの容量が、所定の容量以下となるよう設定する、
ストレージ装置。
【請求項６】
請求項１乃至４のいずれかに記載のストレージ装置であって、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて新たに記憶装置に記憶する前記ブロックデータである再書き込みブロックデータの容量が、前記書き込み対象データのうち既に記憶装置に記憶されているデータの容量に対して、予め設定された割合以下となるよう設定する、
ストレージ装置。
【請求項７】
請求項６に記載のストレージ装置であって、
前記データ書き込み手段は、前記再書き込みブロックデータの容量が、前記書き込み対象データのうち既に記憶装置に記憶されているデータの容量に対して、５％以下となるよう設定する、
ストレージ装置。
【請求項８】
情報処理装置に、
書き込み対象データを複数のブロックデータに分割するデータ分割手段と、
前記データ分割手段にて分割した前記各ブロックデータが、記憶装置に既に記憶されているか否かを調べるブロック検出手段と、
前記データ分割手段にて分割した前記各ブロックデータを記憶装置に記憶すると共に、当該記憶装置に既に記憶されているブロックデータと同一内容の他のブロックデータを記憶装置に記憶する場合には、当該記憶装置に既に記憶されているブロックデータを前記他のブロックデータとして参照させるデータ書き込み手段と、を実現させると共に、
前記ブロック検出手段は、前記データ分割手段にて分割した前記ブロックデータのうち前記書き込み対象データ中の所定範囲を構成する連続する複数のブロックデータと、記憶装置に既に連続して記憶されている所定範囲の複数のブロックデータと、の共通部分の割合を表す共通割合を検出し、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて、前記データ分割手段にて分割した前記ブロックデータを、新たに記憶装置に記憶する、
ことを実現させるためのプログラム。
【請求項９】
請求項８に記載のプログラムであって、
前記ブロック検出手段は、前記データ分割手段にて分割した特定の前記ブロックデータが記憶装置に既に記憶されていることを検出した場合に、前記書き込み対象データ中の所定範囲を構成する前記特定のブロックデータから連続する複数のブロックデータと、記憶装置内に既に記憶されている前記特定のブロックデータと同一内容のブロックデータから連続する所定範囲の複数のブロックデータと、の前記共通割合を検出し、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて、前記特定のブロックデータを新たに記憶装置に記憶する、
プログラム。
【請求項１０】
請求項８又は９に記載のプログラムであって、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて新たに記憶装置に記憶する前記ブロックデータである再書き込みブロックデータの容量が、前記書き込み対象データのうち既に記憶装置に記憶されているデータの容量に対して、予め設定された割合以下となるよう設定する、
プログラム。
【請求項１１】
書き込み対象データを複数のブロックデータに分割し、
分割した前記各ブロックデータが、記憶装置に既に記憶されているか否かを調べ、
分割した前記各ブロックデータを記憶装置に記憶すると共に、当該記憶装置に既に記憶されているブロックデータと同一内容の他のブロックデータを記憶装置に記憶する場合には、当該記憶装置に既に記憶されているブロックデータを前記他のブロックデータとして参照させることによりデータを書き込む情報処理方法であり、
前記書き込み対象データをブロックデータに分割した後に、当該分割した前記ブロックデータのうち前記書き込み対象データ中の所定範囲を構成する連続する複数のブロックデータと、記憶装置に既に連続して記憶されている所定範囲の複数のブロックデータと、の共通部分の割合を表す共通割合を検出し、
検出した前記共通割合に応じて、分割した前記ブロックデータを、新たに記憶装置に記憶する、
情報処理方法。
【請求項１２】
請求項１１に記載の情報処理方法であって、
前記書き込み対象データをブロックデータに分割した後に、当該分割した特定の前記ブロックデータが記憶装置に既に記憶されていることを検出した場合に、前記書き込み対象データ中の所定範囲を構成する前記特定のブロックデータから連続する複数のブロックデータと、記憶装置内に既に記憶されている前記特定のブロックデータと同一内容のブロックデータから連続する所定範囲の複数のブロックデータと、の前記共通割合を検出し、
検出した前記共通割合に応じて、前記特定のブロックデータを新たに記憶装置に記憶する、
情報処理方法。
【請求項１３】
請求項１１又は１２に記載の情報処理方法であって、
検出した前記共通割合に応じて新たに記憶装置に記憶する前記ブロックデータである再書き込みブロックデータの容量が、前記書き込み対象データのうち既に記憶装置に記憶されているデータの容量に対して、予め設定された割合以下となるよう設定する、
情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ装置にかかり、特に、同一内容のデータの重複記憶を排除するストレージ装置に関する。
【背景技術】
【０００２】
近年、コンピュータの発達及び普及に伴い、種々の情報がデジタルデータ化されている。このようなデジタルデータを保存しておく装置として、磁気テープや磁気ディスクなどの記憶装置がある。そして、保存すべきデータは日々増大し、膨大な量となるため、大容量なストレージシステムが必要となっている。また、記憶装置に費やすコストを削減しつつ、信頼性も必要とされる。これに加えて、後にデータを容易に取り出すことが可能であることも必要である。その結果、自動的に記憶容量や性能の増大を実現できると共に、重複記憶を排除して記憶コストを削減し、さらには、冗長性の高いストレージシステムが望まれている。
【０００３】
このような状況に応じて、近年では、特許文献１に示すように、コンテンツアドレスストレージシステムが開発されている。このコンテンツアドレスストレージシステムは、データを分散して複数の記憶装置に記憶すると共に、このデータの内容に応じて特定される固有のコンテンツアドレスによって、当該データを格納した格納位置が特定される。また、コンテンツアドレスストレージシステムの中には、所定のデータを複数のフラグメントに分割すると共に、冗長データとなるフラグメントをさらに付加して、これら複数のフラグメントをそれぞれ複数の記憶装置にそれぞれ格納する、というものもある。
【０００４】
そして、上述したようなコンテンツアドレスストレージシステムでは、後に、コンテンツアドレスを指定することにより、当該コンテンツアドレスにて特定される格納位置に格納されているデータつまりフラグメントを読み出し、複数のフラグメントから分割前の所定のデータを復元することができる。
【０００５】
また、上記コンテンツアドレスは、データの内容に応じて固有となるよう生成される値、例えばデータのハッシュ値、に基づいて生成される。このため、重複データであれば同じ格納位置のデータを参照することで、同一内容のデータを取得することができる。従って、重複データを別々に格納する必要がなく、重複記録を排除し、データ容量の削減を図ることができる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００５−２３５１７１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ここで、上述したような重複記憶を排除する機能を有するストレージシステムでは、ファイルなど書き込み対象となるデータを所定容量の複数のブロックデータに分割して記憶装置に書き込む。このように、ブロックデータ単位で重複記憶を排除することで、データ容量の削減を図っている。
【０００８】
ところが、書き込み対象データを構成する複数のブロックデータのうちのいくつかが、記憶装置に記憶されていない新たなブロックデータである場合には、当該新たなブロックデータは、現在、所定のデータが格納されている領域の最後に格納される。そして、書き込み対象データが更新される度に新たにブロックデータが格納されることが繰り返されると、当該書き込み対象データを構成する複数のブロックデータが、記憶装置内の記憶領域全体に拡散して格納されることとなる。すると、後にデータを読み出す際には、記憶装置全体に拡散したブロックデータを読み出すべく、膨大な数のディスクを走査しなければならず、読み出し性能が低下する、という問題が生じる。
【０００９】
このため、本発明の目的は、上述した課題である、重複記憶排除機能を有するストレージ装置において、読み出し性能の低下という問題を解決すること、にある。
【課題を解決するための手段】
【００１０】
本発明の一形態であるストレージ装置は、
書き込み対象データを複数のブロックデータに分割するデータ分割手段と、
前記データ分割手段にて分割した前記各ブロックデータが、記憶装置に既に記憶されているか否かを調べるブロック検出手段と、
前記データ分割手段にて分割した前記各ブロックデータを記憶装置に記憶すると共に、当該記憶装置に既に記憶されているブロックデータと同一内容の他のブロックデータを記憶装置に記憶する場合には、当該記憶装置に既に記憶されているブロックデータを前記他のブロックデータとして参照させるデータ書き込み手段と、を備え、
前記ブロック検出手段は、前記データ分割手段にて分割した前記ブロックデータのうち前記書き込み対象データ中の所定範囲を構成する連続する複数のブロックデータと、記憶装置に既に連続して記憶されている所定範囲の複数のブロックデータと、の共通部分の割合を表す共通割合を検出し、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて、前記データ分割手段にて分割した前記ブロックデータを、新たに記憶装置に記憶する、
という構成をとる。
【００１１】
また、本発明の他の形態であるプログラムは、
情報処理装置に、
書き込み対象データを複数のブロックデータに分割するデータ分割手段と、
前記データ分割手段にて分割した前記各ブロックデータが、記憶装置に既に記憶されているか否かを調べるブロック検出手段と、
前記データ分割手段にて分割した前記各ブロックデータを記憶装置に記憶すると共に、当該記憶装置に既に記憶されているブロックデータと同一内容の他のブロックデータを記憶装置に記憶する場合には、当該記憶装置に既に記憶されているブロックデータを前記他のブロックデータとして参照させるデータ書き込み手段と、を実現させると共に、
前記ブロック検出手段は、前記データ分割手段にて分割した前記ブロックデータのうち前記書き込み対象データ中の所定範囲を構成する連続する複数のブロックデータと、記憶装置に既に連続して記憶されている所定範囲の複数のブロックデータと、の共通部分の割合を表す共通割合を検出し、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて、前記データ分割手段にて分割した前記ブロックデータを、新たに記憶装置に記憶する、
ことを実現させるためのプログラムである。
【００１２】
また、本発明の他の形態である情報処理方法は、
書き込み対象データを複数のブロックデータに分割し、
分割した前記各ブロックデータが、記憶装置に既に記憶されているか否かを調べ、
分割した前記各ブロックデータを記憶装置に記憶すると共に、当該記憶装置に既に記憶されているブロックデータと同一内容の他のブロックデータを記憶装置に記憶する場合には、当該記憶装置に既に記憶されているブロックデータを前記他のブロックデータとして参照させることによりデータを書き込む情報処理方法であり、
前記書き込み対象データをブロックデータに分割した後に、当該分割した前記ブロックデータのうち前記書き込み対象データ中の所定範囲を構成する連続する複数のブロックデータと、記憶装置に既に連続して記憶されている所定範囲の複数のブロックデータと、の共通部分の割合を表す共通割合を検出し、
検出した前記共通割合に応じて、分割した前記ブロックデータを、新たに記憶装置に記憶する、
という構成をとる。
【発明の効果】
【００１３】
本発明は、以上のように構成されるため、重複記憶排除機能を有するストレージ装置における読み出し性能の低下を抑制することができる。
【図面の簡単な説明】
【００１４】
【図１】本発明の実施形態１におけるストレージシステムを含むシステム全体の構成を示すブロック図である。
【図２】本発明の実施形態１におけるストレージシステムの構成の概略を示すブロック図である。
【図３】本発明の実施形態１におけるストレージシステムの構成を示す機能ブロック図である。
【図４】図３に開示したストレージシステムにおけるデータ書き込み処理の様子を説明するための説明図である。
【図５】図３に開示したストレージシステムにおけるデータ書き込み処理の様子を説明する説明図である。
【図６】図３に開示したストレージシステムにおけるデータ書き込み処理の様子を説明する説明図である。
【図７】図３に開示したストレージシステムにおけるデータ書き込み処理の様子を説明する説明図である。
【図８】図３に開示したストレージシステムにおけるデータ書き込み処理の動作を示すフローチャートである。
【図９】本発明の実施形態２で説明する論文で参照する図である。
【図１０】本発明の実施形態２で説明する論文で参照する図である。
【図１１】本発明の実施形態２で説明する論文で参照する図である。
【図１２】本発明の実施形態２で説明する論文で参照する図である。
【図１３】本発明の実施形態２で説明する論文で参照する図である。
【図１４】本発明の実施形態２で説明する論文で参照する図である。
【図１５ａ】本発明の実施形態２で説明する論文で参照する図である。
【図１５ｂ】本発明の実施形態２で説明する論文で参照する図である。
【図１５ｃ】本発明の実施形態２で説明する論文で参照する図である。
【図１５ｄ】本発明の実施形態２で説明する論文で参照する図である。
【図１６】本発明の実施形態２で説明する論文で参照する図である。
【図１７】本発明の実施形態２で説明する論文で参照する図である。
【図１８】本発明の実施形態２で説明する論文で参照する図である。
【図１９】本発明の付記１におけるストレージ装置の構成を示すブロック図である。
【発明を実施するための形態】
【００１５】
＜実施形態１＞
本発明の第１の実施形態を、図１乃至図８を参照して説明する。図１は、システム全体の構成を示すブロック図である。図２は、ストレージシステムの概略を示すブロック図であり、図３は、ストレージシステムの構成を示す機能ブロック図である。図４乃至図７は、ストレージシステムにおけるデータ書き込み処理の動作を説明するための説明図である。図８は、ストレージシステムの動作を示すフローチャートである。
【００１６】
ここで、本実施形態は、後述する付記に記載のストレージ装置等の具体的な一例を示すものである。そして、以下では、ストレージシステムが、複数台のサーバコンピュータが接続されて構成されている場合を説明する。但し、本発明におけるストレージシステムは、複数台のコンピュータにて構成されることに限定されず、１台のコンピュータで構成されていてもよい。
【００１７】
図１に示すように、本発明におけるストレージシステム１は、ネットワークＮを介してバックアップ処理を制御するバックアップシステム４に接続している。そして、バックアップシステム４は、ネットワークＮを介して接続されたバックアップ対象装置５に格納されているバックアップ対象データ（書き込み対象となるデータ）を取得し、ストレージシステム１に対して記憶するよう要求する。これにより、ストレージシステム１は、記憶要求されたバックアップ対象データをバックアップ用に記憶する。
【００１８】
そして、図２に示すように、本実施形態におけるストレージシステム１は、複数のサーバコンピュータが接続された構成を採っている。具体的に、ストレージシステム１は、ストレージシステム１自体における記憶再生動作を制御するサーバコンピュータであるアクセラレータノード２と、データを格納する記憶装置を備えたサーバコンピュータであるストレージノード３と、を備えている。なお、アクセラレータノード２の数とストレージノード３の数は、図２に示したものに限定されず、さらに多くの各ノード２，３が接続されて構成されていてもよい。
【００１９】
さらに、本実施形態におけるストレージシステム１は、データを分割及び冗長化し、分散して複数の記憶装置に記憶すると共に、記憶するデータの内容に応じて設定される固有のコンテンツアドレスによって、当該データを格納した格納位置を特定するコンテンツアドレスストレージシステムである。このコンテンツアドレスストレージシステムについては、後に詳述する。
【００２０】
なお、以下では、ストレージシステム１が１つのシステムであるとして、当該ストレージシステム１が備えている構成及び機能を説明する。つまり、以下に説明するストレージシステム１が有する構成及び機能は、アクセラレータノード２あるいはストレージノード３のいずれに備えられていてもよい。なお、ストレージシステム１は、図２に示すように、必ずしもアクセラレータノード２とストレージノード３とを備えていることに限定されず、いかなる構成であってもよく、例えば、１台のコンピュータにて構成されていてもよい。さらには、ストレージシステム１は、コンテンツアドレスストレージシステムであることにも限定されず、重複排除機能を有しているストレージシステムであればよい。
【００２１】
図３に、本実施形態におけるストレージシステム１の構成を示す。この図に示すように、ストレージシステム１は、サーバコンピュータにて構成され、所定の演算処理を行う演算装置（図示せず）と、記憶装置２０と、を備える。そして、ストレージシステム１は、上記演算装置にプログラムが組み込まれることで構築された、データ分割部１１と、ブロック検出部１２と、データ書き込み部１３と、データ読み出し部１４と、を備えている。
【００２２】
なお、実際には、上述したストレージシステム１が備える構成は、図２に示したアクセラレータノード２及びストレージノード３がそれぞれ備えているＣＰＵ（Central Processing Unit）などの演算装置やハードディスクドライブなどの記憶装置にて構成されている。
【００２３】
ここで、上述したように、本実施形態におけるストレージシステム１は、コンテンツアドレスストレージシステムである。このため、ストレージシステム１は、コンテンツアドレスを利用してデータを記憶装置２０に格納する機能を有しており、以下に説明するように、データを分割及び分散し、かつ、コンテンツアドレスにて格納位置を特定して、データを格納する。以下、ストレージシステム１にてコンテンツアドレスを利用したデータ書き込み処理について、図４、図５、図８を参照して説明する。
【００２４】
まず、図４及び図５の矢印Ｙ１に示すように、ストレージシステム１が書き込み要求されたファイルＡの入力を受ける。すると、データ分割部１１が、図４及び図５の矢印Ｙ２に示すように、ファイルＡを所定容量（例えば、６４ＫＢ）のブロックデータＤに分割する（図８のステップＳ１）。
【００２５】
続いて、ブロック検出部１１は、分割されたブロックデータＤのデータ内容に基づいて、当該データ内容を代表する固有のハッシュ値Ｈを算出する（図５の矢印Ｙ３）。例えば、ハッシュ値Ｈは、予め設定されたハッシュ関数を用いて、ブロックデータＤのデータ内容から算出する。
【００２６】
続いて、ブロック検出部１１は、ファイルＡのブロックデータＤのハッシュ値Ｈを用いて、当該ブロックデータＤが既に格納されているか否かを調べる（図８のステップＳ２）。具体的には、まず、既に格納されているブロックデータＤは、そのハッシュ値Ｈと格納位置を表すコンテンツアドレスＣＡとが、関連付けられてＭＦＩ（Ｍａｉｎ  Ｆｒａｇｍｅｎｔ  Ｉｎｄｅｘ）ファイルに登録されている。従って、格納前に算出したブロックデータＤのハッシュ値ＨがＭＦＩファイル内に存在している場合には、既に同一内容のブロックデータＤが格納されていると判断できる（図５の矢印Ｙ４、図８のステップＳ３でＹｅｓ）。この場合には、格納前のブロックデータＤのハッシュ値Ｈと一致したＭＦＩ内のハッシュ値Ｈに関連付けられているコンテンツアドレスＣＡを、当該ＭＦＩファイルから取得する。そして、このコンテンツアドレスＣＡを、書き込み要求されたブロックデータＤのコンテンツアドレスＣＡとして返却する。
【００２７】
そして、データ書き込み部１３は、返却されたコンテンツアドレスＣＡが参照する既に格納されているデータを、書き込み要求されたブロックデータＤとして使用する（図８のステップＳ８）。つまり、書き込み要求されたブロックデータＤの格納先として、返却されたコンテンツアドレスＣＡが参照する領域を指定することで、当該書き込み要求されたブロックデータＤを記憶したこととする。これにより、書き込み要求にかかるブロックデータＤを、実際に記憶装置２０内に記憶する必要がなくなる。
【００２８】
また、上記ブロック検出部１１にて、書き込み要求にかかるブロックデータＤがまだ記憶されていないと判断された場合には（図８のステップＳ３でＮｏ）、以下のようにして、データ書き込み部１３にて書き込み要求にかかるブロックデータＤの書き込みを行う（図８のステップＳ７）。まず、書き込み要求にかかるブロックデータＤを圧縮して、図５の矢印Ｙ５に示すように、複数の所定の容量のフラグメントデータに分割する。例えば、図４の符号Ｄ１〜Ｄ９に示すように、９つのフラグメントデータ（分割データ４１）に分割する。そしてさらに、分割したフラグメントデータのうちいくつかが欠けた場合であっても、元となるブロックデータを復元可能なよう冗長データを生成し、上記分割したフラグメントデータ４１に追加する。例えば、図４の符号Ｄ１０〜Ｄ１２に示すように、３つのフラグメントデータ（冗長データ４２）を追加する。これにより、９つの分割データ４１と、３つの冗長データとにより構成される１２個のフラグメントデータからなるデータセット４０を生成する。
【００２９】
続いて、上述したように生成されたデータセットを構成する各フラグメントデータを、記憶装置に形成された各記憶領域に、それぞれ分散して格納する。例えば、図４に示すように、１２個のフラグメントデータＤ１〜Ｄ１２を生成した場合には、複数の記憶装置内にそれぞれ形成したデータ格納ファイルに、各フラグメントデータＤ１〜Ｄ１２を１つずつそれぞれ格納する（図５の矢印Ｙ６参照）。
【００３０】
続いて、ストレージシステム１は、上述したように格納したフラグメントデータＤ１〜Ｄ１２の格納位置、つまり、当該フラグメントデータＤ１〜Ｄ１２にて復元されるブロックデータＤの格納位置を表すコンテンツアドレスＣＡを生成して管理する。具体的には、格納したブロックデータＤの内容に基づいて算出したハッシュ値Ｈの一部（ショートハッシュ）（例えば、ハッシュ値Ｈの先頭８Ｂ（バイト））と、論理格納位置を表す情報と、を組み合わせて、コンテンツアドレスＣＡを生成する。そして、このコンテンツアドレスＣＡを、ストレージシステム１内のファイルシステムに返却する（図５の矢印Ｙ７）。すると、ストレージシステム１は、バックアップ対象データのファイル名などの識別情報と、コンテンツアドレスＣＡとを関連付けてファイルシステムで管理する。
【００３１】
また、ブロックデータＤのコンテンツアドレスＣＡと、当該ブロックデータＤのハッシュ値Ｈと、を関連付けて、各ストレージノード３がＭＦＩファイルにて管理する。このように、上記コンテンツアドレスＣＡは、ファイルを特定する情報やハッシュ値Ｈなどと関連付けられて、アクセラレータノード２やストレージノード３の記憶装置に格納される。
【００３２】
さらに、ストレージシステム１は、上述したように格納したファイルを読み出す制御を、データ読み出し部１４により行う。例えば、ストレージシステム１に対して、特定のファイルを指定して読み出し要求があると、まず、ファイルシステムに基づいて、読み出し要求にかかるファイルに対応するハッシュ値の一部であるショートハッシュと論理位置の情報からなるコンテンツアドレスＣＡを指定する。そして、コンテンツアドレスＣＡがＭＦＩファイルに登録されているか否かを調べる。登録されていなければ、要求されたデータは格納されていないため、エラーを返却する。
【００３３】
一方、読み出し要求にかかるコンテンツアドレスＣＡが登録されている場合には、上記コンテンツアドレスＣＡにて指定される格納位置を特定し、この特定された格納位置に格納されている各フラグメントデータを、読み出し要求されたデータとして読み出す。このとき、各フラグメントが格納されているデータ格納ファイルと、当該データ格納ファイルのうち１つのフラグメントデータの格納位置が分かれば、同一の格納位置から他のフラグメントデータの格納位置を特定することができる。
【００３４】
そして、読み出し要求に応じて読み出した各フラグメントデータからブロックデータＤを復元する。さらに、復元したブロックデータＤを複数連結し、ファイルＡなどの一群のデータに復元して返却する。
【００３５】
ここで、上記のようにストレージシステム１にて書き込み要求にかかるデータを書き込むと、上述したように、当該データを分割した複数のブロックデータが記憶装置内に拡散して格納されることがある。すると、読み出し性能が低下するおそれがあるが、かかる問題を解決するために、本実施形態におけるストレージシステム１は、以下の機能も備える。以下、図６乃至図８を参照して詳述する。
【００３６】
まず、ブロック検出部１２は、上述したように、書き込み要求にかかるデータＡを分割したブロックデータと同じ内容のブロックデータが、記憶装置２０に既に格納されているか否かを調べる（図８のステップＳ１，ステップＳ２）。例えば、図６に示す例では、まず、書き込み要求にかかるデータＡを分割したブロックデータ１を、今、記憶処理する対象となる対象ブロックとし、これと同じ内容のブロックデータが、記憶装置２０内に記憶されたデータＢに存在するか否かを調べる。
【００３７】
そして、図６の斜線に示すように、記憶装置２０内にも対象ブロックと同じ内容のブロックデータ１が存在している場合には（図８のステップＳ３でＹｅｓ）、ブロック検出部１２は、書き込み要求にかかるデータＡ内の対象ブロック（ブロックデータ１）から連続する複数のブロックデータも取得する。図６に示す例では、書き込み要求にかかるデータＡ中の所定範囲を構成するブロックデータ１〜８からなる連続ブロックデータＡ１を取得する。これと共に、ブロック検出部１２は、記憶装置２０内に記憶されたデータＢのうち、上記対象ブロックと同一内容のブロックデータ１から連続する領域に格納された複数のブロックデータ、つまり、図６に示す例では、データＢ中の所定範囲を構成するブロック１、Ｃ，Ｂ，７，Ｇからなる連続ブロックデータＢ１を取得する。なお、書き込み要求にかかるデータＡから取得する連続ブロックデータＡ１は、例えば、５ＭＢ容量に相当する数のブロックデータであり、記憶装置２０内のデータＢから取得する連続ブロックデータＢ１は、例えば、２ＭＢ容量に相当する数のブロックデータである。このように、各連続ブロックデータＡ１，Ｂ１は、相互に容量が異なっていてもよく、あるいは、同一であってもよい。
【００３８】
さらに、ブロック検出部１２は、上述したように書き込み要求にかかるデータＡから取得した連続ブロックデータＡ１に含まれる各ブロックデータと、記憶装置２０内から取得した連続ブロックデータＢ１に含まれる各ブロックデータと、の共通部分の割合を表す共通割合を検出する（図８のステップＳ４）。例えば、上述したように各ブロックデータのハッシュ値を用いて、一致するブロックデータの数を検出する。図６の例では、各連続ブロックデータＡ１，Ｂ１において、２つのブロックデータ１，７が共通しており、その割合を共通割合として検出する。
【００３９】
その後、データ書き込み部１３は、上述したようにブロック検出部１２にて検出した共通割合の値に応じて、以下のようにブロックデータの書き込みを行う。まず、共通割合が予め設定された値より大きい場合（例えば、５０％より大きい場合）には（図８のステップＳ５でＮｏ）、書き込み要求にかかるデータＡの対象ブロック（ブロックデータ１）について通常の書き込み処理を行う。つまり、書き込み要求にかかるデータＡの対象ブロックは、同一内容のブロックデータが既に記憶装置２０に格納されているため、この記憶装置２０に既に格納されているブロックデータを参照する処理を行い、重複記憶を行わない（図８のステップＳ８）。
【００４０】
このように、各連続ブロックデータの共通割合が大きい場合には、書き込み要求にかかるデータＡの対象ブロックに続く他のブロックデータも、記憶装置２０内の対象ブロックと同一内容のブロックデータから後ろの所定範囲の領域に記憶されていると言えるため、上述したように対象ブロックについて通常の格納処理を行う。そして、その後は、書き込み要求にかかるデータＡの次のブロックデータ２を対象ブロックとして、上述同様の処理を行う。これにより、書き込み要求にかかるデータＡを後に読み出す際には、既に記憶されているデータＢの連続するブロックデータを読み出すことで、効率よくデータＡを読み出すことができる。また、ブロックデータの重複記憶排除も行われているため、記憶容量の削減を図ることができる。
【００４１】
一方で、共通割合が予め設定された値以下である場合（例えば、１０％以下の場合）には（図８のステップＳ５でＹｅｓ）、書き込み要求にかかるデータＡの対象ブロック（ブロックデータ１）を、新たに記憶装置２０に書き込む（図８のステップＳ６）。つまり、図６の例の場合には、一致する共通ブロックが２つのみであり、共通割合が予め設定された値以下となるため、ブロックデータ１が記憶装置２０に既に記憶されているものの、当該ブロックデータ１を再書き込みブロックデータとして、記憶装置２０に書き込む（図７参照）。このとき、再書き込みされるブロックデータ１は、記憶装置２０内においてデータが既に書き込まれている領域の最後に書き込まれる。その後は、書き込み要求にかかるデータＡの次のブロックデータ２に対して、上述同様に、図８のステップＳ１からＳ８までの処理が行われる。例えば、ブロックデータ２が記憶装置２０内にまだ記憶されていない場合には、当該記憶装置２０内において、上述したように再書き込みされたブロックデータ１の次の領域に書き込まれることとなる。
【００４２】
このように、各連続ブロックデータの共通割合が小さい場合には、書き込み要求にかかるデータＡの対象ブロック及びこれに続く各ブロックデータが、記憶装置２０内に分散して記憶されていると言えるため、書き込み要求にかかるデータＡの対象ブロックを新たに書き込む。これにより、後にデータＡを後に読み出す際には、記憶装置２０内の連続する領域に書き込まれたブロックデータを読み出すことで、データＡを構成する複数のブロックデータをまとめて読み出せる可能性が高くなり、読み出し性能の向上を図ることができる。
【００４３】
ここで、上述したブロック検出部１２にて書き込み要求にかかる連続ブロックデータと既に記憶されている連続ブロックデータとの共通割合を検出する際には、各連続ブロックデータ内における各ブロックデータの並び順は関係ない。つまり、両方の連続ブロックデータ内のいずれかの位置に、同一内容のブロックデータが存在していれば、そのブロックデータは共通していると検出される。そして、ブロックデータが共通している数によって、共通割合を検出する。なお、共通割合の値は、ブロックデータが共通している数の値でもよく、連続ブロックデータ内でブロックデータが共通する割合でもよい。このように、各連続ブロックデータ内における各ブロックデータの並び順を考慮せず共通割合を検出する理由は、上述したように読み出しの際に、記憶装置２０内の連続する領域に書き込まれた連続ブロックデータを読み出すことで、近傍にある関連するブロックを一度に読み出しすることができるためである。
【００４４】
また、データ書き込み部１３は、上述したように、いかなる場合も新たにブロックデータを書き込むわけではなく、以下の条件を満たす場合にのみ新たにブロックデータを書き込む。例えば、データ書き込み部１３は、書き込み要求にかかるデータＡ（一例として、現在の書き込み要求にかかる一連のストリームデータ）のうち既に記憶装置２０に書き込んだデータの容量に対する、重複して新たに記憶装置２０に書き込んだブロックデータの容量の割合を算出し、その割合が所定の割合（例えば、５％）以下である場合に、ブロックデータの書き込みを行う。これにより、記憶装置２０に対して重複記憶されるブロックデータの容量を抑制することができる。また、記憶装置２０への再書き込みの容量を抑制することで、再書き込みによる書き込み速度の低下を抑制することができる。なお、ブロックデータを再度書き込む条件は任意であり、例えば、書き込んだブロックデータの容量が、記憶装置２０の容量に応じて予め設定された容量以下である、ことを条件としてもよい。
【００４５】
以上のように、本実施形態におけるストレージシステムによると、重複記憶排除を行いつつ、記憶装置内の記憶領域全体に対するブロックデータの拡散を抑制することができる。このため、後にデータを読み出す際には、多くの数のディスクを走査することを抑制することができ、読み出し性能の低下を抑制することができる。一方で、読み出し性能の低下を抑制するために、ブロックデータの重複記憶を許容しているが、その容量を抑制することで、記憶容量の増加も抑制することができる。
【００４６】
＜実施形態２＞
本発明の第２の実施形態を、以下の論文形式にて説明する。
【００４７】
＜第１章  序論＞
重複排除は、約１０年の間、ストレージ装置においては話題となっている。ある文献では、バックアップを実行するために必要な時間と、バックアップデータを保持するために必要な記憶領域と、の両方を削減する方法の効果が記載され検証されている。今日では、重複排除機能を有するストレージシステムは、バックアップ性能の新しい記録を発表し、市場には多くのベンダーによって提案された様々な重複排除技術があふれている。そして、実際には、重複排除はバックアップシステムの特性として必須のものとなっている。
【００４８】
元来、重複排除システムの性能は、データの重複排除率、最大書き込み能力、リストア処理能力によって表される。各作業環境においてユーザによって達成される実際の性能は、様々な理由からよく異なる。特に、通常、読み出し処理性能は、空のシステムに記憶される最初のバックアップに対しては非常によいが、その後のバックアップに対しては低下する。このことの主な原因は、結果として過去の複数のバックアップに分散された最近のバックアップに論理的に属するデータとなるインライン重複排除により導入されたデータの断片化である。実際に、ますます多くのデータが過去のバックアップに配置されるため、データの断片化の影響は、バックアップ毎に増大する。我々による性能実験では、データの特徴やバックアップパターンといったデータセットに応じて、最大で５０％以上も少ない読み出し性能の減少を示している。我々のデータセットは多くて１５の後述するバックアップをカバーしているので、より多くのバックアップが実行される時に、これ以上のパーセンテージを期待している。
【００４９】
後に行われるバックアップにおける断片化の増加は、post-process (off-line)
forward-pointing 重複排除と呼ばれる技術で完全に回避させることができる。最新バックアップが重複排除なしで保存され、その後に、バックグランド処理にて、ブロックの最新コピーが保存されるという方法の処理が実行される。この方法では、最新バックアップがいつも断片化されず、バックアック世代に伴い断片化が増加する。通常、我々は最新バックアップをリストアするので、このような方法は優れているように見える。しかし、かかる方法は、たくさんの問題があり、最も深刻なことは、重複排除前のデータが必要とする領域による記憶容量が増加することと、重複データの新しいコピーの書き込みは、データインラインのように通常重複排除するよりもずっと遅いため、書き込み性能が大幅に減少することである。そして、新しいデータを書き込むことはネットワークを介したデータ転送とディスクへの格納を必要とするため、上述した後者の問題が起こる。ハッシュ値に基づいた重複排除は、ブロックハッシュをシステムに格納されたブロックハッシュと比較することだけを必要とする。
【００５０】
The holy grailは、ここでは、書き込み性能が低下せず、また、重複排除の効果に影響を及ぼすことなく、リストア性能の低下を避けることである。言い換えると、重複排除技術は、断片化によって引き起こされるいかなる性能の低下なしに、インライン方式の高い書込み量と高いリストア性能を達成すべきである。
【００５１】
本論文では、以下のことを説明する。次の章では、本発明の動機付けを説明すると共に、本発明に至るまでの問題の重要性を示すいくつかの例を説明する。第３章では、断片化の問題の本質に迫り、解決に必要なものを確認する。第４章では、我々の解決手法が適用できるバックアップシステムについての条件の詳細を示す。第５章では、context-based
rewriting（いわゆるCBR）と呼ばれる解決手法を示し、その後にその議論及び将来的な拡張について示す。第６章では、性能試験の前提と方法を示す。性能結果の検討を含む我々のアルゴリズムの改良は、第７章で示す。第８章では、断片化の問題に対する他の解決策と共に、関連する研究を説明する。最後に、第９章では、結論と今後の研究に対する方向性を示す。
【００５２】
＜第２章  動機づけ＞
（２．１  問題の序論）
問題を説明するために、１つのファイルシステムのフルバックアップが毎週行われることを想定する。加えて、例えば、ブロックの最も古いコピーが保持されるといった、backward-pointing重複排除機能を有するバックアップシステムを想定する。これは、新しいコピーが書き込まれないようなインライン重複排除と同様のケースである。
【００５３】
通常、ファイルシステムは、２つのバックアップ間では大きな変更はなされず、その後の第２バックアップの多くの重複が検出され、重複して記憶されない。最終的には、第１バックアップが連続する記憶領域に格納され、第２バックアップの新しいブロックが全て、現在格納されている領域の最後に記憶される（図９参照）。（図９：重複排除によるバックアップ断片化のプロセス）
【００５４】
後述するバックアップ中では、以下のようなシナリオが継続する。いくつかのバックアップの後には、最新バックアップのブロックは、全ての記憶領域中に拡散している。すると、最新バックアップを読み出すために必要とされる走査ディスクの数が膨大な数になり、その結果、図９の最新バックアップにおけるリストアプロセスに示すように、非常に低い読み出し性能となってしまう。
【００５５】
データが拡散されるプロセスは断片化と呼ばれ、重要なリストア時には非常に有害となりうる。ここで重大なことは、上述したシナリオは典型的であり、ユーザデータが消失したときにリストアのために必要とされることがもっともあり得る最新に書き込まれたバックアップが、最も高い断片化に至ってしまうことである。
【００５６】
（２．２  問題の重大さ）
断片化の問題は明らかではあるが、その重大性から今後の研究が必要である。このため、我々は、インライン重複排除ストレージシステムに対して４つのバックアップデータセットを書き込むことをシミュレーションする。次に、我々は、固定サイズ先読みを用いて各バックアップのリストアをシミュレーションした。実験中、最大限可能な重複排除率を確保するために、全ての重複ブロック（８ＫＢのサイズに要求され、「ロビンフラグメントチャンキングアルゴリズム」で生成された）は排除された。各バックアップ後、リストア性能を、システムで１つのバックアップだけが存在しているときに達成される最大性能に対するパーセンテージとして計測した。
【００５７】
分析を簡単にするために、本研究において、読み出し性能は、リストア中に実行されるデータ入出力処理の数に反比例していると仮定する。もちろん性能が他の障害に影響をうけるシステムがあるが、性能と固定サイズの入出力の数とを関連付けることで、ネットワークやＣＰＵ速度のような二次的な要素を無視して、断片化問題の核心に集中することができる。
【００５８】
図１０は、バックアップストリームの世代間の断片化無しの各バックアップにおいて得られた「１００」を基準とした最大性能に対して、様々なバックアップセットに対するリストア性能を示す。ここで、「４５」という数字は、特定のバックアップセット及びバックアップ回数において最大リストア性能の約４５％だけが得られた、ということを意味している。つまり、そのようなバックアップのリストアでは、バックアップストリームを横断する断片化のため、２回以上遅くなる。
【００５９】
図１０を見ると、いくつかの興味深いデータとなっている。第一に、時間が経つにつれて、断片化が拡大し、増加している傾向にある（いくつか珍しい例外があるが）。第二に、達成できる読み出し性能が、７回の課題格納バックアップ後に最大性能の４５％から、８回のwikiバックアップ後に最大性能の約８８％へと変化しているように、各データセットにおける要素の異なる影響がある。（図１０：各バックアップにおける最大可能性能に対する割合での読み出し性能（リストアに必要なＩ／Ｏ数に反比例））
【００６０】
結果としてそのような変化がもたらす最も重要な要素は、以下の通りである。
−ストリームにおける重複の数：一般的に、重複の少ない断片は、結果として小さい断片化になる。しかし、このルールに例外も起こり得る。
−重複した新しいデータパターンの特徴：新しいデータが連続して配置されるか、あるいは、重複間で短く連続するか。また、オリジナルな書き込みのとき、最新バックアップで長く連続して重複が現れるか、あるいは、ランダムであるか。
−既にバックアップしたストリームのバージョン数：多くのバックアップが、重複排除に反するストリームを意味しており、その結果、より高い断片化の可能性がある。
−ストリームのサイズ：大きなストリームは、通常めったに変更されないいくつかルートデータを有しており、そのようなデータは、全体としてストリームの断片化が減少するため、小さなストリームで高い断片化を引き起こすことはより容易である。
【００６１】
本論文では、バックアップ断片化におけるこれらの要素のそれぞれによる影響の個々の解析を行わない。我々の決定は、一方では、本論文に利用可能な限られた範囲によって動機づけられているが、他方では、これら要因の多くは、通常、変わることがないユーザデータに固有の特徴とバックアップ記憶方法とに関連している。しかしながら、これら要素の検討は、特別なユーザにとっての断片化問題の重大さを予測するためにおいて確かな理由となる。
【００６２】
＜第３章  重複排除バックアップＶＳ断片化＞
断片化は、重複排除の副産物（もっと正確にいえば、無駄）である。バックアップ間で干渉なく個別の連続したディスク領域に各バックアップを保持することによって、完全に断片化を排除することは可能である。しかし、このような場合には、重複排除はない。
【００６３】
リストア性能における断片化の影響を実質的に排除する別の方法としては、重複排除に期待される大きなブロックサイズを用いることである。このような場合、各ブロックに対するディスクシークを必要とするとはいえ、シークタイムは、読み出しブロックデータに必要とされる時間によって決定されるため、断片化が起きてもリストア速度はあまり低下しない。
【００６４】
例えば、４ＭＢの要求されたブロックサイズで、４０ＭＢ／ｓの読み出しディスク性能及び５ｍｓシークタイムでは、各ブロック読み出しにおけるシーク動作では、約５％リストア時間が増加する。しかしながら、重複排除にとって最適なブロックサイズは、特別なデータパターンやストレージシステムの特徴に応じて、４ＫＢと１６ＫＢの間で変化する。（ここで留意すべきは、重複排除の有効性を計算することにおいてブロックメタデータを含むことを必要とする。）より大きなブロックでは、重複排除はより有効ではなくなる。従って、そのような大きなブロックを使用することは現実的ではない。
【００６５】
（３．１  断片化の影響を減少させるアイデア）
重複排除のため、全てのバックアップにおいて断片化を完全に排除できないが、書き込み性能や重複排除の有効性のような他の性能の測定基準がさらに悪くなることなしに、大部分のケースにおいて断片化によって生じるリストア速度の低下を排除しようとすることはできる。その方法は、故障後のデータリストアの通常のケースでは、最新（あるいは、最新に近い）のデータバックアップから実行されるという観測に基づいている。これは、ユーザは通常、最も最近のデータにリストアされることを希望するためである。
【００６６】
上記観測に基づいて、より古いものを犠牲にすることなく最新バックアップに対する断片化を排除しようとしている。その方法の一例を図１１に示す。この図は、世代と共に断片化が減少している７つのバックアップストリーム（「オリジナル」の曲線）による基本的な断片化と、オフラインで断片化をしないで再び行われた同じバックアップ（「断片化なし」）、つまり、バックアップ世代と共に断片化が増加し、結果として連続的にディスクに書き込まれた最新バックアップと、を表している。我々は、まだ漠然としたオンライン非断片化プロセスで同様の効果を得たい。（図１１は、オフライン重複排除［各バックアップ（７つの開発計画バックアップの実例）を書き込む］後における各バックアップ断片化を示す。）
【００６７】
（３．２  課題解決に必要なもの）
断片化の問題は、重複排除システムの他の重要な測定基準において負の効果のない解決策を必要とする。想定している解決方法は以下の通りである。
−最新バックアップに対するリストア性能の低下を解消する（１つのバックアップだけがシステム全体に格納されている場合に達成される性能と比較して）。
−進行中のバックアップに対する非常に小さい性能低下をとりいれる（解決策なしの場合と比較）。
−重複の効果を低下せず、一般的に小さな追加領域を使用する
−ディスク性能、スピンドルや演算処理の性能のように、多くの追加リソースを必要としない。
−アドレス指定による選択領域の指定を処理しやすいこと。
【００６８】
＜第４章  インライン重複排除機能を有するバックアップシステム＞
次のセクションで示す本発明の重複排除方法を実現するために、バックアップストレージが以下の特徴を備えていることとする。
【００６９】
−コンテンツアドレス機能：
これは、以下に示す特徴に有益な基本となる特徴である。
−ブロックハッシュの存在をチェックすることに基づく重複排除クエリ機能：
ハッシュやメタデータはブロック全体よりもずっと小さく、ストリーミングアクセスにおいて簡単に先読み（プリフェッチ）できるので、そのようなクエリが、ハッシュを用いて作動し、メタデータだけを読み出すことは、極めて重要である。より重要なことは、ブロックを全て読み出すことによって重複排除することは、結果として断片化されたストリームを読み出すことになり、総合して非常に低い書き込み性能となることである。ここで我々は、高い断片化では、ブロックメタデータでさえ十分早く読み出すスピンドルを有していないことに注意すべきである。しかしながら、フラッシュメモリに基づいてこの問題を解決する方法が存在する。但し、ＳＳＤは、すべてのバックアップデータを保持するためにはあまりに小さく、高価である。
【００７０】
−ディスク隣接ブロックの高速決定機能：
与えられた２つのブロックがそれぞれ近接する異なるディスクに存在するかどうかを、迅速に決定することができる。これは、多くの方法で実現できるが、簡単にするために、システム内におけるブロックの存在を確認する各重複排除クエリが、ディスク上のブロックの位置を返却することとする。２つのブロックが近接するディスクに存在することを確かめる別の方法は、ディスク上のブロックの１つに近いブロックのハッシュを取得し、第２ブロックのハッシュが、取得したハッシュの１つであるかをチェックすることである。これらの方法を結合することも可能である。
−システムに既に存在するブロックを書き込む機能：
これは、読み出し性能を向上させるために再びブロックを格納させる決定がなされるときに必要とされる。既に格納されている全てのバックアップが、古いコピーの代わりに新しいコピーを使用することができる方法においては、上述した再書き込みは、効果的にこれまでのコピーを無効にする。
【００７１】
上記特徴は非常に単純であるため、次のセクションで示すアルゴリズムは、インライン重複排除機能を有するほとんどのシステムに適用可能なよう、非常に一般的で簡単に見える。
【００７２】
＜第５章  ＣＢＲ：リライトに基づくコンテキスト＞
（５．１  ブロックコンテキスト）
本発明におけるアルゴリズムは、ディスクコンテキストとストリームコンテキストといった重複の２つのコンテキストを利用する。データブロックのブロックストリームコンテキストは、このブロックのすぐ後にこのストリームで書き込まれるブロックセットとして定義される。また、データブロックのディスクコンテキストを、ディスク上でそのすぐ後に続くブロックとして定義する（図１２参照）。これら２つのコンテキストの共通部分が多いときには、この共通部分において先読みすることによりブロックの読み出しが非常に高速である。実際、これは、特に初期バックアップに対して、かなり頻繁に起こり得る。（図１２：ブロックのディスクコンテキストとストリームコンテキスト）
【００７３】
ディスクコンテキストがストリームコンテキストの少しだけのデータを含むとき、読み出し性能が低下するという問題が生じる。これは、同じブロックが論理的に複数のストリームの位置（各位置において異なる近隣ブロックを有する）に存在するとき、重複排除のために起こり得る。そのようなシナリオは、以下の状況で起こる。
−異なる論理的バックアップにおいて、重複が存在する場合（グローバル重複）
−同じストリームにおいて、重複が存在する場合（インターナル重複）
−同じストリームの過去のバージョンの一つに対して重複が存在する場合、例えば、１週間前にバックアップされた同じファイルシステム（インターバージョン重複）
【００７４】
同じデータのバックアップが繰り返されることから、一般的に最も多いのは、最後のケースである。さらに、各バックアップで一般的に増加するインターバージョン重複によって断片化が生じる。その結果、以下では、このケースに焦点を当てる。インターナル重複の効果は、セクション６．４で説明するようにときどき重要であるが、通常はバックアップの回数の増加に伴って悪化しない。本論文では、全ての実験においてインターナル重複によって生じる断片化の影響を検討しているが（つまり、本研究で示す各Ｉ／Ｏ計測はこの影響を含むが）、この問題の解決には焦点は当てない。
【００７５】
（５．２  アルゴリズムの概要）
解決方法の基本的な考え方は、非常に断片化された重複を再書き込みすることである。つまり、ブロックのオリジナルコピーがいくつかの古いバックアップに書き込まれているとき、最新バックアップのストリームコンテキストに対応するブロックは、既存のディスクコンテキストとははっきりと異なる。そのようなブロックを再書き込みすることによって、両コンテキストを類似させようとする。再書き込み後、ブロックの新しいコピーは読み出し処理に用いられ、古いコピーは最終的にはバックグランドで回収される。
【００７６】
各再書き込みは、バックアップ速度の低下と、ブロックの古いコピーが回収されるまで追加領域の消費をもたらすため、少量のブロックだけを再書き込みする。書き込み限度と呼ばれるパラメータは、初期設定では、全てのブロックの５％にセットされる。この値は、セクション６．２．３に詳細を示すように、アルゴリズムがバックアップの書き込み速度をどのくらい低下させるか、ということに影響を与える。
【００７７】
まだ再書き込み判定をしていない現在のポイントの後、アルゴリズムのメインループは、次の重複ブロックを見つける。そのようなブロックを判定ブロックと呼ぶ。アルゴリズムは、現在のディスクコンテキストとストリームコンテキストとを比較することによって、それを再書き込みするかどうかを判定する。これら２つのコンテキストの共通部分が小さい場合には、少しの有用なデータを読み出すための追加ディスクシークを避けるよう、判定ブロックを再書き込みさせる。
【００７８】
逆に、２つのコンテキストの共通部分が多い場合には、たくさんの有益なデータを読み出すために必要な時間によって追加シークタイムが費やされるので、再書き込みは望ましくない。そのようなケースでは、共通部分における全てのブロックを再書き込みしないよう判定する。つまり、それらを重複したままとする。従って、ディスクコンテキストの全体サイズに対する、ストリームコンテキストに属さないブロックのディスクコンテキストにおける当該ディスクコンテキストのサイズ、のような重複の再書き込み有効度を定義する。例えば、ディスクコンテキストにおけるブロックの７０％がストリームコンテキストにも表れる場合には、３０％の有効度を意味する。アルゴリズムは、再書き込み有効度が閾値よりも小さくないときにだけ、再書き込み有効性の現在の閾値を保持し、判定ブロックを再書き込みする。
【００７９】
上述したような判定を行った後、まだ再書き込み判定していないストリームの次の重複に対して、メインループの次の繰り返しにより全体プロセスが繰り返される。
【００８０】
重複を再書き込みリライトするかどうかの判定がオンライン（今後の知識なしに）で行われるので、例えば、再書き込みすると判定することによって、その再書き込みの「信用」が後のストリームにおける別の重複のためにさらに保存されうるが（全てのブロックの５％以下で再書き込みされる）、与えられた重複にとって常に予備的に選択を行うことができる。あるいは、重複を再書き込みしないことの判定によって後のストリームにおいてよい候補が現れるかもしれない。しかし、実際には、そのような候補は将来において姿を表わさない。
【００８１】
従って、アルゴリズムの課題は、よい再書き込み判定を行うことである。このため、２つの再書き込み閾値、最小再書き込み有効度閾値と、現在有効度閾値を保持する。
【００８２】
（５．２．１  最小限の再書き込み有効度）
「最小有効度」は、アルゴリズムのパラメータであり、現在の再書き込みの有効度の閾値がそれ以下に決して低下しないことを保障している。このとき、リストア性能がほんのわずか改善される再書き込み判定を回避する。最小有効度は、多く再書き込みされないケースでは、あまり高い値ではなく、再書き込みがあまりに多く生じるケースでは、低すぎないような値である。従って、その閾値は、２０％の値を検討する。
【００８３】
しかしながら、結果として、わずかな改良のみを提供する大事な再書き込みの影響を消滅させる多くの再書き込みがあるとき、そのような値はあまりにも低すぎるとわかった。例えば、正確にブロックの５％が重複し、全てが再書き込み有効度２０％を有するバックアップを仮定する。このような場合、全ての重複ブロックを再書き込みすることは、約１％だけリストア性能を改善する。そのような重複が全て再書き込み有効度５０％を有する場合には、約５％増加するが、正当な再書き込みにはまだ十分ではない。結果として、最低限の有効度を７０に選択する。５％が重複するバックアップにおいては、かかる重複を全て再書き込みすることは、約１２％リストア性能を改善し、これは再書き込みを正当化する十分な理由である。
【００８４】
全ての重複が、最小有効度以下の再書き込み有効度を有しているが、断片化からはっきりと受けたバックアップがあることに注目する。しかしながら、そのようなバックアップに対する断片化によって引き起こされるリストア性能低下を減少させるため、５％以上のブロックを再書き込みすることを必要としている。
【００８５】
（５．２．２  現在の再書き込み有効度）
上述したように、現在の再書き込み有効度は、各判定ブロックが、再書き込みされるかどうかを決定するために用いられる。この値は、それぞれ処理されたブロックで調整される。これに対して、私たちは、バックアップストリームでここまで見られたすべてのブロックの再書き込みの最適値である５％として定義されたブロックの「最適５％セット」を導入する。各再書き込みブロックが重複でなければならいことに着目すると、ある場合には、ストリーム内に十分な重複がないかもしれないので、全てのブロックの５％未満にこのセットを保ってもよい。
【００８６】
アルゴリズムによってとられる実際の動作をアカウントに取り入れることなしに最適５％を確立するために、これまでのところ１つであると見られる各重複を再書き込みすることの有効度を算出する。アルゴリズムの各ループにおいて、最適５％ブロックの最も悪いものを再書き込みすることの有効度に、現在の再書き込み有効度の閾値をセットする（最小有効度より低くはない）。この閾値が、バックアップの開始から現時点まで各判定ブロックのために現在の有効度閾値として用いられるなら、そのような選択は、大雑把を意味し、重複の最適５％を再書き込みする。
【００８７】
（５．３  アルゴリズム詳細）
以下に示すアルゴリズムは、それぞれ入力されるデータストリーム上で別々に実行される。それは次のフェーズから成る。
１．各重複に対してコンテキストに基づく再書き込み決定を含むメインループ。
２．再書き込みされたブロックの古いコピーを回収するバックグラウンドオペレーション。
【００８８】
（５．３．１  メインループ）
アルゴリズムのメインループは、以前のループのうちの１つの中で読み飛ばされてマークされていない入力ストリーム中の次に入ってくるブロックである判定ブロックに対して行われる。
【００８９】
１．ディスクコンテキストのセットアップ：
判定ブロックに対して、データの信頼できるハッシュ（例えば、SHA-1）に基づいて変更重複排除クエリを出す。重複が検出されると、変更クエリは、以前に確定されたディスク上のこのブロックの位置を返す。このクエリは、このアルゴリズムの以前のループのうちの１つでまだ出されていないときにだけ、出される。
２．非重複に対する書き込み完了：
判定ブロックが重複していない場合には、標準の書き込み処理が行われる。
【００９０】
３．再書き込み決定への到達：
一方で、ブロックが重複し、読み飛ばされてマークされていないならば、再書き込みが必要かどうか判定する必要がある。
（ａ）ストロームコンテキストのセットアップ：
ストリームコンテキスト（デフォルト値５ＭＢ）は、十分な書き込みリクエストがこのバッファを満たすまで、判定ブロックの書き込みの完了を遅延させることにより満たされる。ストリームバッファ内の各書き込みリクエストに対して（アルゴリズムの前のループのうちの１つによって既に満たされたそのような情報を有していない場合に）、新しい重複排除クエリを出すことによって、その重複状態を解決する。
（ｂ）コンテキスト共通部分の計算：
ストリームコンテキストに書き込まれている間、与えられたブロックが、判定ブロックのディスクコンテキストに既に表れて重複するかどうか、２つのブロック間のディスク上の距離の比較によりチェックする（重複排除クエリによって返された両ブロックに対するディスク位置情報を持っていることに着目する）。そのような方法で、そのディスクコンテキストおよびそのストリームコンテキストの共通部分が決定される。
【００９１】
（ｃ）再書き込み決定：
前のステップの結果、２つのコンテキストの共通部分中のすべてのブロックの合計サイズを取得する。これにより、上述したように、判定ブロックを再書き込みする有効度を決定する。この有効度が、現在の再書き込み有効度の閾値より小さくない場合、判定ブロックが再書き込みされる。しかし、このブロックだけ、５％再書き込み限度に従う（ここまで見られたすべてのストリームブロックに基づいて上記限界が計算されるので、より多くのブロックを処理する際に、多くのブロックが再書き込みにより変更される）。一方で、共通する全てのブロックが再書き込みされず、それらは今のストリームに重複するとして処理される。
【００９２】
判定ブロックだけを書き直すか、あるいは、共通部分にある全てのブロックを重複としてマークするか、決定が非対称であることに着目する。すなわち、判定ブロックが再書き込みされることになっても、再書き込みの必要がないほど十分大きなコンテキスト共通部分を有しているかもしれないため、共通部分における他のブロックを再書き込みすることを今決定したくない。しかしながら、一旦、重複するとして判定ブロックを保存することに決めたらならば、共通部分における残りのブロックも重複するものとして保存すべきであり、判定ブロックの読み取りが、これらの追加のブロックを読み出すことも保障される（つまり、判定ブロックの再書き込み有効度が低いまま）。
【００９３】
（ｄ）読み飛ばし判定ブロックのマーク
重複すると決定した共通部分における全てのブロックは、このアルゴリズムの後のループによって読み飛ばされるようマークされる。
【００９４】
４．再書き込み有効度閾値の調整
再書き込み決定にかかわらず、次のループの繰り返しの中で使用される再書き込み有効度閾値を更新する。最良５％の有効度の維持が非実用的であるので、有効度バケット（例えば、１００００）の定数を維持する。各バケットは、それぞれ再書き込み有効度のサブ範囲に等しく割り当てられ、全てのバケットは有効度範囲全体をカバーしている。そして、各バケットは、これまでにバケット範囲で有効度が減少して見られたブロックの数を維持する。そのような構造で、各バケットに割り当てられた有効度の範囲で、合理的な精度で最良５％ブロックの最悪の状態の再書き込み有効度に近づくことができる。
【００９５】
５．次の反復のセットアップ：
アルゴリズムは、スキップされない次のブロックに移り、再書き込み有効度閾値を調整し、メインループを再び繰り返す。上記アルゴリズムは、ストリーム内の全てのブロックに対して繰り返される。最初に、再書き込み有効度閾値は、最小有効度閾値に設定される。更新の際、現在の再書き込み有効度閾値は、この最小値以下にはならない。
ブロックの再書き込みが、ストリームとディスクのコンテキストの共通部分のサイズを増加させることを必ずしも保証するとは限らないことに着目する。例えば、ストリームコンテキストは重複を含んでいるかもしれず、残りが連続しているため、それらのまさに１つを再書き込みすると決定してもよい。そのような場合、共通する部分のサイズは増加しない。しかし、再書き込みされたブロックは、他の新しいブロックあるいは再書き込みされたブロックに近いディスクの最後に位置する。そのようなブロックが先読みされると、それらはたいがいリードキャッシュに存続し、リストアに必要なＩ／Ｏ回数は減少し、再書き込みはまだ有益である。
【００９６】
（５．３．２  バックグラウンドオペレーション）
上述されたアルゴリズムは、再書き込みされたブロックの古いコピーを削除するバックグラウンドプロセスを要求する。そのようなタスクは、ときどき実行される削除、データ除去、データ分類といった他のメンテナンスタスクと一緒に実行される。メンテナンスタスクが実行されるまで、再書き込みによって使用される追加領域は、重複排除率を一時的に減少させる。そのようなデータのパーセンテージが制限されて、メンテナンスタスクが、通常、かなり頻繁に実行されるため、そのような解決方法は許容される。
【００９７】
（５．３．３  読み取りオペレーションへの変更）
データブロックがコンテンツアドレスによる場合、古くコピーと新しいコピーは両方とも同じアドレスで指し示される。このため、データブロックへのポインタは、古いコピーを同じブロックの新しいコピーに置き換える際に変更する必要がない。最新のバックアップのよいリストア性能を保証するために、ブロックの最新コピーにアクセスする読み取り処理を変更する必要がある。
【００９８】
（５．４  議論）
以上のようなブロックのみを見ると、そのようなアルゴリズムは明らかにオンラインである。例えば、ストリームにおける各重複を再書き込みする有効度が同じであるとき、あるいは、ストリームにおける重複の増加位置と共に有効度が減少するとき、あるケースでは最適である。
【００９９】
最悪のケースは、ストリームを横切って分散された再書き込みの上記最小有効度ではないが、低い有効度を有する重複がストリームの初めに多くあるとき、ストリームの終わりに互いに接近している、高い有効度の多くの重複が後に続くことである。そのような場合、上記アルゴリズムは多くの低い有効度の重複を再書き込みし、高い有効度のものはわずかとなる（例えば、５％）。ところが、後には、高い有効度の重複だけを再書き込みするであろう。下記セクション５．５．７で説明するように、以前のバックアップからの統計に基づいた現在のバックアップの最小を調節すれば、このケースに対応することができる。
【０１００】
コストを削減し、利点を維持するように見えるＣＢＲアルゴリズムの単純な修正がある。まず、ブロックが再書き込みされることを確認し、バックアップが終了した後に、それらをオフラインで再書き込みする。しかしながら、再書き込みが断片化されたブロックを読む必要があるため、それは非常に遅くなり、うまくいかない（正確には、それらが最も断片化されているため）。ＣＢＲのオンラインバージョンでは、ユーザがデータを書き込むとき、私たちはただでこれらのブロックを得る。
【０１０１】
（５．５  アルゴリズムの拡張）
上記コンテキストベースの再書き込みアルゴリズムを改善し、独特な重複排除パターンにより強くするいくつかの拡張は可能である。全ての拡張はいくつかのシナリオにおいて非常に重要であるが、私たちはそれらを別々に分析せず、代わりに、限りある領域の利用のために、最も面白いものについて説明することとした。
【０１０２】
（５．５．１  書き込み時のアルゴリズムシミュレーションの読み取り）
各バックアップシステムは、全面的な設計およびデータ構造に最も適した異なる読み取りアルゴリズムを使用しうる。書込み中に読み取りアルゴリズムをシミュレートし、ブロックがシステムキャッシュに存在しているときに当該ブロックが再書き込みされないようにする小さなコンポーネントが実行される。
【０１０３】
（５．５．２  拡張されたストリームコンテキスト）
ストリームコンテキストは、ブロックの後に書かれているブロックばかりでなく、以前に書かれたブロックによっても定義される。特別なコンポーネントは、書かれているブロックをモニターし、最も最近書き込まれたものについて、いくつかのメタデータを保持している。そのような最適化は、コンテキスト解析をより正確にし、再書き込みされたブロックの数を低下させうる。
【０１０４】
（５．５．３  タイムスタンプに基づく再書き込み）
我々は、例えば、すべてのビット０のような一般的なブロックや、２つのファイルシステムが同時にバックアップされ、それらに両方のいくつかの共通のはさまれた部分（グローバルな重複排除）がある場合に、あまりに高頻度に、再書き込みされないよう注意すべきである。これについては、ブロック書き込みのタイムスタンプは使用することができる。ブロックが最も最近書かれたとき、それは、同じブロックを何度も再書き込みするおそれをなくす再書き込み用候補としては使用されない。
【０１０５】
（５．５．４  クライアントストリーム分類）
この最適化は、１台のディスクコンテナの中で同時に書き込まれている多数のストリームをインタリーブするシステムに役立つ。そのようなケースでは、同じストリームのブロックがディスク上にともに格納される場合、最良の結果を達成することができる。１つの解決法は、クライアント上の少数のブロックを蓄積し、次に、それらを一緒に書くことである。そのような解決のおかげで、より少数のリクエストは、ネットワークを通って伝送され、それらの全ては一緒に書かれるために適切なサイズを有している。結果として、増加した書き込み待ち時間のコスト面で、低いＩ／Ｏ数とよいリストア製法が保証される。
【０１０６】
（５．５．５  開放領域モニタリング）
再書き込みされたブロックは、ストレージシステムで追加領域を消費する。たとえ、占有領域が非常に小さく、短時間後に開放されたとしても、そのようなケースでは、システムが一杯に近いと、あまりにも早く領域の不足の報告を引き起こす。この問題を防ぐために、利用可能なキャパシティーをモニターし、ストレージ領域が少ないとき断片化解消の特徴を停止する必要がある。
【０１０７】
（５．５．６  先読みサイズの調節）
ディスクから読み取るとき、基本アルゴリズムは固定サイズを先読みすると仮定した。代わりに、リストアスピードを上げるために、調節可能サイズの先読みを使用することができる。調節は、最近の先読みの有効性に基づいて行われる。これは、断片化の影響を除くことはできないが、減少させるであろう。
【０１０８】
（５．５．７  以前のバックアップ統計による閾値の調節）
最小有効度は、高すぎるか低くすぎる値に設定される。以前のバックアップの統計を保持し、それを現在のバックアップのための最小有効度を設定するために使用することができる。このことは、常にそうではないが、明らかにストレージシステムによってバックアップ境界の知識を要求している。
【０１０９】
そのようなアプローチでは、（１）再書き込み信用が十分でないために再書き込みできなかった高い有効度のブロックの数、（２）それぞれ異なる有効度の範囲が割り当てられた各バケツにグループ分けされ発行された再書き込みの数、（３）再書き込み閾値が最小閾値以下であるため、再書き込みができなった重複の数（また、バケツによってグループ分けされた）、をカウントする。
【０１１０】
上記１番目の数が実質的に０を超えるものである場合、最小有効度は低く設定されすぎており、そのようなケースでは、閾値を増加させる必要がある。あるいは、再書き込みの信用を消耗しておらず、上記３番目の数が０でない場合には、閾値を低くする必要がある（しかし、再書き込みが意味をなさないような絶対最小値以下でない）。全ての再書き込みの信用を使用し、現在のバックアップが以前のものに似ていると仮定する最大有効度となる重複を再書き込みする、という方法で、増加あるいは減少のサイズは、割り当てたバケツのサイズとそれに付随する範囲によって決められる。このような調節が経験則のみに基づくことと、共通のケースではうまく機能するが、機能することが保証されないことに注意すべきである。
【０１１１】
＜第６章  実験方法論＞
（６．１  選択されたデータセットの詳細）
断片化の影響とアルゴリズムの有効性を評価するために、４セットのバックアップトレースを使用した。
−開発プロジェクトバックアップ−大規模なC++プロジェクトの７回の毎週のバックアップ（それぞれ約14GB）
−課題格納バックアップ−ソフトウェア製品に関係する課題を報告しフォローするために使用される課題格納データの７回の毎週のバックアップ（それぞれ約18GB）
−wikiバックアップ−営利会社によって使用されたwikiの８回の毎週のバックアップ（それぞれ約9GB）
−一般的なファイルサーババックアップ−ＩＴからのホームディレクトリーの１４回の毎週のバックアップ（それぞれ約78GB）
【０１１２】
（６．２  ベースモデル）
シミュレートされたストレージシステム環境は、全く単純であり、次の主な条件に基づく。
−システムは各測定のはじめには空である。
−バックアップ用の記憶領域は連続的である（大きな１つのディスクのようなもの）
−１つのユーザファイルシステム／ディレクトリだけがシステムにバックアップされる（毎週の現行バージョン）
−分割は、Rabin fingerprintingによって予定された8KBサイズの可変ブロックサイズで行われる。
上記の条件で、今日のバックアップシステムに存在するあまりにも多くの詳細な実験を不明瞭にすることのないソリューションの問題および効率の重大性を評価するために、優先度を与える。
【０１１３】
（６．２．１  読み取りアルゴリズムのシミュレート）
2MBの一定の先読みと、512MBの専用LRU読み取りキャッシュを用いた、単純な読み取りアルゴリズムをシミュレートした。キャッシュサイズは、各バックアップのごく一部分だけを保持するために選択された（せいぜい６％）。先読みサイズの選択はセクション７．３で説明する。
【０１１４】
（６．２．２  ストリームコンテキストサイズ）
ストリームコンテキストサイズとしてとして5MBを使用する。これは、このコンテキストが小さいことにより、アルゴリズムが十分に効果的で有効で、書き込み待ち時間の増加を小さくさせるには、十分大きいためである。今日、バックアップシステムは、１つのストリームに対して容易に200 MB/sで実行し、ストリームコンテキストに書き入れるにはわずか25msしかかからないであろう。それらのコンテキストが見つかり（通常数ミリセカンドの後に）、25msで再書き込みするブロック（すべてのブロックの約5%）と既に重大な待ち時間がある非重複とを取得するとすぐに、ほとんどの重複ブロックが解放されるであろうことに注意すべきである。我々は、より大きなストリームコンテキストサイズを試したが、断片化解消の効果をあまり改善できなかった。１つの顕著な結果は、再書き込みされる重複の数が減縮したことである。
【０１１５】
（６．２．３  再書き込みのコスト）
ソリューションのコストを評価する場合、再書き込みによりバックアップがどのくらい遅くなるかを予測する必要がある。我々は、重複に対するチェックをしないよう商用バックアップシステムHYDRAstorの書き込みパスを修正し、重複を100%書く場合において上述したソリューションの性能と未変更システムの性能とを比較した。その結果、後者は前者より３倍大きかった。この結果に基づいて、我々は、ブロックを書くことと、ブロックが重複していないこととに対する３つの減速の要因を用いる。例えば、5%の再書き込みされたブロックは、15%の減速を引き起こす。全ての再書き込みブロックが重複しているので、実際の減速はオリジナルストリームにおける重複のパーセンテージによる。パーセンテージが高くなればなるほどより減速し、ストリームのブロックがすべて重複である場合には、15%減速する。
【０１１６】
（６．３  除外された要因）
分析を単純するために、我々はいくつかの要因を無視した。
−グローバルな重複排除−上述したように、グローバルな重複によって引き起こされた断片化は、我々の研究における着目点ではない。
−ディスクに対するデータの低い階層への配置−どのようなデータがディスクに保存されるかによるため、ストレージシステムでの実データの断片化は、我々のモデルにおける断片化よりも明らかに大きい。我々は、重複排除のみによって引き起こされる断片化の影響を研究したいので、この要因を無視した。
−多くのディスクドライブ／サーバー−我々のシステムにおけるリストアが全ての利用可能なディスクの性能を使用できる場合に、多くのディスクを備えたシステムでの断片化の問題は、１枚のディスクのみにおける場合よりも少なくとも重大である。他方で、リストアにある程度の性能だけを必要とするなら、我々は追求すべき多くの軸があり、そのような追求は必ずしもリストア性能を低下させるわけではないので、複数のディスクを利用することの上述した重大さは減少する。
この研究では、我々は、前者のケースを仮定し、１枚のディスクのみを有する場合の断片化について研究する。
【０１１７】
（６．４  インターナルストリームの重複）
インターナルストリームの重複−ブロックが現在のバックアップストリームに二度以上現われる場合−は、２つの異なる方向でリストア性能に影響を与えうる。
−肯定的に−重複データが既にキャッシュにあり、ディスクオペレーションが読み取りを必要としていないとき。
−否定的に−データがキャッシュから既に出力されているとき。そのようなケースでは、ディスクから再びそれをダウンロードすることは、現在のストリームコンテキストと異なる古いディスクコンテキストの読み取りが生じうる。そのようなデータはキャッシュに入れられるが、今後（要求されたブロックとは別に）使用されないかもしれない。
【０１１８】
我々の調査では、図１３に示すように、インターナル重複が比較的高い割合で生じる。このため、これらの影響は、インターナルバックアップのリストア性能が47%減少から12%増加というように、ときどき明確に現れる。（図１３は、データセット特性を示す。（*最初のバックアップを除いたデータ））
リストア速度におけるインターナル重複の影響は、我々のソリューションと比較されるベースレベル性能を調節する。確かに、インターナル断片化は、アドレス指定される必要があり、問題が残ったままであるが、それは我々の研究では焦点を当てない。インターナル断片化をアドレス指定するいくつかの可能なオプションは、より性能向上のためにより適切な方法でディスク上のデータをキャッシュしている。
【０１１９】
＜第７章  評価＞
（７．１  必要条件を満たすこと）
図１５ａ−１５ｄによって示されるように、上述したCBRアルゴリズムは最新ストリームの将来の読み取り性能を最適化する。結果として最新バックアップのリストア性能は、完全な断片化解消（例えば、オフライン重複排除による）の後に実行される最適なリストアの数パーセント内であるため、我々のアルゴリズムによる断片化の解消は、すべてのトレースにおいて非常に有効である。断片化の解消なしで、インライン重複排除を有する最新バックアップからのリストア性能は、課題格納に対する最適なものの50%未満であり、また、他のバックアップセットに対する85%-88%である。
図１５ａ−１５ｄ：３つのケースのリストア速度を示す。（１）ＣＢＲ断片化解消の後、（２）断片化解消のないインライン重複排除、（３）オフライン重複排除：インターバージョン断片化無しで各バックアップのリストア速度を１００に規格化した。
【０１２０】
重複を直ちに削除することを前提とすることは、新しいブロックとして重複を書き込むよりも３倍速い。また、我々がすべてのブロックのせいぜい5%を再書き込みするので、CBRにより、書き込み性能が多くて15%減少する。図１４に示すように、我々のアルゴリズムは、全てのブロックの目標の５％よりも低いパーセンテージで再書き込みを行う。これは、我々の最小再書き込み有効度が70%で高くセットされ、常にバックアップストリームを処理する間に5%の限界を観測しているので、非常に控えめであるからである。その結果、我々のアルゴリズムでは、1%-5%だけ書き込み性能が減少する（図１４で書き込み時間増加カラムを参照）。（図１４は、各バックアップセットの最新バックアップにおけるＣＢＲ断片化解消の影響を示す。インターバージョン断片化無しにおけるリストアの最適性能を１００に規格化した。）
【０１２１】
我々のアルゴリズムは、再書き込みされた重複ブロックを除いて、追加領域を使用しない。従って、ＣＢＲは、追加領域による消費は、すべてのブロックの5%未満であることを保証する。実際には、0.52%と2.61%の間のように、はるかに低い値である。ブロックの古いコピーは、例えば、定期的に実行される削除プロセスの一部といったバックグラウンドで削除される。従って、上記領域の消費は一時的である。
追加ディスク性能の消費も、再起書き込みブロックを書き込むことを制限している。さらに、アルゴリズムは、再書き込みされるブロックの割合を設定することによって、容易に調整可能である。割合が高くなると、書き込み性能の大きな低下と再書き込みされたブロックの一時的な古いコピーを記憶するために必要なディスク領域の増加を犠牲にして、リストア性能がよりよくなる。
【０１２２】
（７．２  再書き込み制限の設定）
再書き込み制限の最適な値を選択するために、最小の再書き込み有効度を70%で変更せず、1%から7%の間でこの制限値を変える一連の実験を行った。各バックアップセットにおける最新のバックアップに対する結果は、図１６のようになる。リストア性能が最悪の減少となる再書き込み制限5%において、課題格納以外のすべてのセットで、2%またはたった1%のような低い値の制限値で良く機能する。制限値が5%を越えて増加させることは行っておらず、すべての実験においても5%の制限値を設定することに決めた。（図６は、リストア性能における再書き込み制限の影響）
【０１２３】
（７．３  ディスクコンテキスト／先読みサイズ）
ディスク上で連続的なデータを読むために、より大きな先読みサイズであることが一般的には望ましいが、図１７に示すように、断片化データにとっては正しくない。（図１７は、断片化解消前の、各バックアップセットにおける最新バックアップの先読みサイズに対する読み取り時間の関係を示す。）
ここで、ほとんどすべてのケースでは、最良の固定先読みサイズは2MBである。１つの例外は課題格納バックアップであり、512KBの先読みサイズが望ましい。ここでは異なる先読みサイズを用いることを比較しているため、単にＩ／Ｏの数に基づく性能の推定はできない。代わりに、得られた性能について説明できるように、標準ディスク特性を想定する。
【０１２４】
これらの結果に基づいて、我々は、ＣＢＲアルゴリズムを備えたシステムで2MBの先読みを用いることを決めた。コンテキストに基づく再書き込みでいくつか他の先読みサイズが望ましく、このアルゴリズムの効率の評価は、課題格納以外のすべてのセットにとっては控えめであることに着目する。我々は、I/Oの数に基づく性能を推定するので、そのように行い、また、異なる先読みサイズで、追加条件なしでは可能ではない。
課題格納バックアップセットについては、テストによる最適な先読みサイズは512KBであるので、この先読みサイズを用いたCBRアルゴリズムを備えた、あるいは、備えていない両システムでシミュレートした。そのようなケースでは、断片化がリストア性能の25%低下を引き起こした（代わりに、2MBの先読みにおいては45%）。しかしながら、CBRアルゴリズムは、この低下を約5%減少させることができた。2MBの先読みサイズに設定されたCBRは、12%であるが、さらにこの低下を減少させた（ここでは、インターバージョン断片化が行われないときに、512KBの先読みで達成されるリストア性能を１００％とする）。
【０１２５】
（７．４  圧縮の影響）
これまでは、バックアップデータは圧縮しないと仮定してきた。先読みサイズを2MBと一定にした場合、圧縮可能データは結果として断片化に重大な問題を引き起こし、CBRアルゴリズムはさらによいリストア性能における改良を提供する。例えば、50%圧縮データにおいては、リストア性能の低下は、12-55%から15-65%に増加するのに対し、CBR断片化の解消は、この低下を3-6%（圧縮のない場合における4-7%に代わって）に減少させる。明らかに、例えばデータの圧縮率に基づいて異なる先読みサイズを選択することが、これらの結果を変更することができる。しかし、我々は、すべてのタイプのデータ（圧縮不可能なデータについては最適化されている）の先読みサイズを１つに固定することとする。
【０１２６】
（７．５  潜在的に不要な再書き込み）
将来的に、いくつかの再書き込みは不要かもしれない。これは、そのストリームコンテキストにはない決定ブロックのディスクコンテキスト内のブロックは、実際にはそのストリームの後に現れるかもしれないためである。そのような再書き込みの多くがどのように生じるかを予測するために、ストリーム内の現在位置からストリームの終わりまでを計測する可変サイズまで、標準5MBを構成するストリームコンテキストサイズを拡張する。
そのような拡張されたストリームコンテキストで計算された決定ブロックの再書き込み有効度が最小書き込み有効度である場合に、再書き込みを潜在的に不要なものとする。潜在的に不要な再書き込みの割合が、バックアップセットにより少なくともバックアップに対する30-40%と比較的高いことがわかる。標準のストリームコンテキストサイズを増加させることによって、これらの再書き込みのいくつかを回避することができる。例えば、それを5MBから20MBに増加させることで、22-37%にこの割合が減少する。これらの割合は高いが、含まれているこれらの潜在的に不要な再書き込みでさえも、全てのストリームブロックの非常に小さな割合でもまだ再書き込みする。
【０１２７】
（第８章  関連する研究）
上述したように、断片化は重複排除の必要悪である。最も単純なソリューションは、断片化解消を除いたポストプロセス重複排除であるが、セクション８．１で議論するが、他のいくつかの重大な問題がある。EMCのようないくつかのベンダーは、清掃プロセスを消費する時間とリソースで、断片化に対応しようとしている。このプロセスの詳細は公表されていないが、１つの可能なアプローチは、バックグラウンドで重複のサブセットを選択的に再書き込みすることである。つまり、ある意味では、我々のCBRアプローチに似ているが、オフサインで行われる。さらに、そのようなアルゴリズムについてはセクション８．２で説明する。HYDRAstorのような他のシステムは、重複排除率の減少を犠牲にするが、断片化問題の重大さを減少するより大きなブロック・サイズ（64KBブロック）を使用する。
【０１２８】
（８．１  オフライン重複排除を有して断片化を除去）
上記の必要条件のうちのいくつかを満たす簡単な１つのソリューションは、既に現在市場に存在し、オフライン重複排除と呼ばれる。その最も簡単な形式では、現在のバックアップからの全てのデータは、ディスクに連続的に格納される。そして、重複排除は、最新のバックアップからのブロックが、より古いバックアップから重複を除外するための基礎となることと同じ方法で、バックグラウンドで実行される。その結果、現在書き込まれたストリームは断片化せず、古いバックアップは世代に比例して断片化される。たとえアルゴリズムが断片化に対応するよう設計されなかったとしても、最近のバックアップでそれを除去することに非常に有効である。
【０１２９】
残念ながら、そのようなアプローチは他の多くの問題に苦しむ。１つの致命的なことは、上述したセクション１で説明したように、低い書き込み性能である。バックアップにおける重複のパーセンテージはデータパターンにより変わるが、通常、バックアップ間で小さなデータが変更されるので、その比率は75%以上である。セクション6.2.3に説明したように、データを書かない断片化解消は、データを最初に書き、その後、バックグラウンドで重複排除するよりも３倍速くなりうる。バックアップストリームが重複の75%を含むと控えめに仮定すること、オフライン重複排除を使用することは、インライン重複排除を備えたシステムにこのバックアップを書き込むことと比較して、結果として、70%以上のバックアップウィンドウとなる。仮に通常バックアップウィンドウが拡張できないとしても、これは明らかに受け入れがたい。
【０１３０】
（８．２  断片化解消のソリューションの比較）
オフライン重複排除とオンラインで行われたCBRを超えて、既にセクション5.4で説明したように、バックグラウンドつまりオフラインでコンテキストベースの再書き込みを実行する少なくとも１つのオプションがある。そのようなソリューションは、少しもバックアップ書き込みに影響しないが、断片化を引き起こす重複のストリームコンテキストの実質的部分を再書き込みしなければならないので、オンラインアプローチよりさらに多くのブロックを再書き込みする必要があるであろう。従って、このアプローチの主な欠点は、断片化されたデータを読み、バックグラウンドで再び選択されたブロックを再書き込みするために必要とされるリソースを含み、ブロックを再書き込みすることが完了する前に試みられたリストアの読み取り性能が低くなる、ということである。
【０１３１】
すべての言及された選択肢の比較を図１８に示す。両方のオフラインオプションの記憶消費が、ステージングつまりバックアップを書き込むプロセスの背後であるが並列に重複を削除する（あるいはそれらをいくつか再書き込みする）プロセスを実行することにより、改善されうることに着目する。しなしながら、ステージングは、利用可能なディスク性能とスピンドルのようなリソースをより必要とする。（図１８は、断片化解消ソリューションの比較である。）
【０１３２】
（８．３  残りの関連研究）
一般に、たとえ既に長い間知られていても、データ断片化の問題に関する文献は多くはない。いくつかの文献は、より高速に重複除去のために読まれたメタデータを改善する問題に取り組んでいる。Zhuらの研究は、ブルームフィルタとストリーム指向メタデータ先読みを用いるソリューションを記述している。ところが、Lillibridgeらは、わずかなインデックスソリューション（以前に選択されたわずかな大きなセグメント内でのみ重複を除去する）がより小さなメモリ消費のためよいと主張する。SSDのような追加ハードウェアは、ランダムな重複を除去するために使用することができる。このようなソリューションは、よりきめの細かい重複を検出できるため、断片化問題をさらに厳しくするであろう。さらに、上記のアプローチのいずれも、断片化されたデータを読み取ることの問題を解決せず、全ての場合において後のバックアップで断片化が増大する。
【０１３３】
重複排除の有効性を下げない断片化解消ソリューションにおける要求を緩和させると、データのサブセット内でのみ重複を除去しようとすることができ、断片化を減少させることができるかもしれない。わずかなインデックス付けに加えて、そのようなアプローチは、極端な破棄や、ProtectTier、サブ分割重複排除、さらに、Pasticheやデータドメイングローバル拡張のようなノードのサブセットに重複排除を限定するマルチノードシステムで可能である。残念なことに、現在のセグメントを重複排除するために以前のバックアップのほんのわずかなセグメント（２−３）を考慮しても（わずかなインデックスのように）、より古いセグメントからの重複も含んでいるかもしれないので、それらセグメントが既にディスク上では連続的ではないかもしれない。
【０１３４】
最後に、我々は、大量のブロックまたはオブジェクトの重複を除去することにより、断片化を減少させるかより解消することができる。EMC Centeraの初期バージョンでは、重複排除ユニットは、Centeraがターゲットとするマーケットつまりファイル保管に対して機能する全ファイルであるが、重複排除の有効性が低いため、バックアップに対する正しいソリューションではない。
【０１３５】
＜第９章  結論および今後の研究＞
この研究では、インライン重複排除機能を有するストレージシステムにおけるデータ断片化のことを記述しており、インターバージョン重複排除によって生じる断片化のリストア性能に対する影響を定量化している。その問題は非常に厳しく、実際のバックアップトレースとレートのセットによって実行された実験（各バックアップセットにおいて７−１４回のバックアップ）により確認されたように、バックアップ特性により、結果として50%を超えるリストア速度の低下となる。より大きなセットでは、数か月あるいは数年にもまたがるバックアップとなり、この問題がさらに大きいことが予想される。さらに、この問題は、たいていリストアに使用される最新のバックアップに最も影響する。
【０１３６】
その問題に対処するために、我々は、全てのブロックの5%以下で、選択されたいくつかの重複を再書き込みするコンテキストベースの再書き込みアルゴリズムを提案した。提案したアルゴリズムは、めったにリストアに用いられないより古いバックアップに対して断片化が増加する最新バックアップのリストア速度を改善する。再書き込みされた古いコピーは、例えば、重複排除機能を有するストレージシステムで既に必要とされている周期的削除プロセスや領域再生プロセスといったバックグラウンド処理で削除される。
【０１３７】
我々のトレース実行シミュレーション実験では、少数の選択されたブロックを再書き込みすることで書き込み性能が少し低下すると示したが、実質的に、最新のバックアップに対するリストア速度の低下を抑制する（最適性能の4-7%以内）。
【０１３８】
今後の研究において、我々は、CBRアルゴリズムをそれほど控えめとせず（再書き込みブロックの望ましい割合を一時的に超えることを許容する）、断片化の除去の影響を詳しく調べ、また、その有効性へのアルゴリズム拡張の影響を調べることを計画している。さらに、我々は、商用バックアップシステムで提案されたソリューションを評価することも計画している。
【０１３９】
今後の調査において重要な１つの課題は、さらにインターナル重複によって引き起こされた断片化に有効に対処する方法である。我々の実験では、いくつかのバックアップについて、１つのバックアップセット内で多数のバックアップストリームにわたる重複によって引き起こされるような重複に似ている断片化が、リストアの減速を引き起こすことを示している。
この論文では、毎週、異なるバージョンに書き込まれる１つの論理ストリームによって生じる断片化に集中している。たとえ、これが有力なケースであっても、問題のあと２つの原因がまだ調べられていない。異なるバックアップセット間におけるインターナル重複の除去とグローバル重複排除とは両方とも、読み取り性能に関する問題につながるかもしれない。それらの解決は、重要なリストアの最適化において、別のステップとなるであろう。
【０１４０】
＜付記＞
上記実施形態の一部又は全部は、以下の付記のようにも記載されうる。以下、本発明におけるストレージ装置（図１９参照）、プログラム、情報処理方法の構成の概略を説明する。但し、本発明は、以下の構成に限定されない。
【０１４１】
（付記１）
書き込み対象データを複数のブロックデータに分割するデータ分割手段１１１と、
前記データ分割手段にて分割した前記各ブロックデータが、記憶装置１２０に既に記憶されているか否かを調べるブロック検出手段１１２と、
前記データ分割手段にて分割した前記各ブロックデータを記憶装置に記憶すると共に、当該記憶装置に既に記憶されているブロックデータと同一内容の他のブロックデータを記憶装置に記憶する場合には、当該記憶装置に既に記憶されているブロックデータを前記他のブロックデータとして参照させるデータ書き込み手段１１３と、を備え、
前記ブロック検出手段１１２は、前記データ分割手段にて分割した前記ブロックデータのうち前記書き込み対象データ中の所定範囲を構成する連続する複数のブロックデータと、記憶装置に既に連続して記憶されている所定範囲の複数のブロックデータと、の共通部分の割合を表す共通割合を検出し、
前記データ書き込み手段１１３は、前記ブロック検出手段にて検出した前記共通割合に応じて、前記データ分割手段にて分割した前記ブロックデータを、新たに記憶装置に記憶する、
ストレージ装置１００。
【０１４２】
（付記２）
付記１に記載のストレージ装置であって、
前記ブロック検出手段は、前記データ分割手段にて分割した特定の前記ブロックデータが記憶装置に既に記憶されていることを検出した場合に、前記書き込み対象データ中の所定範囲を構成する前記特定のブロックデータから連続する複数のブロックデータと、記憶装置内に既に記憶されている前記特定のブロックデータと同一内容のブロックデータから連続する所定範囲の複数のブロックデータと、の前記共通割合を検出し、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて、前記特定のブロックデータを新たに記憶装置に記憶する、
ストレージ装置。
【０１４３】
（付記３）
付記１又は２に記載のストレージ装置であって、
前記ブロック検出手段は、前記データ分割手段にて分割した前記ブロックデータのうち前記書き込み対象データ中の所定範囲を構成する連続する複数のブロックデータのそれぞれが、当該連続する複数のブロックデータの並び順に関係なく、記憶装置に既に連続して記憶されている所定範囲の複数のブロックデータのそれぞれと一致する割合を、前記共通割合として検出する、
ストレージ装置。
【０１４４】
（付記４）
付記１乃至３のいずれかに記載のストレージ装置であって、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合が予め設定された値以下である場合に、前記データ分割手段にて分割した前記ブロックデータを新たに記憶装置に記憶する、
ストレージ装置。
【０１４５】
（付記５）
付記１乃至４のいずれかに記載のストレージ装置であって、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて新たに記憶装置に記憶する前記ブロックデータの容量が、所定の容量以下となるよう設定する、
ストレージ装置。
【０１４６】
（付記６）
付記１乃至４のいずれかに記載のストレージ装置であって、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて新たに記憶装置に記憶する前記ブロックデータである再書き込みブロックデータの容量が、前記書き込み対象データのうち既に記憶装置に記憶されているデータの容量に対して、予め設定された割合以下となるよう設定する、
ストレージ装置。
【０１４７】
（付記７）
付記６に記載のストレージ装置であって、
前記データ書き込み手段は、前記再書き込みブロックデータの容量が、前記書き込み対象データのうち既に記憶装置に記憶されているデータの容量に対して、５％以下となるよう設定する、
ストレージ装置。
【０１４８】
（付記８）
情報処理装置に、
書き込み対象データを複数のブロックデータに分割するデータ分割手段と、
前記データ分割手段にて分割した前記各ブロックデータが、記憶装置に既に記憶されているか否かを調べるブロック検出手段と、
前記データ分割手段にて分割した前記各ブロックデータを記憶装置に記憶すると共に、当該記憶装置に既に記憶されているブロックデータと同一内容の他のブロックデータを記憶装置に記憶する場合には、当該記憶装置に既に記憶されているブロックデータを前記他のブロックデータとして参照させるデータ書き込み手段と、を実現させると共に、
前記ブロック検出手段は、前記データ分割手段にて分割した前記ブロックデータのうち前記書き込み対象データ中の所定範囲を構成する連続する複数のブロックデータと、記憶装置に既に連続して記憶されている所定範囲の複数のブロックデータと、の共通部分の割合を表す共通割合を検出し、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて、前記データ分割手段にて分割した前記ブロックデータを、新たに記憶装置に記憶する、
ことを実現させるためのプログラム。
【０１４９】
（付記９）
付記８に記載のプログラムであって、
前記ブロック検出手段は、前記データ分割手段にて分割した特定の前記ブロックデータが記憶装置に既に記憶されていることを検出した場合に、前記書き込み対象データ中の所定範囲を構成する前記特定のブロックデータから連続する複数のブロックデータと、記憶装置内に既に記憶されている前記特定のブロックデータと同一内容のブロックデータから連続する所定範囲の複数のブロックデータと、の前記共通割合を検出し、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて、前記特定のブロックデータを新たに記憶装置に記憶する、
プログラム。
【０１５０】
（付記１０）
付記８又は９に記載のプログラムであって、
前記データ書き込み手段は、前記ブロック検出手段にて検出した前記共通割合に応じて新たに記憶装置に記憶する前記ブロックデータである再書き込みブロックデータの容量が、前記書き込み対象データのうち既に記憶装置に記憶されているデータの容量に対して、予め設定された割合以下となるよう設定する、
プログラム。
【０１５１】
（付記１１）
書き込み対象データを複数のブロックデータに分割し、
分割した前記各ブロックデータが、記憶装置に既に記憶されているか否かを調べ、
分割した前記各ブロックデータを記憶装置に記憶すると共に、当該記憶装置に既に記憶されているブロックデータと同一内容の他のブロックデータを記憶装置に記憶する場合には、当該記憶装置に既に記憶されているブロックデータを前記他のブロックデータとして参照させることによりデータを書き込む情報処理方法であり、
前記書き込み対象データをブロックデータに分割した後に、当該分割した前記ブロックデータのうち前記書き込み対象データ中の所定範囲を構成する連続する複数のブロックデータと、記憶装置に既に連続して記憶されている所定範囲の複数のブロックデータと、の共通部分の割合を表す共通割合を検出し、
検出した前記共通割合に応じて、分割した前記ブロックデータを、新たに記憶装置に記憶する、
情報処理方法。
【０１５２】
（付記１２）
付記１１に記載の情報処理方法であって、
前記書き込み対象データをブロックデータに分割した後に、当該分割した特定の前記ブロックデータが記憶装置に既に記憶されていることを検出した場合に、前記書き込み対象データ中の所定範囲を構成する前記特定のブロックデータから連続する複数のブロックデータと、記憶装置内に既に記憶されている前記特定のブロックデータと同一内容のブロックデータから連続する所定範囲の複数のブロックデータと、の前記共通割合を検出し、
検出した前記共通割合に応じて、前記特定のブロックデータを新たに記憶装置に記憶する、
情報処理方法。
【０１５３】
（付記１３）
付記１１又は１２に記載の情報処理方法であって、
検出した前記共通割合に応じて新たに記憶装置に記憶する前記ブロックデータである再書き込みブロックデータの容量が、前記書き込み対象データのうち既に記憶装置に記憶されているデータの容量に対して、予め設定された割合以下となるよう設定する、
情報処理方法。
【０１５４】
なお、上述したプログラムは、記憶装置に記憶されていたり、コンピュータが読み取り可能な記録媒体に記録されている。例えば、記録媒体は、フレキシブルディスク、光ディスク、光磁気ディスク、及び、半導体メモリ等の可搬性を有する媒体である。
【０１５５】
以上、上記実施形態や付記を参照して本願発明を説明したが、本願発明は、上述した実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明の範囲内で当業者が理解しうる様々な変更をすることができる。
【符号の説明】
【０１５６】
１  ストレージシステム
２  アクセラレータノード
３  ストレージノード
４  バックアップシステム
５  バックアップ対象装置
１１  データ分割部
１２  ブロック検出部
１３  データ書き込み部
１４  データ読み出し部
２０  記憶装置
１００  ストレージ装置
１１１  データ分割手段
１１２  ブロック検出手段
１１３  データ書き込み手段
１２０  記憶装置
【図１】
0005418719.tif 000002
【図２】
0005418719.tif 000003
【図３】
0005418719.tif 000004
【図４】
0005418719.tif 000005
【図５】
0005418719.tif 000006
【図６】
0005418719.tif 000007
【図７】
0005418719.tif 000008
【図８】
0005418719.tif 000009
【図９】
0005418719.tif 000010
【図１０】
0005418719.tif 000011
【図１１】
0005418719.tif 000012
【図１２】
0005418719.tif 000013
【図１３】
0005418719.tif 000014
【図１４】
0005418719.tif 000015
【図１５ａ】
0005418719.tif 000016
【図１５ｂ】
0005418719.tif 000017
【図１５ｃ】
0005418719.tif 000018
【図１５ｄ】
0005418719.tif 000019
【図１６】
0005418719.tif 000020
【図１７】
0005418719.tif 000021
【図１８】
0005418719.tif 000022
【図１９】
0005418719.tif 000023