(57)【要約】      （修正有）【課題】情報処理システムにおいてデータの重複排除を行う。【解決手段】データ保存先装置３は、データに基づいて生成された保存単位サイズの複数の保存データのうちの第１の保存データと、保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値と、第１の保存データの少なくとも一部に対応する第２のハッシュ値とを受信する。外部の装置２によって保存対象データに基づいて生成された保存単位サイズの第２の保存データを受信する。第１の保存データの少なくとも一部に対応する第２のハッシュ値が、第２の保存データの少なくとも一部に対応する第３のハッシュ値と一致する場合に、第１の断片データに対応する第１のハッシュ値が、複数の装置に保存されており第２の保存データを含み重複検出サイズの第２の断片データに対応する第４のハッシュ値と一致するか判断し、一致する場合に、第２の断片データに対する重複を検出する。【選択図】図１
2017097437.tif 000002
【特許請求の範囲】
【請求項１】
第１の情報処理装置と複数の第２の情報処理装置とを具備し、
前記第１の情報処理装置は、
データに基づいて保存単位サイズの複数の保存データを生成する生成部と、
前記データに含まれており前記保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値を計算するとともに、前記第１の断片データに含まれている第１の保存データの少なくとも一部に対応する第２のハッシュ値を計算する計算部と、
前記第１の保存データと前記第１のハッシュ値と前記第２のハッシュ値とを、前記複数の第２の情報処理装置のうちの保存先装置へ送信する送信部と、
を具備し、
前記保存先装置は、
前記第１の保存データと前記第１のハッシュ値と前記第２のハッシュ値とを受信するとともに、外部の情報処理装置によって保存対象データに基づいて生成された前記保存単位サイズの第２の保存データを受信する受信部と、
前記第１の保存データの少なくとも一部に対応する前記第２のハッシュ値が、前記受信部によって受信された前記第２の保存データの少なくとも一部に対応する第３のハッシュ値と一致するか否か判断し、前記第２のハッシュ値が前記第３のハッシュ値と一致する場合に、前記第１の断片データに対応する前記第１のハッシュ値が、前記複数の第２の情報処理装置に保存されており前記第２の保存データを含み前記重複検出サイズの第２の断片データに対応する第４のハッシュ値と一致するか判断し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する処理部と、
を具備する、情報処理システム。
【請求項２】
前記処理部は、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記保護対象データにおける一致位置を示す重複位置情報を、前記外部の情報処理装置へ送信し、
前記外部の情報処理装置は、前記重複位置情報に基づいて、重複部分が同一の断片データに含まれるように、前記保存対象データに対する複数の新たな断片データを生成し、前記複数の新たな断片データに基づいて複数の新たな保存データを生成し、前記複数の新たな保存データを、前記複数の第２の情報処理装置へ送信し、
前記受信部は、前記新たな保存データを受信し、
前記処理部は、前記新たな保存データと前記第１の保存データとが一致する場合に、前記新たな保存データの重複排除を行う、
請求項１に記載の情報処理システム。
【請求項３】
前記第１の情報処理装置は、
参照ハッシュ値と前記参照ハッシュ値に対応して決定される保存先識別情報とを関係付けた選択情報を保存する記憶部と、
前記第１のハッシュ値と前記選択情報とに基づいて、前記複数の保存データのそれぞれの保存先となる第２の情報処理装置を決定する制御部と、
をさらに具備し、
前記送信部は、前記複数の保存データのそれぞれを、決定された前記第２の情報処理装置へ送信する、
請求項１に記載の情報処理システム。
【請求項４】
前記処理部は、前記第２の保存データの少なくとも一部に対応する前記第３のハッシュ値を、前記第２の保存データ内で計算範囲をずらしながら、ローリングハッシュ関数に基づいて計算する、
請求項１に記載の情報処理システム。
【請求項５】
前記第２のハッシュ値は、前記第１の断片データに含まれている先頭の保存データの前半部分のハッシュ値及び後半部分のハッシュ値を含み、
前記処理部は、前記前半部分のハッシュ値又は前記後半部分のハッシュ値が、前記第３のハッシュ値と一致する場合に、前記第１のハッシュ値が前記第４のハッシュ値と一致するか判断し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する、
請求項１に記載の情報処理システム。
【請求項６】
前記処理部は、前記第２のハッシュ値が前記第３のハッシュ値と一致する場合に、一致位置から始まる前記重複検出サイズ分の前記第２の断片データに対応する前記第４のハッシュ値を計算し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する、
請求項１に記載の情報処理システム。
【請求項７】
前記生成部は、前記保存対象データを分割した複数の分割データと前記複数の分割データに対応する誤り訂正データとを含む前記複数の保存データ、を生成する、
請求項１に記載の情報処理システム。
【請求項８】
データに基づいて保存単位サイズの複数の保存データを生成する生成部と、
前記データに含まれており前記保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値を計算するとともに、前記第１の断片データに含まれている第１の保存データの少なくとも一部に対応する第２のハッシュ値を計算する計算部と、
前記第１の保存データと前記第１のハッシュ値と前記第２のハッシュ値とを、複数の情報処理装置のうちの保存先装置へ送信する送信部と、
を具備する情報処理装置。
【請求項９】
データに基づいて生成された保存単位サイズの複数の保存データのうちの第１の保存データと、前記データに含まれており前記保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値と、前記第１の断片データに含まれている第１の保存データの少なくとも一部に対応する第２のハッシュ値とを受信するとともに、外部の情報処理装置によって保存対象データに基づいて生成された前記保存単位サイズの第２の保存データを受信する受信部と、
前記第１の保存データの少なくとも一部に対応する前記第２のハッシュ値が、前記受信部によって受信された前記第２の保存データの少なくとも一部に対応する第３のハッシュ値と一致するか否か判断し、前記第２のハッシュ値が前記第３のハッシュ値と一致する場合に、前記第１の断片データに対応する前記第１のハッシュ値が、複数の情報処理装置に保存されており前記第２の保存データを含み前記重複検出サイズの第２の断片データに対応する第４のハッシュ値と一致するか判断し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する処理部と、
を具備する情報処理装置。
【請求項１０】
コンピュータを、
データに基づいて保存単位サイズの複数の保存データを生成する生成部と、
前記データに含まれており前記保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値を計算するとともに、前記第１の断片データに含まれている第１の保存データの少なくとも一部に対応する第２のハッシュ値を計算する計算部と、
前記第１の保存データと前記第１のハッシュ値と前記第２のハッシュ値とを、複数の情報処理装置のうちの保存先装置へ送信する送信部と、
して機能させるためのプログラム。
【請求項１１】
コンピュータを、
データに基づいて生成された保存単位サイズの複数の保存データのうちの第１の保存データと、前記データに含まれており前記保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値と、前記第１の断片データに含まれている第１の保存データの少なくとも一部に対応する第２のハッシュ値とを受信するとともに、外部の情報処理装置によって保存対象データに基づいて生成された前記保存単位サイズの第２の保存データを受信する受信部と、
前記第１の保存データの少なくとも一部に対応する前記第２のハッシュ値が、前記受信部によって受信された前記第２の保存データの少なくとも一部に対応する第３のハッシュ値と一致するか否か判断し、前記第２のハッシュ値が前記第３のハッシュ値と一致する場合に、前記第１の断片データに対応する前記第１のハッシュ値が、複数の情報処理装置に保存されており前記第２の保存データを含み前記重複検出サイズの第２の断片データに対応する第４のハッシュ値と一致するか判断し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する処理部と、
して機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本実施形態は、情報処理システム、情報処理装置、及びプログラムに関する。
【背景技術】
【０００２】
大規模ストレージに用いられるオブジェクトストレージでは、耐障害性の実現のために消失符号が用いられる。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】米国特許第７９９２０３７号明細書
【特許文献２】特開２０１０−７９８８６号公報
【非特許文献】
【０００４】
【非特許文献１】Rabin, Michael O.  Fingerprinting by random polynomials.  Center for Research in Computing Techn., Aiken Computation Laboratory, Univ., 1981.
【非特許文献２】openstack CLOUD SOFTWARE, “The Rings − swift 2.5.1.dev128 documentation - Open Stack Docs”, [2015年11月18日検索], インターネット<URL：http://docs.openstack.org/developer/swift/overview_ring.html>
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本実施形態は、データの重複排除を行う情報処理システム、情報処理装置、及びプログラムを提供する。
【課題を解決するための手段】
【０００６】
本実施形態に係る情報処理システムは、第１の情報処理装置と複数の第２の情報処理装置とを含む。第１の情報処理装置は、生成部と計算部と送信部とを含む。生成部は、データに基づいて保存単位サイズの複数の保存データを生成する。計算部は、データに含まれており保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値を計算するとともに、第１の断片データに含まれている第１の保存データの少なくとも一部に対応する第２のハッシュ値を計算する。送信部は、第１の保存データと第１のハッシュ値と第２のハッシュ値とを、複数の第２の情報処理装置のうちの保存先装置へ送信する。保存先装置は、受信部と処理部とを含む。受信部は、第１の保存データと第１のハッシュ値と第２のハッシュ値とを受信するとともに、外部の情報処理装置によって保存対象データに基づいて生成された保存単位サイズの第２の保存データを受信する。処理部は、第１の保存データの少なくとも一部に対応する第２のハッシュ値が、受信部によって受信された第２の保存データの少なくとも一部に対応する第３のハッシュ値と一致するか否か判断し、第２のハッシュ値が第３のハッシュ値と一致する場合に、第１の断片データに対応する第１のハッシュ値が、複数の第２の情報処理装置に保存されており第２の保存データを含み重複検出サイズの第２の断片データに対応する第４のハッシュ値と一致するか判断し、第１のハッシュ値が第４のハッシュ値と一致する場合に、第２の断片データに対する重複を検出する。
【図面の簡単な説明】
【０００７】
【図１】第１の実施形態に係る情報処理システムの構成を例示するブロック図。
【図２】第１の実施形態に係る情報処理システムの構成を例示する概念図。
【図３】オブジェクトとフラグメントサーバのディスクとの関係の一例を示す概念図。
【図４】ディスク選択インデックスファイルを例示する図。
【図５】重複排除方法の第１乃至第３の方式を例示する図。
【図６】通常のハッシュ計算とローリングハッシュ計算との比較結果を例示する図。
【図７】フラグメント保存処理を例示するフローチャート。
【図８】フラグメント保存処理を例示する概念図。
【図９】オブジェクトの読み出し手順を例示するフローチャート。
【図１０】重複するフラグメントの排除処理の具体例を示す図。
【図１１】フィンガープリントセットを例示する図。
【図１２】フィンガープリントセットの保存形式と探索方法を例示する図。
【図１３】自由位置での重複排除処理を例示するフローチャート。
【図１４】重複排除処理におけるフラグメントの第１の読み出し処理を例示する図。
【図１５】重複排除処理におけるフラグメントの第２の読み出し処理を例示する図。
【図１６】自由位置での重複排除処理の第１の例を示す図。
【図１７】自由位置での重複排除処理の第２の例を示す図。
【図１８】フロントエンドサーバによるオブジェクトの再配置の第１の例を示す図。
【図１９】フロントエンドサーバによるオブジェクトの再配置の第２の例を示す図。
【発明を実施するための形態】
【０００８】
以下、図面を参照しながら本発明の実施の形態について説明する。なお、以下の説明において、略又は実質的に同一の機能及び構成要素については、同一符号を付し、必要に応じて説明を行う。
【０００９】
［第１の実施形態］
大規模ストレージで用いられるオブジェクトストレージは、保存対象のデータを抽象化されたオブジェクト単位で管理するため、例えばＨＤＤ（Hard Disk Drive）又はＳＳＤ（Solid State Drive）といった保存先のハードウェアの種類、台数の制限、又はファイルシステムの仕様による制限を受けない。このため、オブジェクトストレージは、ハードウェアの入れ替え及び容量の増設などを簡単に行うことができるといった高い拡張性を持ち、大規模なストレージシステムを安価に構築可能である。
【００１０】
本実施形態に係る情報処理システムは、オブジェクトストレージを用い、消失符号（Erasure Coding）を用いて高い耐障害性を実現する。また、本実施形態に係る情報処理システムは、消失符号の信頼性を維持しながらシステム全体で保存されるデータの重複排除を適用し、記憶容量を削減、換言すれば記憶効率を向上させる。
【００１１】
本実施形態では、複数の物理ディスクに分散されて保存されるオブジェクト及び消失符号の集合を管理しながら重複排除を適用することにより、物理ディスクの故障に対する信頼性を維持する。
【００１２】
本実施形態に係る情報処理システムは、記憶容量の拡張性を維持するため、ＩＰ（Internet Protocol）接続型ドライブのような高機能なドライブの利用を想定している。しかしながら、ＩＰ接続ではない複数台接続可能なドライブであってもよい。ドライブは、例えば、不揮発性の半導体メモリを含むとしてもよい。不揮発性メモリは、例えばＮＡＮＤ型フラッシュメモリとするが、ＮＯＲ型フラッシュメモリ、ＭＲＡＭ（Magnetoresistive Random Access Memory：磁気抵抗メモリ）、ＰＲＡＭ（Phase change Random Access Memory：相変化メモリ）、ＲｅＲＡＭ（Resistive Random Access Memory：抵抗変化型メモリ）、ＦｅＲＡＭ（Ferroelectric Random Access Memory）など他の不揮発性半導体メモリでもよい。例えば、不揮発性メモリは、不揮発性の半導体メモリではない他の不揮発性メモリ、磁気メモリなどでもよい。例えば、不揮発性メモリは、３次元構造のフラッシュメモリでもよい。例えば、不揮発性メモリは、ディスク（例えばｄｉｓｃ又はｄｉｓｋ）でもよい。
【００１３】
本実施形態に係る情報処理システムでは、複数のドライブが重複位置の探索を分担して行う。これにより、データの記憶量の増加に対するフロントエンドサーバの負荷を軽減する。
【００１４】
本実施形態において、ユーザの使用する端末（又は端末上で動作するアプリケーション）は、例えばＲＥＳＴ（Representational State Transfer） ＡＰＩ（Application Programming Interface）などのような所定の規約を使用してオブジェクトを保存又は取得する。このＡＰＩを担当する情報処理装置を、フロントエンドサーバと呼ぶ。フロントエンドサーバは、オブジェクトの保存要求をユーザの端末又はユーザの使用する端末のアプリケーションから受け取ると，オブジェクトを適切な数の断片（以下、ストライドと呼ぶ）へと分解し、それぞれの断片に消失符号を使用して符号化を行う。ストライドは、重複検出サイズを持つ。
【００１５】
ストライドは、符号化によって消失符号適用の最小分割単位（以下、フラグメントと呼ぶ）に分割される。フラグメントは、保存単位サイズを持つ。フロントエンドサーバは、これらのフラグメントを、例えばＫＶＳ（Key-Value Store） ＡＰＩを使用して、最終的なデータの保存先である複数のフラグメントサーバへ保存する。
【００１６】
その後、フラグメントサーバは、保存したフラグメントに対し、重複排除を行う。例えば、消失符号の信頼性を維持するため、重複排除は、ストライド単位で行う。
【００１７】
なお、ユーザの使用する端末とフロントエンドサーバとの間でデータを送受信する際のＡＰＩ、及びフロントエンドサーバとフラグメントサーバとの間でデータを送受信する際のＡＰＩは、上述のものに限られない。
【００１８】
図１は、本実施形態に係る情報処理システムの構成を例示するブロック図である。
【００１９】
情報処理システム１は、１台以上のフロントエンドサーバ２、複数のフラグメントサーバ３を備える。この図１では、フロントエンドサーバ２が１台の場合を説明する。また、複数のフラグメントサーバ３のうちの１台のフラグメントサーバを代表して説明する。
【００２０】
フロントエンドサーバ２は、オブジェクトから複数のストライドを生成し、さらに複数のストライドのそれぞれから複数のフラグメントを生成し、複数のフラグメントを複数のフラグメントサーバ３へ分散して送信する。
【００２１】
複数のフラグメントサーバ３のそれぞれは、自機の記憶部３１に保存されているフラグメントの少なくとも一部と、受信されたフラグメントの少なくとも一部とが一致するか否か判断する。複数のフラグメントサーバ３のそれぞれは、保存されているフラグメントの少なくとも一部と、受信されたフラグメントの少なくとも一部とが一致する場合に、当該保存されているフラグメントを含み複数のフラグメントサーバ３に保存されている１ストライド分のデータと、受信されたフラグメントを含みオブジェクトに含まれている１ストライド分のデータとが一致するか判断する。そして、複数のフラグメントサーバ３のそれぞれは、保存されている１ストライド分のデータと、オブジェクトに含まれている１ストライド分のデータとが一致する場合に、オブジェクトにおける重複位置を示す重複位置情報をフロントエンドサーバ２へ送信する。
【００２２】
フロントエンドサーバ２は、重複位置情報に基づいて、重複部分が同一のストライドに含まれるように、オブジェクトから複数のストライドを再生成し、さらに再生成された複数のストライドのそれぞれから複数のフラグメントを再生成し、再生成された複数のフラグメントを複数のフラグメントサーバ３へ分散して送信する。
【００２３】
複数のフラグメントサーバ３のそれぞれは、再生成され受信されたフラグメントが自機の記憶部３１に保存されているフラグメントと一致する場合に、重複排除を行う。
【００２４】
フロントエンドサーバ２は、コントローラ２０、記憶部２１を含む。
【００２５】
コントローラ２０は、送受信部２２、プロセッサ２３、メモリ２４、制御部２５を含む。
【００２６】
送受信部２２は、ユーザＵの使用する端末１１（又は端末１１上で動作するアプリケーション）、及びフラグメントサーバ３と、例えばコマンド、アドレス、データ、情報、指示、信号などを送受信する。
【００２７】
ユーザＵの使用する端末１１は、例えばコンピュータ、ＰＤＡ（Personal Digital Assistant）、スマートフォン、タブレット型端末などであってもよい。
【００２８】
プロセッサ２３は、送受信部２２及び制御部２５からの指示に基づき、制御処理及び演算処理を実行する。プロセッサ１としては、例えば、ＣＰＵ（Central Processing Unit）、ＭＰＵ（Micro-Processing Unit）、又は、ＤＳＰ（Digital Signal Processor）などが利用される。
【００２９】
メモリ２４は、主記憶装置であり、プロセッサ２３からの制御に従う。メモリ２４には、プロセッサ２３の制御に基づいて、送受信部２２により送受信されるデータ又は制御部２５により生成されたデータなどが一時的に格納される。
【００３０】
制御部２５は、オブジェクト分割部２０１、消失符号計算部２０２、フィンガープリント計算部２０３を含む。
【００３１】
オブジェクト分割部２０１は、ユーザＵの使用する端末１１より送受信部２２を介して受信したオブジェクトを、ストライドに分割する。ストライドのサイズは、システムにより任意に定められる。
【００３２】
オブジェクトのサイズがストライドのサイズの整数倍でない場合は、整数倍となるまでオブジェクトに意味を持たないパディングデータ（例えばゼロデータ）を付加、すなわちパディングする。なお、パディングは、オブジェクトを複数のストライドに分割し、この分割されたストライドのうち所定のサイズに満たないストライドに、パディングデータを補充することで実現されてもよい。
【００３３】
消失符号計算部２０２は、オブジェクト分割部２０１により得られた各ストライドに対する消失符号を計算する符号化を行う。具体的には、消失符号計算部２０２は、ストライドに基づいて複数のフラグメントを生成する。ストライドに対応する複数のフラグメントは、情報シンボル部と、パリティシンボル部とを含む。消失符号の詳細については、図３で後述する。
【００３４】
フィンガープリント計算部２０３は、任意のデータに対してフィンガープリントを計算する。計算対象のデータは、例えばストライド単位、フラグメント単位、フラグメントの半分の単位（１／２フラグメント単位と呼ぶ）などであってもよい。フィンガープリントは、例えばハッシュ値であり、データの内容に基づいて一意に定まる値である。すなわち、例えば同一のデータからなるストライドのフィンガープリントは、必ず同一となる。従って、フィンガープリントが同一であれば、同じデータである可能性が高いため、フィンガープリントの比較は、重複排除処理において重複データを探索する場合に有効である。本実施形態では、複数のデータに対応するフィンガープリントを比較することで、複数のデータの一致又は不一致を判断する。
【００３５】
また、フィンガープリント計算部２０３は、算出したフィンガープリントを記憶部２１に保存する。
【００３６】
記憶部２１は、オブジェクト記憶部２１１と、フィンガープリントセット２１２と、ディスク選択インデックスファイル２１３とを含む。
【００３７】
オブジェクト記憶部２１１は、送受信部２２が受信したオブジェクトを保存する。
【００３８】
フィンガープリントセット２１２は、重複排除処理に用いられる各ストライド又はフラグメントのフィンガープリントの集合である。フィンガープリントセット２１２は、例えば１以上のファイルの集合であってもよい。
【００３９】
フィンガープリントセット２１２は、フィンガープリントが一定量記録されると、コントローラ２０の送受信部２２からフラグメントサーバ３に送信される。
【００４０】
ディスク選択インデックスファイル２１３は、フラグメントの保存先となるフラグメントサーバの集合を示す。ディスク選択インデックスファイル２１３は、参照ハッシュ値と前記参照ハッシュ値に対応して決定される保存先識別情報とを関係付けている。制御部２５は、フィンガープリント計算部２０３により計算されたフィンガープリントに基づいて定まる値をキーとして、ディスク選択インデックスファイル２１３を参照することにより、各フラグメントの保存先を決定する。フィンガープリントからディスク選択インデックスファイル２１３を参照するためのキー情報の算出は、例えばハッシュ関数などを用いて行われてもよい。
【００４１】
ディスク選択インデックスファイル２１３を用いたフラグメントの保存先の決定については、図４を用いて後述する。なお、ディスク選択インデックスファイル２１３は、ファイル形式で保存されていなくてもよい。
【００４２】
フラグメントサーバ３は、コントローラ３０、記憶部３１を含む。
【００４３】
コントローラ３０は、送受信部３２、プロセッサ３３、メモリ３４、制御部３５を含む。
【００４４】
送受信部３２は、フロントエンドサーバ２と、例えばコマンド、アドレス、データ、情報、指示、信号などの送受信を行う。
【００４５】
プロセッサ３３は、送受信部３２及び制御部３５からの指示に基づき、制御処理及び演算処理を実行する。プロセッサ３３としては、プロセッサ２３と同様に、例えばＣＰＵ、ＭＰＵ、又は、ＤＳＰなどが利用される。
【００４６】
メモリ３４は、主記憶装置であり、プロセッサ３３からの制御に従う。メモリ３４には、プロセッサ３３の制御に基づいて、送受信部３２により送受信されるデータ又は制御部３５により生成されたデータなどが一時的に格納される。
【００４７】
制御部３５は、重複排除処理部３０１を含む。
【００４８】
重複排除処理部３０１は、フィンガープリントセット３１１を用い、フラグメント記憶部３１２に保存されたフラグメントのうち重複する部分を探索し、重複排除を行う。
【００４９】
また、重複排除はストライド単位で行われるため、フロントエンドサーバ２は、例えば重複部分の起点がストライドの途中に存在する場合は、ストライドの起点と重複部分の起点を一致させるために、重複部分の起点でストライドを分割することによりストライドを再配置する。このように、重複排除のためにストライドを再配置する必要が生じた場合は、重複排除処理部３０１は、ストライドの再配置の指示をフロントエンドサーバ２に送信する。重複排除処理の詳細については後述する。
【００５０】
記憶部３１は、フィンガープリントセット３１１、フラグメント記憶部３１２、重複位置情報３１３を含む。以下、本実施形態では、記憶部３１をディスクとする。しかしながら、記憶部３１をディスクとすることは、記憶部３１がディスクに限定されることを意味しない。記憶部３１としては様々な不揮発性メモリを用いることができる。
【００５１】
フィンガープリントセット３１１は、フロントエンドサーバ２より、フラグメントサーバ３のコントローラ３０の送受信部３２を経由して、記憶部３１に受信され、記憶部３１に保存される。フィンガープリントセット３１１は、重複排除の際に参照される。
【００５２】
フラグメント記憶部３１２は、フロントエンドサーバ２より、フラグメントサーバ３のコントローラ３０の送受信部３２を経由して、記憶部３１に受信されたフラグメントを保存する。
【００５３】
重複位置情報３１３は、保存対象のオブジェクトにおける重複データの存在を示す情報、例えば重複データが存在する場合に、フロントエンドサーバ２がストライド再配置を実行する際に参照する重複データの位置を含む。より具体的には、重複位置情報３１３は、重複排除処理部３０１が重複検出を行った結果、１ストライド分の重複データがあると判断された重複データの起点を含む。制御部３５は、重複位置情報３１３が一定量保存されると、送受信部３２を通じてフロントエンドサーバ２へ送信する。
【００５４】
重複排除処理の詳細については、後述する。
【００５５】
図２は、本実施形態に係る情報処理システム１の構成を例示する概念図である。
【００５６】
情報処理システム１は、複数のフロントエンドサーバ２と複数のフラグメントサーバ３とを含む。フロントエンドサーバ２を増設することにより、ユーザＵの使用する端末１１及びフラグメントサーバ３から受信したデータの処理能力が向上する、すなわち情報処理システム１全体としての処理能力が向上する。
【００５７】
ユーザＵの端末１１又は端末１１のアプリケーションは、複数のフロントエンドサーバ２のうちのいずれかのフロントエンドサーバに例えばＲＥＳＴ ＡＰＩに基づいてオブジェクトＯＢを送る。オブジェクトは、例えばファイルでもよい。
【００５８】
本実施形態において、フラグメントサーバ３は、消失符号化後にストライドから生成されるフラグメント数以上の台数で構成される。また、フラグメントサーバ３を増設することにより、オブジェクトＯＢの最終的な保存先が増える、すなわち情報処理システム１全体としての保存容量が増加する。
【００５９】
まず、フロントエンドサーバ２は、オブジェクトＯＢを複数のストライドＳＴに分割する。次に、フロントエンドサーバ２は、各ストライドＳＴに対して消失符号による符号化を行い、複数のフラグメントを生成する。複数のフラグメントは、情報シンボル部ＩＳとパリティシンボル部ＰＳとを含む。この図２では、１つのストライドから、４つのフラグメントを含む情報シンボル部ＩＳと、２つのフラグメントを含むパリティシンボル部ＰＳとが生成される。情報シンボル部ＩＳに含まれるフラグメントの数と、パリティシンボル部ＰＳに含まれるフラグメントの数とは、１以上で変更可能である。
【００６０】
フロントエンドサーバ２は、生成された各フラグメントの保存先のフラグメントサーバ３を、ディスク選択インデックスファイル２１３に基づいて選択し、選択結果に応じて各フラグメントを例えばＫＶＳ ＡＰＩに基づいて保存先のフラグメントサーバ３に送る。
【００６１】
図３は、オブジェクトＯＢとフラグメントサーバ３のディスク３１との関係の一例を示す概念図である。図３では、オブジェクトＯＢから複数のストライドＳＴへの分割は省略している。
【００６２】
オブジェクトＯＢは、分割され、消失符号を用いて符号化される。符号化された結果、ｋ個の情報シンボル部ＩＳと、ｍ個のパリティシンボル部ＰＳのフラグメントが生成される。
【００６３】
個々のフラグメントは、ｋ＋ｍ個の異なるフラグメントサーバ３のディスク３１へ保存される。このようにして保存されたデータは、ｍ個までの任意のフラグメントを喪失しても元データであるオブジェクトＯＢを復元できる。
【００６４】
この図３は、ｋ＝６、ｍ＝３とした場合を例示している。この場合は、フラグメントをそれぞれ９台以上の異なるフラグメントサーバ３のディスク３１へ保存する。そして、任意の３個のフラグメントの喪失、例えば３台のフラグメントサーバ３の故障まで許容される。
【００６５】
なお、消失符号化後の保存容量の増加率Ｒ（％）は、Ｒ＝（ｍ／ｋ）×１００で求められる。図３の例では、保存容量の増加率Ｒは５０％である。
【００６６】
図４は、ディスク選択インデックスファイル２１３を例示する図である。
【００６７】
ディスク選択インデックスファイル２１３は、フラグメントの保存先となるフラグメントサーバ３の集合を示す。各フラグメントサーバ３のディスク３１には、各ディスク３１を識別する固有のＩＤ（以下、ディスクＩＤとする）が付与される。フラグメントの保存先となるフラグメントサーバ３の集合は、ディスクＩＤの集合で表され、その集合ごとに固有のＩＤ（以下、ディスクセットＩＤとする）が付与される。
【００６８】
ディスク選択インデックスファイル２１３は、フラグメントサーバ３の追加又は削除の際に事前に計算される。各フロントエンドサーバ２は、ディスク選択インデックスファイル２１３を保持する。
【００６９】
例えば、ディスク選択インデックスファイル２１３におけるそのディスクＩＤの出現確率は各フラグメントサーバ３のデータ記憶容量に比例する。例えばディスクＩＤ＝ｘのフラグメントサーバ３のデータ記憶容量が１ＴＢ、ディスクＩＤ＝ｙのフラグメントサーバ３のデータ記憶容量が２ＴＢである場合、ｙの出現確率はｘの２倍となる。また、ディスク選択インデックスファイル２１３において、各ディスクＩＤは、この出現確率を満たした上でランダムに分布している。ただし、各フラグメントは必ず異なるディスクへ保存されるため、同一の列には必ず異なるディスクＩＤが現れ、同じディスクＩＤは同じ列に２以上含まれない。
【００７０】
ディスク選択インデックスファイル２１３をあるディスクセットＩＤ（ｚとする）に基づいて参照する、といった場合、ディスク選択インデックスファイル２１３のｚ列の集合値が返却される。この集合をディスクセットと呼ぶ。前述のとおり、ディスクセットには複数のディスクＩＤが含まれるが、１つのディスクセット上でディスクＩＤが重複することはない。例えば、ディスクセットＩＤ＝３の保存先は[０,３,８,６,７,４, ... ]となる。
【００７１】
フロントエンドサーバ２は、保存したいデータ（具体的にはあるストライドから生成されたフラグメントの集合）に対してディスクセットＩＤを決定し、決定されたディスクセットＩＤに基づいてディスク選択インデックスファイル２１３を参照し、ディスクセットＩＤに対応するディスクＩＤに従ってデータを保存する。これにより、各フラグメントを必ず異なるフラグメントサーバ３へ保存できる。また、ディスクＩＤの出現確率はフラグメントサーバ３のデータ記憶容量に比例している。このため、データ記憶容量の異なるフラグメントサーバ３があっても、フラグメントサーバ３のデータ記憶容量に従ってフラグメントが適度な分布で保存される。
【００７２】
図５は、重複排除方法の第１乃至第３の方式を例示する図である。同じ符号を付したデータ内容は、同じであるとする。
【００７３】
オブジェクトＯ１とオブジェクトＯ２は、先頭のデータ内容Ａ、及び中間のデータ内容Ｂは同一であるものの、末尾のデータ内容がＣとＺとで異なっている。オブジェクトＯ３は、オブジェクトＯ２に対して、先頭にデータ内容Ｙが挿入され、またデータ内容Ａとデータ内容Ｂの間にＸが挿入され、データ内容Ｚが削除された点で異なっている。
【００７４】
オブジェクトストレージにおける重複排除には、例えば第１乃至第３の方式が考えられる。
【００７５】
第１の方式は、オブジェクト（例えばファイル）単位での重複排除である。しかしながら、第１の方式はある２つのオブジェクトにおいて、例えば１ビットの差異があっただけで重複排除を行うことができなくなり、重複排除の効率は高くない。
【００７６】
図５では、オブジェクトＯ１とオブジェクトＯ２は、重複するデータ内容Ａ，Ｂを含むが、互いに重複しないデータ内容Ｃ，Ｚを含むため、不一致である。また、オブジェクトＯ２とオブジェクトＯ３は、重複するデータ内容Ａ，Ｂを含むが、オブジェクトＯ２はオブジェクトＯ３が含まないデータ内容Ｚを含み、オブジェクトＯ３はオブジェクトＯ２が含まないデータ内容Ｙ，Ｘを含むため、不一致である。したがって、第１の方式において、オブジェクトＯ１〜Ｏ３の間で重複排除は実行されない。
【００７７】
第２の方式は、重複排除を行う固定長でオブジェクトを分割し、その固定長単位で重複排除を行う方式である（以下、固定位置による重複排除と呼ぶ）。この第２の方式では、複数のオブジェクトにおける同じ位置に現れる固定長単位の重複は排除できる。しかしながら、挿入などにより同じデータ内容が複数のオブジェクトの異なる位置にある場合にはこの同じデータ内容の重複を排除することはできない。例えば、第２の方式では、前述の１ビットの差異がある部分には重複排除が適用されないが、同じ位置に固定長単位で同じデータ内容があれば、この同じ位置で同じデータ内容の重複排除が行われる。図５の第２の方式では、オブジェクトＯ１とオブジェクトＯ２との間で、データ内容Ａとデータ内容Ｂとは、位置と値が一致するため重複排除可能である。オブジェクトＯ２とオブジェクトＯ３との間で、データ内容Ａ，Ｂは同じ値であるが、位置が異なる。このため、オブジェクトＯ２とオブジェクトＯ３との間で、固定長単位でデータ内容は不一致となり、重複排除されない。第２の方式は、第１の方式に対してより多くの重複排除が行える。しかしながら、この第２の方式は、例えばあるファイルの先頭に１バイトのデータが挿入された場合に、重複排除されない。
【００７８】
第３の方式は、重複部分の検出位置を固定せず、自由位置で重複排除を行う方式である。（以下、自由位置による重複排除と呼ぶ）。この第３の方式では、たとえオブジェクトにおける位置が異なっていても固定長単位でデータ内容が同じであれば重複する部分を排除できる。図５の第３の方式では、オブジェクトＯ１とオブジェクトＯ２との間で、データ内容Ａ及びデータ内容Ｂの重複排除が可能である。オブジェクトＯ２とオブジェクトＯ３との間で、位置が異なるが一致するデータ内容Ａ，Ｂの重複排除が可能である。第３の方式では、例えば前述のように１バイトのデータが挿入された場合でも、その１バイトのデータのみが重複排除の対象にならず、残りの部分は重複排除の対象となり、高い重複排除効果が得られる。
【００７９】
第３の方式では、オブジェクト間で一致か否かを判断する単位である固定長にも依存するが、ファイル全体に対する重複排除である第１の方式と比較して１５％から２０％程度のデータ量を削減可能である。
【００８０】
本実施形態に係る情報処理システム１では、オブジェクト単位で重複排除を行う第１の方式、固定長で同じデータ内容がオブジェクトにおける同じ位置に配置されている場合に重複排除を行う第２の方式、オブジェクトにおける位置が同じであっても異なる場合であっても固定長で同じデータ内容を重複排除する第３の方式を併用可能である。
【００８１】
なお、以下では重複を排除するために一致か否かを判断する固定長（重複排除単位）をストライド長と呼ぶ。図５において、データ内容Ａ，Ｂ，Ｃ，Ｚのバイト長は、ストライド長である。
【００８２】
図６は、通常のハッシュ計算とローリングハッシュ計算との比較結果を例示する図である。
【００８３】
本実施形態において、例えば、フィンガープリントの計算には、ローリングハッシュと呼ばれる方法を用いる。ローリングハッシュは、通常のハッシュ計算と比べて、計算量を低減することができる。しかしながら、ローリングハッシュに代えて、データ内容が一致しているか否か判断可能な他の方法を用いてもよい。
【００８４】
通常のハッシュ関数Ｈで固定位置の重複排除を行う場合は、ストライド毎のフィンガープリントを計算すればよく、例えばハッシュ関数Ｈにストライドの文字列を引数として渡し、計算させる。この場合の計算量は、文字列の長さをｎ（ｎは整数）とすると、Ｏ（ｎ）である。
【００８５】
しかしながら、通常のハッシュ関数Ｈで自由位置の重複排除を行う際には、重複排除を行う文字列の箇所を、例えば１バイト（１文字）ずつずらしながら探索を行うため、文字列長ｎの全ての位置でハッシュ関数Ｈにより計算を行うと、計算量はＯ（ｎ２）となる。
【００８６】
これに対し、ローリングハッシュ関数Ｒｕは、ある長さＬについてのハッシュ値（フィンガープリント）に対して、例えば１バイト付加した値及び１バイト削除した値を計算することができる関数である。このローリングハッシュ関数Ｒｕを用いることにより、最初の文字列のハッシュ値の計算より後の１回あたりのハッシュ値の計算量をＯ（１）に低減することができる。
【００８７】
図６では、例えば、文字列長ｎの文字列「ＡＢＣＤＥＦＧＨ…」に対し、Ｌ＝５の文字列のフィンガープリントを計算する場合を例示する。
【００８８】
図６において、Ｓｔを内部状態、Ｃｔをハッシュ値とする（ｔは整数）。通常のハッシュ関数Ｈ、ローリングハッシュ関数Ｒｕは、それぞれハッシュ計算結果として、（Ｓｔ，Ｃｔ）の組み合わせを出力する。
【００８９】
通常のハッシュ関数Ｈを用いる場合、最初の文字列「ＡＢＣＤＥ」に対する計算量はＯ（ｎ）である。１文字ずらして得られる全ての文字列の組み合わせで同じ計算量、すなわちＯ（ｎ）が必要であることから、全体で近似的にＯ（ｎ２）の計算量が必要となる。
【００９０】
これに対し、ローリングハッシュ関数Ｒｕを用いる場合は、最初の文字列「ＡＢＣＤＥ」に対しては、通常のハッシュ関数Ｈを用いるため、計算量はＯ（ｎ）である。しかしながら、次の文字列「ＢＣＤＥＦ」に対しては、ローリングハッシュ関数Ｒｕに対して、最初の計算で得られた内部状態Ｓ０と、最初の文字列に対しＡを除く旨の引数（-”Ａ”）、及びＦを追加する旨の引数（+”Ｆ”）を与えることにより、計算Ｏ（１）で計算可能である。残りの文字列に対しても同様にＯ（１）の計算量となるため、全体では近似的にＯ（ｎ）となり、ハッシュ関数Ｈのみを用いた場合に比べ、計算量を大幅に低減することができる。
【００９１】
なお、上記で示した全体での計算量は、文字列の長さｎが文字列Ｌの長さに対して十分に長い場合の収束値である。
【００９２】
以下、図７及び図８を用いて、具体的にフラグメントの保存処理を説明する。
【００９３】
図７は、フラグメント保存処理を例示するフローチャートである。
【００９４】
図８は、フラグメント保存処理を例示する概念図である。図８に付した番号は、図７の各ステップに付した番号と対応する。
【００９５】
まず、保存する各オブジェクトには、ユーザＵ又は端末１１のアプリケーションが識別子を与える。これをオブジェクトＩＤと呼ぶ。オブジェクトＩＤは、例えば従来のファイルシステムにおけるファイル名の役割を持つ。
【００９６】
ステップＳ７０１において、フロントエンドサーバ２は、ユーザＵの端末１１又は端末１１のアプリケーションからオブジェクトＯＢの保存要求を受けると、送受信部２２を経由して、オブジェクト記憶部２１１にオブジェクトＯＢを格納する。
【００９７】
なお、送受信部２２を経由して受信したオブジェクトＯＢが直接メモリ２４に格納される場合は、オブジェクトＯＢはオブジェクト記憶部２１１に保存されなくてもよい。
【００９８】
ステップＳ７０２において、オブジェクト分割部２０１は、オブジェクトＯＢをメモリ２４に読み出し、ストライドＳＴに分割する。この際、オブジェクトＯＢのサイズがストライドＳＴのサイズの整数倍でない場合は、オブジェクトＯＢに対しストライドＳＴの整数倍と等しいサイズまでパディングする。図８（Ｓ７０２）の例では、オブジェクト分割部２０１は、オブジェクトＯＢのサイズがストライドのサイズの３倍となるようにパディングが行われ、ストライドＡ，Ｂ，Ｃに分割される。
【００９９】
ステップＳ７０３において、消失符号計算部２０２は、各ストライドＡ，Ｂ，Ｃに対して消失符号による符号化を行い、情報シンボル部ＩＳとパリティシンボル部ＰＳに含まれるそれぞれのフラグメントを生成する。図８（Ｓ７０３）の例では、消失符号のパラメータはｋ＝４、ｍ＝２であるとする。消失符号計算部２０２がストライドＡに対して符号化を行った結果、情報シンボル部ＩＳとして４つのフラグメントＡ１，Ａ２，Ａ３，Ａ４、パリティシンボル部ＰＳとして２つのフラグメントＡ５，Ａ６が生成される。ストライドＢ及びＣについても、情報シンボル部ＩＳとして４つのフラグメントが生成され、パリティシンボル部ＰＳとして２つのフラグメントが生成される。
【０１００】
ステップＳ７０４において、フィンガープリント計算部２０３は、各ストライドＡ，Ｂ，Ｃに対してローリングハッシュを用いてフィンガープリントを計算する。計算されたフィンガープリントは、フィンガープリントセット２１２に格納される。図８（Ｓ７０４）の例では、フロントエンドサーバ２が各ストライドＡ，Ｂ，Ｃに対してローリングハッシュを用いてフィンガープリントを計算した結果、それぞれフィンガープリントＦＰ＿Ａ，ＦＰ＿Ｂ，ＦＰ＿Ｃが生成される。
【０１０１】
ステップＳ７０５において、制御部２５は、各ストライドＡ，Ｂ，Ｃに対するフィンガープリントＦＰ＿Ａ，ＦＰ＿Ｂ，ＦＰ＿Ｃを用いてディスク選択インデックスファイル２１３を参照し、各フラグメントの保存先のフラグメントサーバ３を決定する。各ストライドＡ，Ｂ，Ｃに対するフィンガープリントＦＰ＿Ａ，ＦＰ＿Ｂ，ＦＰ＿Ｃにより保存先のフラグメントサーバ３が決まるため、同一の内容を持つストライドＳＴは必ず同一のフラグメントサーバ３に保存される。図８（Ｓ７０５）の例では、ＦＰ＿Ａの値よりディスクセットＩＤ＝２が決定され、図４に示されるディスク選択インデックスファイル２１３を参照することにより、ストライドＡに属するフラグメントの保存先の配列が[６,１,０,９,３,７]と決定される。配列[６,１,０,９,３,７]のそれぞれの要素は、フラグメントＡ１〜Ａ６に対応する保存先のフラグメントサーバ３の番号を示す。ストライドＢ及びＣについても同様にフラグメントの保存先が決定される。
【０１０２】
ステップＳ７０６において、制御部２５は、送受信部２２を通じて、各フラグメントを保存先のフラグメントサーバ３に送信する。図８（Ｓ７０６）の例において、ステップＳ７０５で参照されたディスク選択インデックスファイル２１３の内容に沿って、各フラグメントがフラグメントサーバ３へ保存される。例えば、ストライドＡに属するフラグメントＡ１〜Ａ６であれば、フラグメントＡ１がフラグメントサーバＫ６に、フラグメントＡ２がフラグメントサーバＫ１に、フラグメントＡ３がフラグメントサーバＫ０に、フラグメントＡ４がフラグメントサーバＫ９に、フラグメントＡ５がフラグメントサーバＫ３に、フラグメントＡ６がフラグメントサーバＫ７に保存される。ストライドＢ及びＣについても同様に各フラグメントが保存先のフラグメントサーバ３へ保存される。
【０１０３】
なお、各フラグメントを保存する際、各フラグメントと共にメタデータを保存する。本実施形態では、メタデータの一例として、保存対象のフラグメントを先頭とする１ストライド分のフィンガープリントと、ローリングハッシュを用いて計算した際に得られる内部状態とを保存する（これを、ロールサム状態（roll sum state）とする）。また、重複排除処理が行われたかどうかを示すフラグを保存する（これを、参照カウンタ値とする）。例えば、参照カウンタ値の初期値は１であり、重複排除のために参照されるたびに数値が増加してもよい。メタデータの詳細については表１乃至表５にて後述する。
【０１０４】
以下表１乃至表５を用いて、各フラグメントに付すメタデータについて説明する。
【０１０５】
表１は、本実施形態で用いるメタデータを例示する表である。
【表１】
2017097437.tif 000003
【０１０６】
フラグメントをフラグメントサーバ３へ保存する際、オブジェクトＯＢ全体の構成情報及び各ストライドＳＴの構成情報など、様々な付随情報が必要となる。この付随情報をメタデータと呼ぶ。メタデータは、オブジェクトＯＢの保存時にフラグメントサーバ３に保存される。
【０１０７】
なお、表１で例示する各メタデータは、例えばキー・バリュー構成をとる。キー・バリュー構成とは、データがキー情報と値の組み合わせで保存されており、キー情報を指定することで値を読み出せる構成である。
【０１０８】
各メタデータ値には、メタデータを参照するためのキー情報が与えられるが、異なるメタデータ値に対して同一のキーが使用される場合がある。そのため、各メタデータにはキー・プレフィックスが割り当てられ、保存時の実キーにはこのキー・プレフィックスとキー情報を結合した値が使用される。
【０１０９】
表１中の「複製可能？」欄はそのメタデータが複製されて保存されるか否かを示している。フラグメントそのものに関するメタデータは複製されず、他のメタデータについては複製される。
【０１１０】
各キー及びメタデータの概要は以下のとおりである。
【０１１１】
本実施形態において、オブジェクトＯＢには、オブジェクトＩＤに加えて、内部の識別子が与えられる。この内容の識別子をカウンタと呼ぶ。例えば、カウンタは、符号なし６４ビットの単調増加する値とする。本実施形態において、カウンタは、例えば、第１の情報、第２の情報、フロントエンドサーバＩＤを含む。
【０１１２】
第１の情報は、対応するオブジェクトＯＢが内部的に割り当てられた際の第１の時刻における秒の部分を示す。
【０１１３】
第２の情報は、第１の時刻と第２の時刻との差をマイクロ秒で表した時刻の値を所定の値（例えば２５）で割った値である。
【０１１４】
フロントエンドサーバＩＤは、各フロントエンドサーバ２に割り当てられる固有の識別子である。カウンタにこのフロントエンドサーバＩＤが含まれることで、例えば同一の時刻に異なるフロントエンドサーバ２でカウンタが割り当てられたとしても、このカウンタの値は異なることが保証される。
【０１１５】
また、ユーザＵ又は端末１１のアプリケーションが異なるオブジェクトに同じオブジェクトＩＤを与えて保存する場合であっても、カウンタの値は異なることが保証される。
【０１１６】
本実施形態において、各フロントエンドサーバ２で管理されている時刻は、同期されていると仮定する。この場合、カウンタを比較することで、複数のオブジェクトＯＢ又はオブジェクトＯＢに関連する複数のメタデータのいずれが新しいかを比較することが可能である。
【０１１７】
オブジェクト・メタ・カウンタは、キー情報に使用されているオブジェクトＩＤを持つオブジェクトのカウンタのリストであり、最大のカウンタが最新のオブジェクトとなる。オブジェクト・メタデータは、オブジェクトのメタデータの集合であり、一例を後述の表２に示す。ストライド・メタデータは、各ストライドに関するメタデータの集合であり、一例を後述の表３に示す。ストライドＩＤは、そのオブジェクトで何番目のストライドかを示す番号である。フラグメント・メタデータは、各フラグメントに関するメタデータであり、一例を後述の表４に示す。フラグメント位置情報は、フラグメントの位置によりフラグメントの実体を特定するためのメタデータであり、カウンタ、外部ストライドＩＤ（後述）、フラグメントＩＤにより定まる。参照カウント値は、フラグメント参照数であり、重複排除されている場合には２以上の値を持つ。誤り訂正符号は、例えばCyclic Redundancy Check（ＣＲＣ）などの誤り検出に用いられる符号である。ピボットは、ドライブ側で探索された想定重複位置であり、内部ストライドＩＤ、オフセット、ピボット長の３つの組で表現される。ピボットの詳細については、後述する。
【０１１８】
同じ誤り訂正符号を持つフラグメントＩＤの集合は、比較前（ＮＣ：not compared)の集合と比較後（ＣＣ：compared）の集合の２種類の集合に分類されて保存される。フロントエンドサーバ２による保存時には比較前の集合として保存される。
【０１１９】
表２は、オブジェクト・メタデータの内容を例示する表である。
【表２】
2017097437.tif 000004
【０１２０】
表３は、ストライド・メタデータの内容を例示する表である。
【表３】
2017097437.tif 000005
【０１２１】
表４は、フラグメント・メタデータの内容を例示する表である。
【表４】
2017097437.tif 000006
【０１２２】
また、各メタデータの保存先については、メタデータが複製される場合にはディスクセットＩＤを求める必要があり、メタデータが複製されない場合にはディスクＩＤを求める必要がある。
【０１２３】
表５は、メタデータとメタデータの保存先との関係を例示する表である。
【表５】
2017097437.tif 000007
【０１２４】
表５のＨＲ（ｘ）は、ハッシュ関数Ｈ（引数ｘ）で求まる値を、ディスク選択インデックスファイル２１３の列数で割った余り値である。ディスクセットＩＤが得られる場合には、そのディスクセットの先頭からフラグメントＩＤ番目のディスクＩＤに対応するフラグメントサーバ３にメタデータが保存される。
【０１２５】
メタデータ間の関係を明らかにするために、ユーザＵの使用する端末１１がオブジェクトを読み出す際の手順を例に各メタデータの関係について述べる。
【０１２６】
図９は、オブジェクトＩＤ＝ｏ１であるオブジェクトの読み出し手順を例示するフローチャートである。
【０１２７】
ステップＳ９０１において、フロントエンドサーバ２は、オブジェクトＩＤであるｏ１をキー情報として、フラグメントサーバ３に保存されているオブジェクトカウンタを読み出す。オブジェクトカウンタの保存先のディスクセットＩＤは、ハッシュ関数ＨＲ（引数ｏ１）により求められる。
【０１２８】
ステップＳ９０２において、フロントエンドサーバ２は、得られたオブジェクトカウンタから、最大のカウンタを求め（この値をｃ１とする)、ｃ１をキーとしてオブジェクト・メタデータを読み出す。オブジェクト・メタデータの保存先のディスクセットＩＤは、ハッシュ関数ＨＲ（引数ｃ１）により求められる。
【０１２９】
ステップＳ９０３において、フロントエンドサーバ２は、得られたオブジェクト・メタデータに含まれるルートストライドディスクセットＩＤ（最初のストライド・メタデータが保存されているディスクセットＩＤ、表２参照）を得て、カウンタｃ１をキーとしてストライド・メタデータを読み出す。
【０１３０】
次に、フロントエンドサーバ２は、ストライド内のフラグメントを読み出す。
【０１３１】
ステップＳ９０４において、フロントエンドサーバ２は、ストライド・メタデータと同一のディスクセットＩＤを用いて、例えばｉ番目のフラグメント・メタデータを得る。
【０１３２】
ステップＳ９０５において、フロントエンドサーバ２は、フラグメント・メタデータに含むまれるフラグメントＩＤ（表４参照）を得て、フラグメント・メタデータと同一のディスクＩＤからフラグメント位置情報を読み出す。そして、フロントエンドサーバ２は、フラグメント位置情報に基づいて、フラグメントの内容を読み出す。
【０１３３】
ステップＳ９０６において、フロントエンドサーバ２は、すべてのフラグメントを読み出した後、ストライド・メタデータに含まれる次ストライドディスクセットＩＤ（次のストライドが含まれるディスクセットＩＤ、表３参照）を得て、次のストライド・メタデータを読み出す。
【０１３４】
ステップＳ９０７において、フロントエンドサーバ２は、次のストライドが存在する場合は、ステップＳ９０４に戻り、フラグメントの読み出し処理を繰り返す。最後のストライドを読み出した場合、フロントエンドサーバ２は、オブジェクトの読み出し処理を終了する。
【０１３５】
図１０は、重複するフラグメントの排除処理の具体例を示す図である。
【０１３６】
前述のように、フロントエンドサーバ２は、同じストライドに対して同じフィンガープリントを計算し、同じストライドから分割されたフラグメントを同じフラグメントサーバ３に保存する。また、同一の誤り訂正符号を持つフラグメントは同一の内容を持つフラグメントである可能性が高い。フラグメントサーバ３は、定期的にＮＣ（重複排除のための比較前のフラグメントＩＤの集合、表１参照）に含まれる同じ誤り訂正符号を持つフラグメントを比較し、同じ誤り訂正符号を持つフラグメントが同一の内容であれば重複排除を行う。フラグメントサーバ３は、同じ誤り訂正符号を持つフラグメントが同一の内容でなければ、比較されたフラグメントのフラグメントＩＤをＮＣからＣＣ（重複排除のための比較後のフラグメントＩＤの集合、表１参照）へと移動する。
【０１３７】
重複排除処理を行う場合、重複排除処理部３０１は、次の第１乃至第４の重複排除処理を実行する。なお、重複排除で残すフラグメントをfrag_o、重複排除で削除するフラグメントをfrag_nと表記する。
【０１３８】
第１の処理は、フラグメント・メタデータ内のフラグメントfrag_nのフラグメントＩＤを、フラグメントfrag_oのフラグメントＩＤに変更する処理である。
【０１３９】
第２の処理は、フラグメントfrag_oの参照カウント値をインクリメントする処理である。
【０１４０】
第３の処理は、同一の誤り訂正符号を持つフラグメントＩＤの比較前の集合から、フラグメントfrag_nのフラグメントＩＤを削除する処理である。
【０１４１】
第４の処理は、フラグメントfrag_nを削除する処理である。
【０１４２】
メタデータ１００１は、重複排除処理前のフラグメントfrag_oのメタデータである。メタデータ１００１におけるフラグメントfrag_oのオブジェクトＩＤをoid_o、ストライドＩＤをsi_o、フラグメントＩＤをfid_oとする。
【０１４３】
メタデータ１００２は、重複排除処理前のフラグメントfrag_nのメタデータである。メタデータ１００２におけるフラグメントfrag_nのオブジェクトＩＤをoid_n、ストライドＩＤをsi_n、フラグメントＩＤをfid_nとする。
【０１４４】
フロントエンドサーバ２によって保存される時点で、フラグメントfrag_nとフラグメントfrag_oが同一だったと仮定する。この場合、フラグメントfrag_oの誤り訂正符号crc_oとフラグメントfrag_nの誤り訂正符号crc_nは同一の値となる。従って、重複排除処理部３０１は、（ＣＣ，crc_o）をキーとして参照されるフラグメントＩＤfid_oと、（ＮＣ，crc_o）をキーとして参照されるフラグメントＩＤfid_nとを比較対象として決定する。
【０１４５】
次に、重複排除処理部３０１は、（ＢＫ，fid_o）、（ＢＫ，fid_n）を参照することで、フラグメントＩＤfid_o，fid_nそれぞれが示すフラグメントの実体として、フラグメントfrag_o，frag_nを取得し、重複排除処理を実行する。
【０１４６】
メタデータ１００３は重複排除処理後のfrag_oのメタデータである。メタデータ１００４は、重複排除処理後のfrag_nのメタデータである。重複排除処理部３０１は、メタデータ１００４において、フラグメントfrag_oとフラグメントfrag_nとが一致するため、フラグメントfrag_nを削除し、frag_nのフラグメント・メタデータにおいて、フラグメントＩＤfid_nをフラグメントＩＤfid_oに代える。すなわち、重複排除処理部３０１は、フラグメントfrag_nの実体を指し示す先をフラグメントfrag_oへ変更する。
【０１４７】
また、重複排除処理部３０１は、メタデータ１００３において、フラグメントfid_oの参照カウント値を２に変更し、メタデータ１００３に重複排除が行われたことを記録する。
【０１４８】
上述の処理によって、固定位置での重複排除を実現することができる。続いて、自由位置での重複排除の方法について述べる。
【０１４９】
図１１は、フィンガープリントセットを例示する図である。
【０１５０】
フロントエンドサーバ２は、ストライドＳＴの最初のフラグメントを１／２ずつに分割して得られる前半部分のフィンガープリント及び後半部分のフィンガープリントを計算する。フロントエンドサーバ２は、最初のフラグメントに含まれる前半部分及び後半部分の２種類のフィンガープリントと、ストライドＳＴのフィンガープリントを保存する。この集合をフィンガープリントセットと呼ぶ。
【０１５１】
図１１の例では、ストライドＡについてフロントエンドサーバ２が保持するフィンガープリントセット２１２には、フラグメントＡ１の前半部分のフィンガープリントＦＰ＿ａ１、フラグメントＡ１の後半部分のフィンガープリントＦＰ＿ａ２、ストライドＡ全体のフィンガープリントＦＰ＿Ａが含まれる。なお、ストライドＢ及びストライドＣについても同様である。以下では、フラグメント長の半分の長さのフィンガープリントを、１／２フィンガープリントと呼ぶ。
【０１５２】
図１２は、フロントエンドサーバ２におけるフィンガープリントセットの保存形式と探索方法を例示する図である。
【０１５３】
フロントエンドサーバ２は、フィンガープリントセット２１２の保存量が一定量に達した場合、フィンガープリントセット２１２をフラグメントサーバ３へ送信する。フラグメントサーバ３は、受信したフィンガープリントセット２１２を、記憶部３１に保存する。フィンガープリントセット２１２及びフィンガープリントセット３１１の内容は、例えばブルームフィルタ（bloom filter）を用いることにより圧縮して保存されてもよい。ブルームフィルタが用いられる場合、フィンガープリントセットの内容は、１つのブルームフィルタにまとめられて保存される。
【０１５４】
ブルームフィルタは、ビット配列で表される確率的データ構造であり、要素が集合のメンバーに含まれるか否かを判定する際に有用である。例えば、文字列検索にブルームフィルタを適用する場合では、ある文字列Ｖがあらかじめ定められた文字列の集合Ｗに含まれる場合は真を返し、文字列Ｖが集合Ｗに含まれない場合は偽を返す。
【０１５５】
ブルームフィルタの具体的な計算方法は、まず複数の文字列の集合Ｗの全要素を、任意に定められたハッシュ関数を用いて１つのビット配列に変換する。次に、比較対象の文字列Ｖに対しても同じようにハッシュ関数を適用し、ビット配列を得る。そして、得られた文字列Ｖのビット配列と集合Ｗのビット配列とをビット単位で比較することにより、文字列の集合Ｗに比較対象の文字列Ｖが含まれるかどうかを判定する。具体的には、文字列Ｖのビット配列が１である位置に対応する集合Ｗのビット配列中に１つでも０が存在する場合は、文字列Ｖは文字列Ｗに含まれていないと判定される。
【０１５６】
本実施形態において、フィンガープリント計算部２０３は、図１１に示した各フィンガープリント値を計算する。各フィンガープリント値は、フィンガープリントの種類に応じて任意に決められた固定値を連結した値で、各ハッシュ値を計算することで得られる。得られたブルームフィルタには、カウンタが割り当てられ、ブルームフィルタはカウンタをキー情報として保存される（表１のＦＳに該当する）。
【０１５７】
また、フィンガープリントセットＦＰＳの探索を容易にするために、フィンガープリントセットＦＰＳに使用されたカウンタの集合を保存できるフィンガープリントセットリストＦＰＳＬが生成される。フィンガープリントセットリストＦＰＳＬの生成時には、カウンタが割り当てられ、カウンタをキー情報としてフィンガープリントセットリストＦＰＳＬが保存される（表１のＦＬに該当する）。フィンガープリントセットリストＦＰＳＬのカウンタが一定値以上となった場合には、新しいフィンガープリントセットリストが生成される。
【０１５８】
さらに、フィンガープリントセットリストＦＰＳＬで使用されているカウンタの集合を保持するために、フィンガープリントセットリストヘッドＦＰＳＬＨが生成される。フィンガープリントセットリストヘッドＦＰＳＬＨのキー情報は固定値として、システム全体で共有される。
【０１５９】
図１２に示すとおり、フィンガープリントセットリストＦＰＳＬ及びフィンガープリントセットＦＰＳの保存先のディスクセットＩＤは、例えばカウンタを引数としてハッシュ関数ＨＲで求める。また、フィンガープリントセットリストヘッドＦＰＳＬＨの保存先のディスクセットＩＤは、システム全体で共有される固定値である。
【０１６０】
フィンガープリントセットＦＰＳを探索するには、まずフィンガープリントセットリストヘッドＦＰＳＬＨを読み出し、フィンガープリントセットリストＦＰＳＬのカウンタのリストを得る。このカウンタから、フィンガープリントセットリストＦＰＳＬを読み出し、フィンガープリントセットＦＰＳのカウンタのリストを得る。そしてこのカウンタから、フィンガープリントセットＦＰＳを順に得ることができる。
【０１６１】
また、各フィンガープリントセットＦＰＳにはカウンタが与えられているため、本実施形態では、複数のフィンガープリントセットＦＰＳの間での生成順序をカウンタの値から判定することが可能である。
【０１６２】
以下、自由位置での重複排除処理の処理内容について述べる。
【０１６３】
自由位置での重複排除処理において、重複排除処理部３０１は、次の第１乃至第６の処理を実行する。
【０１６４】
第１の処理は、保存される第１のデータにおける第１の部分について、第１の部分的ハッシュ値を予め計算する処理である。また、第１のデータにおける第１の部分から始まる重複検出範囲に対応する第１のハッシュ値を予め計算する処理である。
【０１６５】
第２の処理は、第１のデータの後に記憶される第２のデータの第２の部分について、第２の部分的ハッシュ値を計算する処理である。
【０１６６】
第３の処理は、第１の部分的ハッシュ値と第２の部分的ハッシュ値とが一致するか判断する処理である。
【０１６７】
第４の処理は、第３の処理で第１の部分的ハッシュ値と第２の部分的ハッシュ値とが一致する場合、第１のデータにおける第１の部分から始まる重複検出範囲に対応する第１のハッシュ値を読み出すとともに、第２のデータにおける第２の部分から始まる重複検出範囲に対応する第２のハッシュ値を計算する処理である。
【０１６８】
第５の処理は、第１のハッシュ値と第２のハッシュ値とが一致するか判断する処理である。
【０１６９】
第６の処理は、第５の処理において第１のハッシュ値と第２のハッシュ値とが一致する場合、第２のデータにおける第２の部分から始まる重複検出範囲が、第１のデータにおける第１の部分から始まる重検出範囲と重複するため、重複を排除した状態でデータの保存を行うための処理である。
【０１７０】
以下、図１３乃至図１９を用いて、より具体的に自由位置での重複排除処理を説明する。
【０１７１】
図１３は、自由位置での重複排除処理を例示するフローチャートである。
【０１７２】
ステップＳ１３０１において、フロントエンドサーバ２は、フラグメントサーバ３に対し、フィンガープリントセット２１２を送信する。送信のタイミングは任意でよく、例えばフィンガープリントセット２１２のサイズが一定量に達した場合に送信するとしてもよい。また、すべてのフラグメントサーバ３に対し、同じフィンガープリントセットを送信するとしてもよい。
【０１７３】
ステップＳ１３０２において、フラグメントサーバ３は、フロントエンドサーバ２よりフィンガープリントセットを受信し、記憶部３１に保存する。
【０１７４】
ステップＳ１３０３において、フラグメントサーバ３の重複排除処理部３０１は、記憶部３１に保存したフィンガープリントセット３１１の内容を読み込み、一時的に保存する。
【０１７５】
重複排除処理部３０１は、フラグメント記憶部３１２に保存されたフラグメントの先頭からフラグメントの１／２の長さで１バイトずつずらしながら、１／２フィンガープリントを計算する。１／２フィンガープリントの計算には、図６で示したローリングハッシュを適用してもよい。なお、フロントエンドサーバ２が複数存在する場合は、フラグメント記憶部３１２に保存されたフラグメントは、どのフロントエンドサーバ２から受信したものであってもよい。
【０１７６】
ステップＳ１３０４において、重複排除処理部３０１は、ステップＳ１３０３において計算されたフィンガープリントと、読み込んだフィンガープリントセットに保存されているフラグメントの前半又は後半部分の１／２フィンガープリントとを比較する。すなわち重複排除処理部３０１は、第１の重複探索を行う。読み込むフィンガープリントセットは複数でもよい。
【０１７７】
１／２フィンガープリントが一致しない場合、処理はステップＳ１３０４に戻り、１／２フィンガープリントが一致するまで、順次１バイトずつずらしながら１／２フィンガープリントの計算と比較とが行われる。
【０１７８】
１／２フィンガープリントが一致する場合、ステップＳ１３０５において、重複排除処理部３０１は、１／２フィンガープリントの一致位置から１ストライド分のフラグメントのうち、先頭のフラグメントと最後のフラグメントを自機の又は他のフラグメントサーバから読み出し、一致した位置から１ストライド分のフィンガープリントを計算する。フラグメントの読み出し処理の詳細については、図１４で後述する。
【０１７９】
１ストライド分のフィンガープリントの計算には、例えば図６で示したローリングハッシュを適用してもよい。ローリングハッシュでは、あるフラグメントの先頭よりｎバイトずれた位置から１ストライド分のフィンガープリントを計算する場合、そのフラグメントを先頭とした１ストライド分のローリングハッシュ計算の内部状態と、計算対象となるストライドの先頭と最後を含む２つのフラグメントの内容が分かればよく、その間のフラグメントは計算には不要である。具体的には、重複排除処理部３０１は、フラグメント・メタデータとして保存されているロールサム状態を初期値とし、図６に示したように１バイトずらしてフィンガープリントを計算する。これをｎ回繰り返すことにより、フラグメントの先頭からｎバイト離れた１ストライド分のフィンガープリントを計算できる。１バイトずつずらす際に、除く１バイトと加える１バイトは、前述の先頭と最後を含む２つのフラグメントより知ることができる。
【０１８０】
ステップＳ１３０６において、重複排除処理部３０１は、ステップＳ１３０５において計算された１ストライドのフィンガープリントと、読み込んだフィンガープリントセットに保存されている１ストライドのフィンガープリントとを比較する。すなわち重複排除処理部３０１は、第２の重複探索を行う。
【０１８１】
ストライド単位でのフィンガープリントが一致した場合、一致した場所をピボットと呼ぶ。ピボットは、前述のとおり、内部ストライドＩＤ、オフセット、ピボット長を含む値で表される。オフセットはその一致位置がそのストライドの何バイト目かを表している。ピボット長は、ピボットが連続している場合の長さを示している。内部ストライドＩＤは、ピボットでオブジェクトを再分割した際に、何番目のストライドに属するかを示す番号である。内部ストライドについての詳細は、後述する。
【０１８２】
ステップＳ１３０７において、重複排除処理部３０１は、得られたピボットを重複位置情報３１３へ保存する。
【０１８３】
ストライド単位でのフィンガープリントが一致しない場合、処理はステップＳ１３０４に戻る。
【０１８４】
ステップＳ１３０８において、フラグメントサーバ３は、重複位置情報３１３に保存されたピボットが一定量になっているものについて、フロントエンドサーバ２へと送信する。送信のタイミングは、例えばピボットを重複位置情報３１３に保存するタイミングであってもよい。
【０１８５】
ステップＳ１３０９において、フロントエンドサーバ２は、ピボットのリストを受信すると、ピボット位置が開始ストライドの先頭となるようにストライドを再配置する。再配置処理の詳細は、図１８及び図１９で後述する。
【０１８６】
図１４は、フラグメントの第１の読み出し処理を例示する図である。
【０１８７】
図１５は、フラグメントの第２の読み出し処理を例示する図である。
【０１８８】
前述のように、重複排除処理部３０１で計算した１／２フィンガープリントと、フィンガープリントセットに保存されている１／２フィンガープリントが一致した場合、重複排除処理部３０１は、一致位置から１ストライド分のフラグメントのうち先頭と最後のフラグメントを読み出し、読み出された先頭と最後のフラグメントに基づいて一致位置から１ストライド分のフィンガープリントを計算する。そして、重複排除処理部３０１は、計算結果とフィンガープリントセットに保存されている１ストライドのフィンガープリントとを比較する。
【０１８９】
ここで、フィンガープリントセットに保存されている１／２フィンガープリントのうち、フラグメントの前半部分の１／２フィンガープリントと一致したか、フラグメントの後半部分の１／２フィンガープリントと一致したかによって、１ストライド分のフィンガープリントを計算する際に読み出すフラグメントが異なる場合がある。
【０１９０】
図１４は、前半部分の１／２フィンガープリントと一致した場合の読み出し処理を例示する。図１４の上段はフラグメントサーバ３に保存されているフラグメントを表し、図１４の下段はフィンガープリントセットに保存されているフィンガープリント（図１１に対応）を表す。
【０１９１】
図１４では、重複排除処理部３０１によって探索中の１／２フラグメント１４０１のフィンガープリントとＦＰ＿ａ１（フラグメントＡ１の前半部分の１／２フィンガープリント）が一致する。従って、重複排除処理部３０１は、次にＦＰ＿Ａ（ストライドＡのフィンガープリント）との一致を調べるため、フラグメントＡ１の先頭に相当する位置から１ストライド分のフィンガープリントを計算する。この際、フラグメントＡ１の先頭に相当する位置から１ストライド長のストライドの先頭を含むフラグメント（又は部分）と最後を含むフラグメント（又は部分）があればよい。ストライドの先頭を含むフラグメントについては、すでに重複排除処理部３０１の計算対象となっている１／２フラグメント１４０１の先頭と同じであるため、フラグメントの読み込みは不要である。従って、重複排除処理部３０１は、ストライドの最後を含むフラグメント１４０２を他のフラグメントサーバより読み出す。
【０１９２】
一方、図１５では、重複排除処理部３０１によって探索中の１／２フラグメント１４０３のフィンガープリントとＦＰ＿ａ２（フラグメントＡ１の後半部分の１／２フィンガープリント）が一致する。従って、重複排除処理部３０１は、次にＦＰ＿Ａ（ストライドＡのフィンガープリント）との一致を調べるため、フラグメントＡ１の先頭に相当する位置から１ストライド分のフィンガープリントを計算する。この際、フラグメントＡ１の先頭に相当する位置から１ストライド長のストライドの先頭を含むフラグメント（又は部分）と最後を含むフラグメント（又は部分）があればよい。従って、重複排除処理部３０１は、ストライドの先頭を含むフラグメント１４０４及びストライドの最後を含むフラグメント１４０５を他のフラグメントサーバより読み出す。
【０１９３】
図１６は、自由位置での重複排除処理の第１の例を示す図である。
【０１９４】
図１７は、自由位置での重複排除処理の第２の例を示す図である。この図１７は、図１６における重複の検出をより理解しやすく表現している。
【０１９５】
図１６及び図１７に付した番号は、図１３の各ステップに付した番号と対応する。
【０１９６】
図１６及び図１７の例では、フロントエンドサーバＰ１が、フラグメントサーバＫ１へ、フィンガープリントセット２１２を送信する。フラグメントサーバＫ１は、受信されたフィンガープリントセット２１２を、フィンガープリントセット３１１として記憶部３１に保存する。
【０１９７】
フラグメントサーバＫ１では、フラグメントＡ３が探索の対象となっているとする。フラグメントサーバＫ１の重複排除処理部３０１は、フラグメントＡ３に対して先頭から１／２フラグメント長のローリングハッシュを順に計算し、保持しているフィンガープリントセット３１１の前半又は後半部分のフラグメントのフィンガープリントと比較する。
【０１９８】
フラグメントサーバＫ１の重複排除処理部３０１は、フラグメントＡ３の先頭からｎバイト進んだところで同一の１／２フィンガープリントを発見した場合、１ストライド後のフラグメントであるフラグメントＢ３を他のフラグメントサーバＫ０から読み込む。
【０１９９】
フラグメントサーバＫ１の重複排除処理部３０１は、フラグメントＢ３とフラグメントＡ３のフラグメント・メタデータに保存されているロールサム状態を使用してフラグメントＡ３の先頭からｎバイト進んだ地点から始まる１ストライドのフィンガープリントを計算し、計算された１ストライドのフィンガープリントとフィンガープリントセット３１１のストライドフィンガープリントとを比較する。
【０２００】
ストライドフィンガープリント中に、計算された１ストライドのフィンガープリントと一致する部分がある場合、フラグメントサーバＫ１の重複排除処理部３０１は、このピボット位置を追加する。なお、ピボット位置は、具体的には、ストライドの先頭であるフラグメントＡ１からのバイト数であってもよい。
【０２０１】
フラグメントサーバＫ１の重複排除処理部３０１は、ピボット位置を重複位置情報３１３へ保存する。その後フラグメントサーバＫ１は、再配置するオブジェクトを特定するカウンタ値及び重複位置情報３１３をフロントエンドサーバＰ１へ送信する。
【０２０２】
図１８は、フロントエンドサーバ２によるオブジェクトの再配置の第１の例を示す図である。
【０２０３】
フロントエンドサーバ２は、フラグメントサーバ３より再配置するオブジェクトを特定するカウンタ値及び重複位置情報３１３を受信すると、カウンタ値からディスク選択インデックスファイル２１３を参照し、ピボットを保存するフラグメントサーバ３を特定する。さらに、フロントエンドサーバ２は、ストライドの再配置のため対象のオブジェクトを読み出す。この際、フロントエンドサーバ２は、フラグメントごとにすでに重複排除済であるかどうかを示す参照カウント値も読み出す。参照カウント値は、初期状態すなわち重複排除が行われていない状態では１であり、重複排除のための参照が行われる毎に１ずつ増加するものとする。
【０２０４】
フロントエンドサーバ２は、読み出したオブジェクトを各ピボットに合わせてストライドへと分割する。この時生成されるストライドは内部ストライドと呼ばれ、実際の保存単位のストライドは外部ストライドと呼ばれる。外部ストライドの長さは必ずストライド長、すなわちフラグメント長の整数倍に等しいが、内部ストライドはストライド長よりも短くてよい。また、内部ストライドに対して順に与えられる番号を、内部ストライドＩＤと呼ぶ。ただし、内部ストライドは、すでに重複排除されているフラグメント（参照カウント値が２以上）については移動させないように生成される。
【０２０５】
図１８の例では、フラグメントＡ３の途中にピボットがあると仮定する。まず、状態（１−１）では、すべてのフラグメントがまだ重複排除の対称となっていない、すなわち参照カウント値が１である。フラグメントＡ３のピボット位置から１ストライド分、すなわちフラグメントＢ３の途中までに重複部分が存在する可能性がある場合、状態（１−２）で示すように、ピボットの位置にストライドの境界が作られるように内部ストライドｉｓ１〜ｉｓ４が生成される。
【０２０６】
また、複数の内部ストライドが、ストライド長よりある程度短い場合には、これらをまとめて一つの外部ストライドとすることができる。このようなストライドを集合ストライドと呼ぶ。状態（１−３）では、内部ストライドｉｓ１と内部ストライドｉｓ４とを含む集合ストライドが例示されている。状態（１−３）における集合ストライドでは、フラグメントＣ４がパディングされている。集合ストライドでは、内部ストライドを組み合わせた後の残りのサイズに、さらに他の内部ストライドを挿入できるか、評価される。なお、内部ストライドｉｓ１、内部ストライドｉｓ４、及び集合ストライドに内部ストライドｉｓ１及び内部ストライドｉｓ４をまとめたことにより必要となるヘッダ、のそれぞれの長さの和がストライド長よりも短かった場合には、外部ストライドｏｓ１に対してパディングが行われる。
【０２０７】
フロントエンドサーバ２は、外部ストライドｏｓ１〜ｏｓ３に対して消失符号を計算し、外部ストライドｏｓ１〜ｏｓ３をフラグメント長に分割して保存する。このため、オブジェクトを読み出す際には、外部ストライドｏｓ１〜ｏｓ３が順に読み出される。
【０２０８】
ただし、オブジェクトを読み出す際には、外部ストライドｏｓ１〜ｏｓ３に含まれている内部ストライドｉｓ１〜ｉｓ４を、内部ストライドＩＤの順に並べる必要がある。そのため、集合ストライドを生成するために内部ストライドｉｓ１〜ｉｓ４の位置関係を変更する場合には、内部ストライドｉｓ１〜ｉｓ４の新たな位置が内部ストライドｉｓ１〜ｉｓ４のもとの位置に近いほど、読み出し効率が良くなる。
【０２０９】
図１９は、フロントエンドサーバ２によるオブジェクトの再配置の第２の例を示す図である。
【０２１０】
図１９の状態（２−１）では、フラグメントＣ１〜Ｃ４から構成されるストライドに対してすでに重複排除が適用されている。この場合、フラグメントＣ１〜Ｃ４の参照カウント値は２以上となる。パディングは、ピボットの位置にストライドの境界が位置するように行われる。状態（２−２）では、すでに重複が生じているフラグメントＣ１〜Ｃ４を移動することができないため、フラグメントＢ４の後にパディングデータが挿入されている。
【０２１１】
フロントエンドサーバ２は、この再配置されたストライドを保存する。この保存処理は最初にオブジェクトを保存する場合と同様であり、再帰的に各フラグメントサーバ３による重複排除処理が適用される。上記の手順により、自由位置の重複排除を実現することができる。
【０２１２】
以上説明した本実施形態に係る情報処理システム１では、各フラグメントサーバ３が重複位置の探索を分担して行う。これにより、データの記憶量が増加しても、フロントエンドサーバ２の負荷が増加しない。そのため、上述の重複排除方式は、記憶容量の増加に対してもパフォーマンスを落とすことなく実行可能である。
【０２１３】
本実施形態に係る情報処理システム１は、低価格・大容量・高信頼なストレージの実現を目標としており、以下のような特徴を持つ。
【０２１４】
本実施形態に係る情報処理システム１においては、記憶容量の増減はフラグメントサーバの追加又は削除により実現され、フロントエンドサーバ２の台数及び構成などへの依存は存在しない。そのため、ストレージ管理者は記憶容量の増減についてはフラグメントサーバ３の台数のみを管理すればよく、管理が容易である。
【０２１５】
本実施形態に係る情報処理システム１においては、システム全体の処理能力はフロントエンドサーバ２の台数に比例して向上する。そのため、例えばストレージ利用者の増加などで性能が不足した場合には、フロントエンドサーバ２を増設するだけでシステム全体の処理能力を向上させることができる。フロントエンドサーバ２はデータの最終的な保存場所ではなく、またフロントエンドサーバ２の台数及び構成は、フラグメントサーバ３の台数及び構成に影響しない。そのため、ストレージ管理者は性能についてはフロントエンドサーバ２の台数のみを管理すればよく、管理が容易である。
【０２１６】
本実施形態に係る情報処理システム１においては、固定位置による重複排除及び自由位置による重複排除を行う際、ストライド単位で重複排除を行う。すなわち、重複排除処理後であっても、重複排除処理前と同じく、１つのストライドから生成されたフラグメントは異なるディスクに保存される。その結果、重複排除処理後も消失符号の信頼性が維持されるため、耐障害性が確保される。
【０２１７】
本実施形態に係る情報処理システム１においては、フロントエンドサーバ２とフラグメントサーバ３は通常のＩＰネットワークで接続される。そのため、例えば繁忙期だけはフロントエンドサーバ２を社内クラウド上の仮想マシンなどで一時的に補うといった運用も容易となる。また、フラグメントサーバ３の追加又は削除を行う際には、ディスク選択インデックスファイル２１３をメンテナンスするだけでよいため、ユーザ所望の容量を得ることも容易である。すなわち、必要に応じてシステム構成の拡張又は縮小を行うことができるため、システム導入時に将来の処理量増加を考慮してあらかじめ大規模なシステムを導入する必要がなくなり、情報処理システムの導入コストを削減することができる。
【０２１８】
本実施形態に係る情報処理システム１において、例えば構成要素をフロントエンドサーバ２とフラグメントサーバ３との２種類とすることにより、容易に故障原因を分析することができる。
【０２１９】
また、ユーザによって保存されるデータは最終的にフラグメントサーバ３にのみ保存される。すなわち、データを保持する構成要素が１種類に限られるため、障害時の復旧及び分析を容易化することができる。
【０２２０】
本実施形態に係る情報処理システム１においては、信頼性の確保のため消失符号を利用する。従って、大規模ストレージに対して用いられるデータを複製することにより信頼性を確保する手法（例えば、ＲＡＩＤ（Redundant Arrays of Inexpensive Disks）１など）よりも、データの記憶効率を向上させることができる。
【０２２１】
本実施形態においては、例えばハッシュ値の比較によりデータの一致又は不一致を判断している。しかしながら、効率的に処理可能であれば、他の手法によりデータの一致又は不一致を判断してもよい。例えば、ハッシュ値に代えて、データの一致又は不一致を判断するための他の情報を用いてもよい。
【０２２２】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０２２３】
１…情報処理システム、２…フロントエンドサーバ、３…フラグメントサーバ、２０，３０…コントローラ、２１，３１…記憶部、２２，３２…送受信部、２３，３３…プロセッサ、２４，３４…メモリ、２５，３５…制御部、２０１…オブジェクト分割部、２０２…消失符号計算部、２０３…フィンガープリント計算部、２１１…オブジェクト記憶部、２１２，３１１…フィンガープリントセット、２１３…ディスク選択インデックスファイル、３０１…重複排除処理部、３１２…フラグメント記憶部、３１３…重複位置情報。
【図１】
2017097437.tif 000008
【図２】
2017097437.tif 000009
【図３】
2017097437.tif 000010
【図４】
2017097437.tif 000011
【図５】
2017097437.tif 000012
【図６】
2017097437.tif 000013
【図７】
2017097437.tif 000014
【図８】
2017097437.tif 000015
【図９】
2017097437.tif 000016
【図１０】
2017097437.tif 000017
【図１１】
2017097437.tif 000018
【図１２】
2017097437.tif 000019
【図１３】
2017097437.tif 000020
【図１４】
2017097437.tif 000021
【図１５】
2017097437.tif 000022
【図１６】
2017097437.tif 000023
【図１７】
2017097437.tif 000024
【図１８】
2017097437.tif 000025
【図１９】
2017097437.tif 000026
【手続補正書】
【提出日】平成28年11月4日(2016.11.4)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
第１の情報処理装置と複数の第２の情報処理装置とを具備し、
前記第１の情報処理装置は、
データに基づいて保存単位サイズの複数の保存データを生成する生成部と、
前記データに含まれており前記保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値を計算するとともに、前記第１の断片データに含まれている第１の保存データの少なくとも一部に対応する第２のハッシュ値を計算する計算部と、
前記第１の保存データと前記第１のハッシュ値と前記第２のハッシュ値とを、前記複数の第２の情報処理装置のうちの保存先装置へ送信する送信部と、
を具備し、
前記保存先装置は、
前記第１の保存データと前記第１のハッシュ値と前記第２のハッシュ値とを受信するとともに、外部の情報処理装置によって保存対象データに基づいて生成された前記保存単位サイズの第２の保存データを受信する受信部と、
前記第１の保存データの少なくとも一部に対応する前記第２のハッシュ値が、前記受信部によって受信された前記第２の保存データの少なくとも一部に対応する第３のハッシュ値と一致するか否か判断し、前記第２のハッシュ値が前記第３のハッシュ値と一致する場合に、前記第１の断片データに対応する前記第１のハッシュ値が、前記複数の第２の情報処理装置に保存されており前記第２の保存データを含み前記重複検出サイズの第２の断片データに対応する第４のハッシュ値と一致するか判断し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する処理部と、
を具備する、情報処理システム。
【請求項２】
前記処理部は、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記保存対象データにおける一致位置を示す重複位置情報を、前記外部の情報処理装置へ送信し、
前記外部の情報処理装置は、前記重複位置情報に基づいて、重複部分が同一の断片データに含まれるように、前記保存対象データに対する複数の新たな断片データを生成し、前記複数の新たな断片データに基づいて複数の新たな保存データを生成し、前記複数の新たな保存データを、前記複数の第２の情報処理装置へ送信し、
前記受信部は、前記新たな保存データを受信し、
前記処理部は、前記新たな保存データと前記第１の保存データとが一致する場合に、前記新たな保存データの重複排除を行う、
請求項１に記載の情報処理システム。
【請求項３】
前記第１の情報処理装置は、
参照ハッシュ値と前記参照ハッシュ値に対応して決定される保存先識別情報とを関係付けた選択情報を保存する記憶部と、
前記第１のハッシュ値と前記選択情報とに基づいて、前記複数の保存データのそれぞれの保存先となる第２の情報処理装置を決定する制御部と、
をさらに具備し、
前記送信部は、前記複数の保存データのそれぞれを、決定された前記第２の情報処理装置へ送信する、
請求項１に記載の情報処理システム。
【請求項４】
前記処理部は、前記第２の保存データの少なくとも一部に対応する前記第３のハッシュ値を、前記第２の保存データ内で計算範囲をずらしながら、ローリングハッシュ関数に基づいて計算する、
請求項１に記載の情報処理システム。
【請求項５】
前記第２のハッシュ値は、前記第１の断片データに含まれている先頭の保存データの前半部分のハッシュ値及び後半部分のハッシュ値を含み、
前記処理部は、前記前半部分のハッシュ値又は前記後半部分のハッシュ値が、前記第３のハッシュ値と一致する場合に、前記第１のハッシュ値が前記第４のハッシュ値と一致するか判断し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する、
請求項１に記載の情報処理システム。
【請求項６】
前記処理部は、前記第２のハッシュ値が前記第３のハッシュ値と一致する場合に、一致位置から始まる前記重複検出サイズ分の前記第２の断片データに対応する前記第４のハッシュ値を計算し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する、
請求項１に記載の情報処理システム。
【請求項７】
前記生成部は、前記保存対象データを分割した複数の分割データと前記複数の分割データに対応する誤り訂正データとを含む前記複数の保存データ、を生成する、
請求項１に記載の情報処理システム。
【請求項８】
データに基づいて生成された保存単位サイズの複数の保存データのうちの第１の保存データと、前記データに含まれており前記保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値と、前記第１の断片データに含まれている第１の保存データの少なくとも一部に対応する第２のハッシュ値とを受信するとともに、外部の情報処理装置によって保存対象データに基づいて生成された前記保存単位サイズの第２の保存データを受信する受信部と、
前記第１の保存データの少なくとも一部に対応する前記第２のハッシュ値が、前記受信部によって受信された前記第２の保存データの少なくとも一部に対応する第３のハッシュ値と一致するか否か判断し、前記第２のハッシュ値が前記第３のハッシュ値と一致する場合に、前記第１の断片データに対応する前記第１のハッシュ値が、複数の情報処理装置に保存されており前記第２の保存データを含み前記重複検出サイズの第２の断片データに対応する第４のハッシュ値と一致するか判断し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する処理部と、
を具備する情報処理装置。
【請求項９】
コンピュータを、
データに基づいて保存単位サイズの複数の保存データを生成する生成部と、
前記データに含まれており前記保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値を計算するとともに、前記第１の断片データに含まれている第１の保存データの少なくとも一部に対応する第２のハッシュ値を計算する計算部と、
前記第１の保存データと前記第１のハッシュ値と前記第２のハッシュ値とを、複数の情報処理装置のうちの保存先装置へ送信する送信部と、
して機能させるためのプログラム。
【請求項１０】
コンピュータを、
データに基づいて生成された保存単位サイズの複数の保存データのうちの第１の保存データと、前記データに含まれており前記保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値と、前記第１の断片データに含まれている第１の保存データの少なくとも一部に対応する第２のハッシュ値とを受信するとともに、外部の情報処理装置によって保存対象データに基づいて生成された前記保存単位サイズの第２の保存データを受信する受信部と、
前記第１の保存データの少なくとも一部に対応する前記第２のハッシュ値が、前記受信部によって受信された前記第２の保存データの少なくとも一部に対応する第３のハッシュ値と一致するか否か判断し、前記第２のハッシュ値が前記第３のハッシュ値と一致する場合に、前記第１の断片データに対応する前記第１のハッシュ値が、複数の情報処理装置に保存されており前記第２の保存データを含み前記重複検出サイズの第２の断片データに対応する第４のハッシュ値と一致するか判断し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する処理部と、
して機能させるためのプログラム。
【手続補正書】
【提出日】平成29年2月3日(2017.2.3)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
第１の情報処理装置と複数の第２の情報処理装置とを具備し、
前記第１の情報処理装置は、
データに基づいて保存単位サイズの複数の保存データを生成する生成部と、
前記データに含まれており前記保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値を計算するとともに、前記第１の断片データに含まれている第１の保存データの少なくとも一部に対応する第２のハッシュ値を計算する計算部と、
前記第１の保存データと前記第１のハッシュ値と前記第２のハッシュ値とを、前記複数の第２の情報処理装置のうちの保存先装置へ送信する送信部と、
を具備し、
前記保存先装置は、
前記第１の保存データと前記第１のハッシュ値と前記第２のハッシュ値とを受信するとともに、外部の情報処理装置によって保存対象データに基づいて生成された前記保存単位サイズの第２の保存データを受信する受信部と、
前記第１の保存データの少なくとも一部に対応する前記第２のハッシュ値が、前記受信部によって受信された前記第２の保存データの少なくとも一部に対応する第３のハッシュ値と一致するか否か判断し、前記第２のハッシュ値が前記第３のハッシュ値と一致する場合に、前記第１の断片データに対応する前記第１のハッシュ値が、前記複数の第２の情報処理装置に保存されており前記第２の保存データを含み前記重複検出サイズの第２の断片データに対応する第４のハッシュ値と一致するか判断し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する処理部と、
を具備する、情報処理システム。
【請求項２】
前記処理部は、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記保存対象データにおける一致位置を示す重複位置情報を、前記外部の情報処理装置へ送信し、
前記外部の情報処理装置は、前記重複位置情報に基づいて、重複部分が同一の断片データに含まれるように、前記保存対象データに対する複数の新たな断片データを生成し、前記複数の新たな断片データに基づいて複数の新たな保存データを生成し、前記複数の新たな保存データを、前記複数の第２の情報処理装置へ送信し、
前記受信部は、前記新たな保存データを受信し、
前記処理部は、前記新たな保存データと前記第１の保存データとが一致する場合に、前記新たな保存データの重複排除を行う、
請求項１に記載の情報処理システム。
【請求項３】
前記第１の情報処理装置は、
参照ハッシュ値と前記参照ハッシュ値に対応して決定される保存先識別情報とを関係付けた選択情報を保存する記憶部と、
前記第１のハッシュ値と前記選択情報とに基づいて、前記複数の保存データのそれぞれの保存先となる第２の情報処理装置を決定する制御部と、
をさらに具備し、
前記送信部は、前記複数の保存データのそれぞれを、決定された前記第２の情報処理装置へ送信する、
請求項１に記載の情報処理システム。
【請求項４】
前記処理部は、前記第２の保存データの少なくとも一部に対応する前記第３のハッシュ値を、前記第２の保存データ内で計算範囲をずらしながら、ローリングハッシュ関数に基づいて計算する、
請求項１に記載の情報処理システム。
【請求項５】
前記第２のハッシュ値は、前記第１の断片データに含まれている先頭の保存データの前半部分のハッシュ値及び後半部分のハッシュ値を含み、
前記処理部は、前記前半部分のハッシュ値又は前記後半部分のハッシュ値が、前記第３のハッシュ値と一致する場合に、前記第１のハッシュ値が前記第４のハッシュ値と一致するか判断し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する、
請求項１に記載の情報処理システム。
【請求項６】
前記処理部は、前記第２のハッシュ値が前記第３のハッシュ値と一致する場合に、一致位置から始まる前記重複検出サイズ分の前記第２の断片データに対応する前記第４のハッシュ値を計算し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する、
請求項１に記載の情報処理システム。
【請求項７】
前記生成部は、前記保存対象データを分割した複数の分割データと前記複数の分割データに対応する誤り訂正データとを含む前記複数の保存データ、を生成する、
請求項１に記載の情報処理システム。
【請求項８】
データに基づいて生成された保存単位サイズの複数の保存データのうちの第１の保存データと、前記データに含まれており前記保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値と、前記第１の断片データに含まれている第１の保存データの少なくとも一部に対応する第２のハッシュ値とを受信するとともに、外部の情報処理装置によって保存対象データに基づいて生成された前記保存単位サイズの第２の保存データを受信する受信部と、
前記第１の保存データの少なくとも一部に対応する前記第２のハッシュ値が、前記受信部によって受信された前記第２の保存データの少なくとも一部に対応する第３のハッシュ値と一致するか否か判断し、前記第２のハッシュ値が前記第３のハッシュ値と一致する場合に、前記第１の断片データに対応する前記第１のハッシュ値が、複数の情報処理装置に保存されており前記第２の保存データを含み前記重複検出サイズの第２の断片データに対応する第４のハッシュ値と一致するか判断し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する処理部と、
を具備する情報処理装置。
【請求項９】
コンピュータを、
データに基づいて生成された保存単位サイズの複数の保存データのうちの第１の保存データと、前記データに含まれており前記保存単位サイズよりも大きい重複検出サイズの第１の断片データに対応する第１のハッシュ値と、前記第１の断片データに含まれている第１の保存データの少なくとも一部に対応する第２のハッシュ値とを受信するとともに、外部の情報処理装置によって保存対象データに基づいて生成された前記保存単位サイズの第２の保存データを受信する受信部と、
前記第１の保存データの少なくとも一部に対応する前記第２のハッシュ値が、前記受信部によって受信された前記第２の保存データの少なくとも一部に対応する第３のハッシュ値と一致するか否か判断し、前記第２のハッシュ値が前記第３のハッシュ値と一致する場合に、前記第１の断片データに対応する前記第１のハッシュ値が、複数の情報処理装置に保存されており前記第２の保存データを含み前記重複検出サイズの第２の断片データに対応する第４のハッシュ値と一致するか判断し、前記第１のハッシュ値が前記第４のハッシュ値と一致する場合に、前記第２の断片データに対する重複を検出する処理部と、
して機能させるためのプログラム。