(57)【特許請求の範囲】
【請求項１】
複数のデータサーバに格納されたファイルデータであって、固定長のチャンクに分割して格納されたファイルデータに対するスナップショットへの書き込み要求を受け付けた場合に、コピーオンライトにより、該書き込み要求の対象となるチャンクのコピー先のデータサーバを、各データサーバにおけるデータ記憶部の空き容量、コピーされるチャンクを保持しているデータサーバと各データサーバとの距離、各データサーバの負荷状態、各データサーバにおける複数のファイルに共有されているチャンクの数のいずれか一つまたは複数に基づいて決定する決定部と、
前記決定部によって決定されたデータサーバに対して、書き込み要求の対象となるチャンクをコピーするように制御する制御部と
を備えることを特徴とするスナップショット制御装置。
【請求項２】
前記決定部は、データサーバにおけるデータ記憶部の空き容量が所定の閾値以上であるデータサーバのなかから、コピーされるチャンクを保持しているデータサーバとの距離が最も小さいデータサーバを、コピー先のデータサーバとして決定することを特徴とする請求項１に記載のスナップショット制御装置。
【請求項３】
前記決定部は、データサーバにおけるデータ記憶部の空き容量が所定の閾値以上であるデータサーバのなかから、負荷状態が最も低いデータサーバを、コピー先のデータサーバとして決定することを特徴とする請求項１に記載のスナップショット制御装置。
【請求項４】
前記決定部は、データサーバにおけるデータ記憶部の空き容量が所定の閾値以上であるデータサーバのなかから、各データサーバにおける複数のファイルに共有されているチャンクの数が所定の閾値未満であるデータサーバを、コピー先のデータサーバとして決定することを特徴とする請求項１に記載のスナップショット制御装置。
【請求項５】
スナップショット制御装置で実行されるスナップショット制御方法であって、
複数のデータサーバに格納されたファイルデータであって、固定長のチャンクに分割して格納されたファイルデータに対するスナップショットへの書き込み要求を受け付けた場合に、コピーオンライトにより、該書き込み要求の対象となるチャンクのコピー先のデータサーバを、各データサーバにおけるデータ記憶部の空き容量、コピーされるチャンクを保持しているデータサーバと各データサーバとの距離、各データサーバの負荷状態、各データサーバにおける複数のファイルに共有されているチャンクの数のいずれか一つまたは複数に基づいて決定する決定工程と、
前記決定工程によって決定されたデータサーバに対して、書き込み要求の対象となるチャンクをコピーするように制御する制御工程と
を含んだことを特徴とするスナップショット制御方法。
【請求項６】
複数のデータサーバに格納されたファイルデータであって、固定長のチャンクに分割して格納されたファイルデータに対するスナップショットへの書き込み要求を受け付けた場合に、コピーオンライトにより、該書き込み要求の対象となるチャンクのコピー先のデータサーバを、各データサーバにおけるデータ記憶部の空き容量、コピーされるチャンクを保持しているデータサーバと各データサーバとの距離、各データサーバの負荷状態、各データサーバにおける複数のファイルに共有されているチャンクの数のいずれか一つまたは複数に基づいて決定する決定ステップと、
前記決定ステップによって決定されたデータサーバに対して、書き込み要求の対象となるチャンクをコピーするように制御する制御ステップと
をコンピュータに実行させることを特徴とするスナップショット制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スナップショット制御装置、スナップショット制御方法およびスナップショット制御プログラムに関する。
【背景技術】
【０００２】
近年、分散ファイルシステム（Distributed  File  System）が広く利用されるようになっている。分散ファイルシステムは、ネットワークで接続された多数のサーバで構成され、巨大な記憶装置を実現する。典型的には、分散ファイルシステムは、複数のラックにまたがる数十台から数百台、それ以上のサーバをネットワークで接続することで構成される。
【０００３】
このような分散ファイルシステムの例としては、Google（登録商標）  File  System（以下、ＧＦＳ、非特許文献１参照）やHadoop（登録商標）  Distributed  File  System（以下、ＨＤＦＳ、非特許文献２参照）が知られている。これらの分散ファイルシステムでは、ファイルを固定長のチャンクに分割して、分散ファイルシステムを構成する各サーバ（以下、データサーバという）に格納する。可用性や耐障害性を高めるために、各チャンクは定められた冗長度の数（ＧＦＳやＨＤＦＳではデフォルトで３）のデータサーバに複製して格納される。これにより、あるデータサーバに障害が発生しても、他のデータサーバに格納されているチャンクを用いて処理を継続することができる。
【０００４】
ＧＦＳやＨＤＦＳはスナップショット機能を提供している。スナップショットとは、ある時点におけるファイルやディレクトリツリーのコピーである。スナップショットはデータのバックアップや誤った操作からのデータの復旧などに利用することができる。
【０００５】
ＧＦＳでは、ファイルやディレクトリに対する読み書き可能なスナップショットを作成することができる。スナップショットの実現にはコピーオンライトを用いており、高速なスナップショット作成や効率的なストレージの使用が可能となっている。
【０００６】
ＨＤＦＳでは、ディレクトリに対する読み出し専用のスナップショットを作成することができる。スナップショットの作成において、データはコピーされないため、高速にスナップショットを作成することができる。
【先行技術文献】
【非特許文献】
【０００７】
【非特許文献１】Sanjay  Ghemawat、  Howard  Gobioff、  Shun-Tak  Leung、  The  Google  File  System、  Proceedings  of  the  19th  ACM  Symposium  on  Operating  Systems  Principles、  pages  29-43、  October、  2003.
【非特許文献２】Hadoop、［online］、［平成２６年５月９日検索］、インターネット＜http://hadoop.apache.org/＞
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、上記したＧＦＳでは、スナップショットへの書き込みにおいて、コピーオンライトにより、書き込み対象のチャンクを保持するデータサーバ内でローカルにチャンクがコピーされるので、ストレージの空き容量不足等による書き込み不可の状況では、適切にチャンクのコピーを行うことができない場合があるという課題があった。また、スナップショットに含まれるファイルを多く保持するデータサーバでは、スナップショットへの書き込みによって保持しているチャンク数が増加し、データサーバの負荷が増加することがある。
【０００９】
例えば、ＧＦＳにおけるスナップショットの作成およびスナップショットへの書き込みの動作は以下のようになる。ここでは例として、ファイル１のスナップショットとしてファイル２を作成したとする。ファイル１のスナップショットとしてファイル２を作成すると、ファイル１とファイル２はファイルを構成するチャンクを共有するようになる。次に、ファイル２へ書き込みを行うと、コピーオンライトにより、書き込み対象のチャンクを保持するデータサーバ内でローカルに当該チャンクがコピーされ、ファイル２はコピーされたチャンクを参照するように変更される。ここで、書き込みはコピーされたチャンクに対して行われる。なお、ファイル１はもとのチャンクを参照したままである。また、書き込み対象でないチャンクはファイル１とファイル２で共有されたままである。
【００１０】
ＧＦＳにおけるコピーオンライトによるチャンクのコピーでは、書き込み対象のチャンクを保持するデータサーバ内でローカルに当該チャンクがコピーされる。そのため、ストレージの空き容量がなくなると、データサーバ内でローカルにチャンクをコピーすることができなくなる。また、スナップショットにより複数のファイルに共有されているチャンクを多く保持するデータサーバでは、スナップショットへの書き込みによって保持しているチャンク数が増加し、当該データサーバの負荷が増加することがある。
【００１１】
スナップショットが作成されるファイルやディレクトリの数や、スナップショットへの読み書きの負荷は、ユースケースによってさまざまである。そのため、状況に応じて、コピーオンライトによるチャンクのコピーを制御することが必要となる。
【課題を解決するための手段】
【００１２】
上述した課題を解決し、目的を達成するために、本発明のスナップショット制御装置は、複数のデータサーバに格納されたファイルデータであって、固定長のチャンクに分割して格納されたファイルデータに対するスナップショットへの書き込み要求を受け付けた場合に、コピーオンライトにより、該書き込み要求の対象となるチャンクのコピー先のデータサーバを、各データサーバにおけるデータ記憶部の空き容量、コピーされるチャンクを保持しているデータサーバと各データサーバとの距離、各データサーバの負荷状態、各データサーバにおける複数のファイルに共有されているチャンクの数のいずれか一つまたは複数に基づいて決定する決定部と、前記決定部によって決定されたデータサーバに対して、書き込み要求の対象となるチャンクをコピーするように制御する制御部とを備えることを特徴とする。
【００１３】
また、本発明のスナップショット制御方法は、スナップショット制御装置で実行されるスナップショット制御方法であって、複数のデータサーバに格納されたファイルデータであって、固定長のチャンクに分割して格納されたファイルデータに対するスナップショットへの書き込み要求を受け付けた場合に、コピーオンライトにより、該書き込み要求の対象となるチャンクのコピー先のデータサーバを、各データサーバにおけるデータ記憶部の空き容量、コピーされるチャンクを保持しているデータサーバと各データサーバとの距離、各データサーバの負荷状態、各データサーバにおける複数のファイルに共有されているチャンクの数のいずれか一つまたは複数に基づいて決定する決定工程と、前記決定工程によって決定されたデータサーバに対して、書き込み要求の対象となるチャンクをコピーするように制御する制御工程とを含んだことを特徴とする。
【００１４】
また、本発明のスナップショット制御プログラムは、複数のデータサーバに格納されたファイルデータであって、固定長のチャンクに分割して格納されたファイルデータに対するスナップショットへの書き込み要求を受け付けた場合に、コピーオンライトにより、該書き込み要求の対象となるチャンクのコピー先のデータサーバを、各データサーバにおけるデータ記憶部の空き容量、コピーされるチャンクを保持しているデータサーバと各データサーバとの距離、各データサーバの負荷状態、各データサーバにおける複数のファイルに共有されているチャンクの数のいずれか一つまたは複数に基づいて決定する決定ステップと、前記決定ステップによって決定されたデータサーバに対して、書き込み要求の対象となるチャンクをコピーするように制御する制御ステップとをコンピュータに実行させることを特徴とする。
【発明の効果】
【００１５】
本発明によれば、複数のファイルに共有されているチャンクを保持しているデータサーバのデータ記憶部の空き容量が不足しても、データ記憶部の空き容量がある他のデータサーバにチャンクをコピーすることにより、適切にチャンクのコピーを行うことができるという効果を奏する。
【図面の簡単な説明】
【００１６】
【図１】図１は、第１の実施形態におけるスナップショット制御システムの構成の一例を示す図である。
【図２】図２は、第１の実施形態におけるファイルデータと固定長のチャンクの関係を示す図である。
【図３】図３は、第１の実施形態におけるスナップショットと固定長のチャンクの関係を示す図である。
【図４】図４は、第１の実施形態におけるマスタサーバの構成の一例を示す図である。
【図５】図５は、第１の実施形態におけるファイルテーブルの構成の一例を示す図である。
【図６】図６は、第１の実施形態におけるチャンクテーブルの構成の一例を示す図である。
【図７】図７は、第１の実施形態におけるデータサーバ状態管理テーブルの構成の一例を示す図である。
【図８】図８は、第１の実施形態におけるデータサーバの構成の一例を示す図である。
【図９】図９は、第１の実施形態におけるチャンク情報テーブルの構成の一例を示す図である。
【図１０】図１０は、第１の実施形態におけるファイル生成処理において、外部アプリケーションがマスタサーバへファイル生成要求を送信したときの動作の一例を示すフローチャートである。
【図１１】図１１は、第１の実施形態におけるファイル生成処理において、マスタサーバが外部アプリケーションからファイル生成要求を受信したときの動作の一例を示すフローチャートである。
【図１２】図１２は、第１の実施形態におけるディレクトリ生成処理において、外部アプリケーションがマスタサーバへディレクトリ生成要求を送信したときの動作の一例を示すフローチャートである。
【図１３】図１３は、第１の実施形態におけるディレクトリ生成処理において、マスタサーバが外部アプリケーションからディレクトリ生成要求を受信したときの動作の一例を示すフローチャートである。
【図１４】図１４は、第１の実施形態におけるスナップショット生成処理において、外部アプリケーションがマスタサーバへスナップショット生成要求を送信したときの動作の一例を示すフローチャートである。
【図１５】図１５は、第１の実施形態におけるスナップショット生成処理において、マスタサーバが外部アプリケーションからスナップショット生成要求を受信したときの動作の一例を示すフローチャートである。
【図１６】図１６は、第１の実施形態におけるスナップショット生成処理において、マスタサーバが外部アプリケーションからスナップショット生成要求を受信したときの動作の一例を示すフローチャートである。
【図１７】図１７は、第１の実施形態におけるスナップショット生成処理において、マスタサーバが外部アプリケーションからスナップショット生成要求を受信したときの動作の一例を示すフローチャートである。
【図１８】図１８は、第１の実施形態における書き込み処理において、外部アプリケーションがファイルへの書き込みを行うときの動作の一例を示すフローチャートである。
【図１９】図１９は、第１の実施形態における書き込み処理において、マスタサーバがチャンク情報取得要求を受信したときの動作の一例を示すフローチャートである。
【図２０】図２０は、第１の実施形態における書き込み処理において、マスタサーバがチャンク情報取得要求を受信したときの動作の一例を示すフローチャートである。
【図２１】図２１は、第１の実施形態における書き込み処理において、マスタサーバがチャンク情報取得要求を受信したときの動作の一例を示すフローチャートである。
【図２２】図２２は、第１の実施形態における書き込み処理において、マスタサーバがチャンク情報取得要求を受信したときの動作の一例を示すフローチャートである。
【図２３】図２３は、第１の実施形態における書き込み処理において、データサーバがマスタサーバからローカルチャンクコピー要求を受信したときの動作の一例を示すフローチャートである。
【図２４】図２４は、第１の実施形態における書き込み処理において、データサーバがマスタサーバからリモートチャンクコピー要求を受信したときの動作の一例を示すフローチャートである。
【図２５】図２５は、第１の実施形態における書き込み処理において、データサーバが他のデータサーバからチャンク読み出し要求を受信したときの動作の一例を示すフローチャートである。
【図２６】図２６は、第１の実施形態における書き込み処理において、データサーバがマスタサーバからチャンク生成要求を受信したときの動作の一例を示すフローチャートである。
【図２７】図２７は、第１の実施形態における書き込み処理において、データサーバがマスタサーバから書き込み制御委譲要求を受信したときの動作の一例を示すフローチャートである。
【図２８】図２８は、第１の実施形態における書き込み処理において、データサーバが外部アプリケーションまたは他のデータサーバからデータ送信要求を受信したときの動作の一例を示すフローチャートである。
【図２９】図２９は、第１の実施形態における書き込み処理において、プライマリデータサーバが外部アプリケーションから書き込み要求を受信したときの動作の一例を示すフローチャートである。
【図３０】図３０は、第１の実施形態における書き込み処理において、セカンダリデータサーバがプライマリデータサーバからセカンダリ書き込み要求を受信したときの動作の一例を示すフローチャートである。
【図３１】図３１は、スナップショット制御プログラムを実行するコンピュータを示す図である。
【発明を実施するための形態】
【００１７】
以下に添付図面を参照して、この発明に係るスナップショット制御装置、スナップショット制御方法およびスナップショット制御プログラムの実施形態を詳細に説明する。なお、この実施形態によりこの発明が限定されるものではない。
【００１８】
［第１の実施形態におけるスナップショット制御システムの構成の一例］
図１は、第１の実施形態におけるスナップショット制御システムの構成の一例を示す図である。
【００１９】
図１に示すように、第１の実施形態におけるスナップショット制御システムは、マスタサーバ１００と、複数のデータサーバ２００、３００、４００、５００、６００として構成される。マスタサーバ１００、データサーバ２００、３００、４００、５００、６００はネットワーク８００で接続される。マスタサーバ１００は分散ファイルシステムの名前空間やデータサーバへのチャンクの割り当てなどを管理するためのメタデータを保持するスナップショット制御装置である。データサーバ２００、３００、４００、５００、６００はチャンクを保持する記憶装置である。外部アプリケーション７００はファイルやディレクトリの作成や削除、スナップショットの作成や削除、ファイルの読み出しや書き込みなどを要求する。図１では、例として、１つのマスタサーバを示しているが、可用性や耐障害性を高めるために、複数のマスタサーバを用意し、マスタサーバ間でメタデータを同期するようにしてもよい。また、図１では、例として、５つのデータサーバを示しているが、データサーバの数は５つに限定されない。
【００２０】
データサーバ２００、３００、４００、５００、６００には各データサーバを一意に識別するためのデータサーバ識別子が割り当てられる。例えば、データサーバ２００、３００、４００、５００、６００が動作するコンピュータのネットワークインタフェースに割り当てられたＩＰアドレスをデータサーバ識別子とする。図１の例では、データサーバ２００、３００、４００、５００、６００にはそれぞれデータサーバ識別子ｄｓ２、ｄｓ３、ｄｓ４、ｄｓ５、ｄｓ６が割り当てられている。
【００２１】
外部アプリケーション７００が書き込むファイルデータは固定長のチャンクに分割されてデータサーバに格納される。各チャンクにはチャンクを一意に識別するためのチャンク識別子が割り当てられる。各チャンクは定められた冗長度の数のデータサーバに格納される。
【００２２】
図２は、第１の実施形態におけるファイルデータと固定長のチャンクの関係を示す図である。図２の例では、ファイルデータ９００は固定長のチャンク９１０、９２０、９３０に分割される。チャンク９１０、９２０、９３０にはそれぞれチャンク識別子ｃ１、ｃ２、ｃ３が割り当てられている。なお、ファイルのサイズが固定長の倍数でない場合、末尾のチャンク９３０のサイズは固定長よりも小さくなる。また、ファイル中にデータが存在しない区間がある場合、固定長よりも小さいチャンクとなったり、チャンクが割り当てられていない区間となったりすることがある。
【００２３】
図３は、第１の実施形態におけるスナップショットと固定長のチャンクの関係を示す図である。図３（１）はスナップショット作成前のファイル１  １０００の状態である。ファイル１  １０００はチャンク識別子ｃ１、ｃ２、ｃ３で識別されるチャンク１０１０、１０２０、１０３０で構成されている。図３（２）はファイル１  １０００のスナップショットとしてファイル２  １１００を作成したときのファイル１  １０００とファイル２  １１００の状態である。ファイル１  １０００とファイル２  １１００はチャンク識別子ｃ１、ｃ２、ｃ３で識別されるチャンク１０１０、１０２０、１０３０を共有している。
【００２４】
図３（３）はファイル２  １１００の末尾へ書き込みを行った後のファイル１  １０００とファイル２  １１００の状態である。ファイル２  １１００への書き込みを行うと、書き込み対象チャンクであるチャンク識別子ｃ３で識別されるチャンク１０３０をコピーして、チャンク識別子ｃ４で識別されるチャンク１１３０を生成する。ファイル２  １１００はチャンク識別子ｃ４で識別されるチャンク１１３０を参照するように変更される。書き込みはチャンク識別子ｃ４で識別されるチャンク１１３０に対して行われる。ファイル１  １０００はチャンク識別子ｃ３で識別されるチャンク１０３０を参照したままである。また、チャンク識別子ｃ１で識別されるチャンク１０１０とチャンク識別子ｃ２で識別されるチャンク１０２０はファイル１  １０００とファイル２  １１００とで共有されたままである。
【００２５】
［第１の実施形態におけるマスタサーバ１００の構成の一例］
図４は、第１の実施形態におけるマスタサーバ１００の構成の一例を示す図である。マスタサーバ１００はファイル管理部１１０とデータサーバ状態管理部１２０を備える。ファイル管理部１１０はファイルやディレクトリの生成や削除、ファイルへのチャンクの割り当て、チャンクを保持するデータサーバの割り当てを管理する。ファイル管理部１１０はファイルと当該ファイルを構成するチャンクとを対応づけるためのファイルテーブル１１１を保持する。また、ファイル管理部１１０はチャンクと当該チャンクを保持するデータサーバとを対応づけるためのチャンクテーブル１１２を保持する。また、ファイル管理部１１０は、決定部１１３および制御部１１４を有する。
【００２６】
決定部１１３は、複数のデータサーバに格納されたファイルデータであって、固定長のチャンクに分割して格納されたファイルデータに対するスナップショットへの書き込み要求を受け付けた場合に、コピーオンライトにより、該書き込み要求の対象となるチャンクのコピー先のデータサーバを、各データサーバにおけるデータ記憶部の空き容量、コピーされるチャンクを保持しているデータサーバと各データサーバとの距離、各データサーバの負荷状態、各データサーバにおける複数のファイルに共有されているチャンクの数のいずれか一つまたは複数に基づいて決定する。
【００２７】
例えば、決定部１１３は、データサーバにおけるデータ記憶部の空き容量が所定の閾値以上であるデータサーバのなかから、後述するデータサーバ状態管理部１２０によって取得された負荷状態が最も低いデータサーバを、コピー先のデータサーバとして決定する。
【００２８】
また、決定部１１３は、例えば、データサーバにおけるデータ記憶部の空き容量が所定の閾値以上であるデータサーバのなかから、コピーされるチャンクを保持しているデータサーバとの距離が最も小さいデータサーバを、コピー先のデータサーバとして決定する。
【００２９】
また、決定部１１３は、例えば、データサーバにおけるデータ記憶部の空き容量が所定の閾値以上であるデータサーバのなかから、各データサーバにおける複数のファイルに共有されているチャンクの数が所定の閾値未満であるデータサーバの１つを、コピー先のデータサーバとして決定する。
【００３０】
ここで、データサーバにおけるデータ記憶部の空き容量が所定の閾値以上であるデータサーバのなかから、コピーされるチャンクを保持しているデータサーバとの「距離」、各データサーバの「負荷状態」、各データサーバにおける複数のファイルに共有されている「チャンクの数」のいずれのパラメータに基づいて、コピー先のデータサーバを決定するかは、管理者が任意に選択できるものとする。例えば、データサーバ同士のネットワーク上の距離が離れているようなスナップショット制御システムである場合には、コピーされるチャンクを保持しているデータサーバとの「距離」が最も小さいデータサーバを、コピー先のデータサーバとして決定するように設定することが好ましい。このように、スナップショット制御システムの特性に応じて、任意にパラメータを選択することができる。
【００３１】
また、複数のパラメータを設定することも可能であるし、複数のパラメータを選択して、パラメータに優先順位を設定することも可能である。例えば、各データサーバの「負荷状態」を最も高い優先順位に設定し、各データサーバにおける複数のファイルに共有されている「チャンクの数」を２番目に高い優先順位に設定する。このような場合には、例えば、負荷状態が最も低いデータサーバが複数ある場合には、それらのデータサーバのなかから、複数のファイルに共有されているチャンクの数が所定の閾値未満であるデータサーバを、コピー先のデータサーバとして決定するようにしてもよい。
【００３２】
また、制御部１１４は、決定部１１３によって決定されたデータサーバに対して、書き込み要求の対象となるチャンクをコピーするように制御する。
【００３３】
データサーバ状態管理部１２０は、データサーバの状態を管理する。データサーバ状態管理部１２０は、データサーバの状態に関する情報を保持するデータサーバ状態管理テーブル１２１を保持する。データサーバ状態管理部１２０は、すべてのデータサーバから各データサーバのデータ記憶部に格納可能なデータの最大容量と、データ記憶部の空き容量と、データサーバの負荷状態をそれぞれ取得する。データサーバのデータ記憶部については後述する。
【００３４】
ファイルテーブル１１１は、各ファイルまたはディレクトリに対して、当該ファイルまたはディレクトリのパス名と、ファイルかディレクトリかを示すパス種別、ファイルを構成する各チャンクのチャンク識別子のリストであるチャンク識別子リストとを保持する。これらに加えて、ファイルテーブル１１１は、ファイルまたはディレクトリに関するその他の情報を保持してもよい。
【００３５】
図５は、第１の実施形態におけるファイルテーブル１１１の構成の一例を示す図である。図５の例では、パス名として、ディレクトリ「／」、ファイル「／ｆｉｌｅ１」、ファイル「／ｆｉｌｅ２」、ファイル「／ｆｉｌｅ３」がファイルテーブル１１１に登録されている。パス種別では、「ｆ」はファイル、「ｄ」はディレクトリを表している。第１の実施形態におけるディレクトリは、当該ディレクトリ内のファイルやディレクトリに関する情報を持たないため、ディレクトリにおけるチャンク識別子リストは使用されない。図５の例では、ディレクトリ「／」の未使用のチャンク識別子リストを「−」で表している。ファイル「／ｆｉｌｅ１」はチャンク識別子ｃ１、ｃ２、ｃ３で識別されるチャンクで構成されている。ファイル「／ｆｉｌｅ２」はファイル「／ｆｉｌｅ１」のスナップショットとして作成されたあと、ファイルの末尾へ書き込みを行った状態であり、チャンク識別子ｃ１、ｃ２、ｃ４で識別されるチャンクで構成されている。ファイル「／ｆｉｌｅ３」はチャンク識別子ｃ５で識別されるチャンクで構成されている。
【００３６】
チャンクテーブル１１２は、各チャンクに対して、当該チャンクのチャンク識別子と、当該チャンクを共有しているファイルの数を示す参照カウントと、当該チャンクを格納する各データサーバのデータサーバ識別子のリストであるデータサーバ識別子リストとを保持する。
【００３７】
図６は、第１の実施形態におけるチャンクテーブル１１２の構成の一例を示す図である。図６の例では、チャンク識別子ｃ１で識別されるチャンクは参照カウントが２であり、データサーバ識別子ｄｓ２、ｄｓ３、ｄｓ４で識別されるデータサーバ各々に格納されている。チャンク識別子ｃ２で識別されるチャンクは参照カウントが２であり、データサーバ識別子ｄｓ２、ｄｓ５、ｄｓ６で識別されるデータサーバ各々に格納されている。チャンク識別子ｃ３で識別されるチャンクは参照カウントが１であり、データサーバ識別子ｄｓ２、ｄｓ４、ｄｓ５で識別されるデータサーバ各々に格納されている。チャンク識別子ｃ４で識別されるチャンクは参照カウントが１であり、データサーバ識別子ｄｓ２、ｄｓ４、ｄｓ６で識別されるデータサーバ各々に格納されている。チャンク識別子ｃ５で識別されるチャンクは参照カウントが１であり、データサーバ識別子ｄｓ３、ｄｓ４、ｄｓ５で識別されるデータサーバ各々に格納されている。
【００３８】
図６の例では、チャンク識別子ｃ１で識別されるチャンクおよびチャンク識別子ｃ２で識別されるチャンクはファイル「／ｆｉｌｅ１」とファイル「／ｆｉｌｅ２」とで共有されているため、参照カウントがそれぞれ２になっている。また、ファイル「／ｆｉｌｅ２」の末尾への書き込みでは、コピーオンライトにより、チャンク識別子ｃ３で識別されるチャンクがチャンク識別子ｃ４で識別されるチャンクにコピーされ、そのあとにチャンク識別子ｃ４で識別されるチャンクへ書き込みが行われている。データサーバ識別子ｄｓ２で識別されるデータサーバと、データサーバ識別子ｄｓ４で識別されるデータサーバでは、コピーオンライトによるチャンクのコピーは同一データサーバ内でローカルに行われているが、データサーバ識別子ｄｓ５で識別されるデータサーバでは、データサーバ識別子ｄｓ６で識別されるデータサーバへのチャンクのコピーが行われている。
【００３９】
データサーバ状態管理テーブル１２１は、各データサーバに対して、当該データサーバのデータサーバ識別子、当該データサーバのデータ記憶部に格納可能なデータの最大容量と、データ記憶部の空き容量と、当該データサーバの負荷状態とを保持する。これらに加えて、データサーバ状態管理テーブル１２１は、データサーバに関するその他の情報を保持してもよい。
【００４０】
図７は、第１の実施形態におけるデータサーバ状態管理テーブル１２１の構成の一例を示す図である。図７の例では、データサーバ識別子ｄｓ２で識別されるデータサーバ２００のデータ記憶部に格納可能なデータの最大容量は２．０テラバイト（ＴＢ）、空き容量は１．０テラバイト（ＴＢ）、負荷状態は０．５、データサーバ識別子ｄｓ３で識別されるデータサーバ３００のデータ記憶部に格納可能なデータの最大容量は２．０テラバイト（ＴＢ）、空き容量は１．１テラバイト（ＴＢ）、負荷状態は１．０、データサーバ識別子ｄｓ４で識別されるデータサーバ４００のデータ記憶部に格納可能なデータの最大容量は１．０テラバイト（ＴＢ）、空き容量は０．６テラバイト（ＴＢ）、負荷状態は３．０、データサーバ識別子ｄｓ５で識別されるデータサーバ５００のデータ記憶部に格納可能なデータの最大容量は１．０テラバイト（ＴＢ）、空き容量は０．１テラバイト（ＴＢ）、負荷状態は０．８、データサーバ識別子ｄｓ６で識別されるデータサーバ６００のデータ記憶部に格納可能なデータの最大容量は１．５テラバイト（ＴＢ）、空き容量は０．７テラバイト（ＴＢ）、負荷状態は０．５である。
【００４１】
このように、マスタサーバ１００は、コピーオンライトによるチャンクのコピーにおいて、多様なコピーオンライト戦略に基づいて、コピーオンライトによるチャンクのコピー先を決定する。このため、複数のファイルに共有されているチャンクを保持しているデータサーバのデータ記憶部の空き容量が不足しても、データ記憶部の空き容量がある他のデータサーバにチャンクをコピーすることにより、書き込みを継続したり、データサーバ間で負荷を分散したりすることができるという効果を奏する。
【００４２】
［第１の実施形態におけるデータサーバの構成の一例］
図８は、第１の実施形態におけるデータサーバ２００、３００、４００、５００、６００の構成の一例を示す図である。なお、データサーバ２００、３００、４００、５００、６００の構成はいずれも同様であるものとし、以下、データサーバ２００を代表例として説明する。以下の説明では、必要に応じて対応する他のデータサーバ３００、４００、５００、６００の構成要素の参照符号を、括弧を付して併記する。
【００４３】
データサーバ２００（３００、４００、５００、６００）は、データ記憶部２１０（３１０、４１０、５１０、６１０）、データアクセス部２２０（３２０、４２０、５２０、６２０）、および状態通知部２３０（３３０、４３０、５３０、６３０）を備える。
【００４４】
データ記憶部２１０（３１０、４１０、５１０、６１０）はデータサーバ２００（３００、４００、５００、６００）が格納するすべてのチャンク、およびチャンク情報テーブル２１１（３１１、４１１、５１１、６１１）を保持する。
【００４５】
第１の実施形態におけるチャンク情報テーブル２１１（３１１、４１１、５１１、６１１）は、格納する各チャンクに対して、当該チャンクのチャンク識別子と、データ記憶部２１０（３１０、４１０、５１０、６１０）内での当該チャンクの格納場所と、当該チャンクのサイズとを保持する。これらに加えて、チャンク情報テーブル２１１（３１１、４１１、５１１、６１１）は、チャンクに関するその他の情報を保持してもよい。
【００４６】
図９は、第１の実施形態におけるチャンク情報テーブル２１１（３１１、４１１、５１１、６１１）の構成の一例を示す図である。図９の例では、チャンク識別子ｃ１で識別されるチャンクは、データ記憶部２１０内の「ｐ１」で識別される位置に格納されており、チャンクのサイズは６４メガバイト（ＭＢ）、チャンク識別子ｃ２で識別されるチャンクは、データ記憶部２１０内の「ｐ２」で識別される位置に格納されており、チャンクのサイズは６４メガバイト（ＭＢ）、チャンク識別子ｃ３で識別されるチャンクは、データ記憶部２１０内の「ｐ３」で識別される位置に格納されており、チャンクのサイズは４８メガバイト（ＭＢ）、チャンク識別子ｃ４で識別されるチャンクは、データ記憶部２１０内の「ｐ４」で識別される位置に格納されており、チャンクのサイズは６４メガバイト（ＭＢ）である。
【００４７】
データアクセス部２２０（３２０、４２０、５２０、６２０）は、データ記憶部２１０（３１０、４１０、５１０、６１０）に格納されているチャンクの読み出しや書き込みを実行する。また、データアクセス部２２０（３２０、４２０、５２０、６２０）は、データ記憶部２１０（３１０、４１０、５１０、６１０）に格納されているチャンク情報テーブル２１１（３１１、４１１、５１１、６１１）の情報の読み出しや書き込みを実行する。
【００４８】
状態通知部２３０（３３０、４３０、５３０、６３０）は、データ記憶部２１０（３１０、４１０、５１０、６１０）の状態やデータサーバ２００（３００、４００、５００、６００）の負荷状態を監視し、マスタサーバ１００に通知する。状態通知部２３０（３３０、４３０、５３０、６３０）は、データ記憶部２１０（３１０、４１０、５１０、６１０）に格納可能なデータの最大容量とデータ記憶部２１０（３１０、４１０、５１０、６１０）の空き容量とデータサーバ２００（３００、４００、５００、６００）の負荷状態とを定期的に検知し、検知した最大容量と空き容量と負荷状態とをマスタサーバ１００へ通知する。
【００４９】
マスタサーバ１００はデータサーバ状態管理部１２０のデータサーバ状態管理テーブル１２１における当該データサーバの最大容量と空き容量と負荷状態とを、通知された最大容量と空き容量と負荷状態とで更新する。これらに加えて、状態通知部２３０（３３０、４３０、５３０、６３０）は、データサーバ２００（３００、４００、５００、６００）に関するその他の情報をマスタサーバ１００に通知してもよい。なお、ここでは定期的に状態を検知し通知するものとするが、なんらかのイベントの発生に応じて検知および通知を実行するものとしてもよい。
【００５０】
［第１の実施形態におけるスナップショット制御の一例］
はじめに、ファイルやディレクトリを生成するときの処理の一例を［ファイル生成処理の一例］と［ディレクトリ生成処理の一例］で説明する。次に、ファイルやディレクトリのスナップショットを生成するときの処理の一例を［スナップショット生成処理の一例］で説明する。最後に、ファイルへの書き込み処理の一例を［書き込み処理の一例］で説明する。
【００５１】
［ファイル生成処理の一例］
［ファイル生成処理における外部アプリケーション７００の処理の一例］
図１０は、第１の実施形態におけるファイル生成処理において、外部アプリケーション７００がマスタサーバ１００へファイル生成要求を送信したときの動作の一例を示すフローチャートである。
【００５２】
外部アプリケーション７００はマスタサーバ１００へファイル生成要求と、ファイルパス名とを送信する（ステップＳ１００１）。そして、外部アプリケーション７００はマスタサーバ１００からファイル生成応答を受信する（ステップＳ１００２）。
【００５３】
［ファイル生成処理におけるマスタサーバ１００の処理の一例］
図１１は、第１の実施形態におけるファイル生成処理において、マスタサーバ１００が外部アプリケーション７００からファイル生成要求を受信したときの動作の一例を示すフローチャートである。
【００５４】
マスタサーバ１００は外部アプリケーション７００からファイル生成要求と、ファイルパス名とを受信する（ステップＳ１１０１）。そして、マスタサーバ１００はファイル管理部１１０のファイルテーブル１１１に当該ファイルパス名と、ファイルであることを示すパス種別「ｆ」と、空のチャンク識別子リストとを登録する（ステップＳ１１０２）。続いて、マスタサーバ１００は外部アプリケーション７００にファイル生成応答を送信する（ステップＳ１１０３）。
【００５５】
［ディレクトリ生成処理の一例］
［ディレクトリ生成処理における外部アプリケーション７００の処理の一例］
図１２は、第１の実施形態におけるディレクトリ生成処理において、外部アプリケーション７００がマスタサーバ１００へディレクトリ生成要求を送信したときの動作の一例を示すフローチャートである。
【００５６】
外部アプリケーション７００はマスタサーバ１００へディレクトリ生成要求と、ディレクトリパス名とを送信する（ステップＳ１２０１）。そして、外部アプリケーション７００はマスタサーバ１００からディレクトリ生成応答を受信する（ステップＳ１２０２）。
【００５７】
［ディレクトリ生成処理におけるマスタサーバ１００の処理の一例］
図１３は、第１の実施形態におけるディレクトリ生成処理において、マスタサーバ１００が外部アプリケーション７００からディレクトリ生成要求を受信したときの動作の一例を示すフローチャートである。
【００５８】
マスタサーバ１００は外部アプリケーション７００からディレクトリ生成要求と、ディレクトリパス名とを受信する（ステップＳ１３０１）。そして、マスタサーバ１００はファイル管理部１１０のファイルテーブル１１１に当該ディレクトリパス名と、ディレクトリであることを示すパス種別「ｄ」とを登録する（ステップＳ１３０２）。チャンク識別子リストは使用しない。続いて、マスタサーバ１００は外部アプリケーション７００にディレクトリ生成応答を送信する（ステップＳ１３０３）。
【００５９】
［スナップショット生成処理の一例］
［スナップショット生成処理における外部アプリケーション７００の処理の一例］
図１４は、第１の実施形態におけるスナップショット生成処理において、外部アプリケーション７００がマスタサーバ１００へスナップショット生成要求を送信したときの動作の一例を示すフローチャートである。
【００６０】
外部アプリケーション７００はマスタサーバ１００へスナップショット生成要求と、スナップショット元パス名と、スナップショット先パス名とを送信する（ステップＳ１４０１）。そして、外部アプリケーション７００はマスタサーバ１００からスナップショット生成応答を受信する（ステップＳ１４０２）。
【００６１】
［スナップショット生成処理におけるマスタサーバ１００の処理の一例］
図１５は、第１の実施形態におけるスナップショット生成処理において、マスタサーバ１００が外部アプリケーション７００からスナップショット生成要求を受信したときの動作の一例を示すフローチャートである。
【００６２】
マスタサーバ１００は外部アプリケーション７００からスナップショット生成要求と、スナップショット元パス名と、スナップショット先パス名とを受信する（ステップＳ１５０１）。
【００６３】
そして、マスタサーバ１００はファイル管理部１１０のファイルテーブル１１１におけるスナップショット元パス名に対するパス種別と、チャンク識別子リストとを取得する（ステップＳ１５０２）。
【００６４】
続いて、マスタサーバ１００は当該パス種別が「ｆ」ならば、ステップＳ１５０４へ、「ｄ」ならば、ステップＳ１５０５へ遷移する（ステップＳ１５０３）。マスタサーバ１００は当該パス種別が「ｆ」ならば、ファイルスナップショット処理（ステップＳ１５０４−１〜ステップＳ１５０４−５）を実行する（ステップＳ１５０４）。
【００６５】
ここで、図１６を用いて、マスタサーバ１００のファイルスナップショット処理について説明する。マスタサーバ１００はファイル管理部１１０のファイルテーブル１１１にスナップショット先パス名と、パス種別「ｆ」と、ステップＳ１５０２で取得したチャンク識別子リストとを登録する（ステップＳ１５０４−１）。ここで、マスタサーバ１００は当該チャンク識別子リスト内のすべてのチャンク識別子に対して後述するステップＳ１５０４−４の処理を実行する。
【００６６】
はじめに、当該チャンク識別子リスト内のチャンク識別子の位置を示すインデックスを当該チャンク識別子リスト内の先頭に設定する（ステップＳ１５０４−２）。
【００６７】
続いて、マスタサーバ１００は当該チャンク識別子リスト内のすべてのチャンク識別子の処理が完了したか判定し（ステップＳ１５０４−３）、完了したら処理を終了する。そうでなければ、ステップＳ１５０４−４へ遷移する。
【００６８】
マスタサーバ１００は当該チャンク識別子リスト内のすべてのチャンク識別子の処理が完了していなければ、ファイル管理部１１０のチャンクテーブル１１２における当該チャンク識別子リスト内のインデックスの位置のチャンク識別子に対する参照カウントの値を１増加させる（ステップＳ１５０４−４）。その後、マスタサーバ１００はインデックスを当該チャンク識別子リスト内の次の位置に設定する（ステップＳ１５０４−５）。
【００６９】
図１５の説明に戻って、マスタサーバ１００は当該パス種別が「ｄ」ならば、ディレクトリスナップショット処理（ステップＳ１５０５−１〜ステップＳ１５０５−１１）を実行する（ステップＳ１５０５）。ディレクトリスナップショット処理では、ディレクトリ配下のファイルおよびディレクトリに対して再帰的にスナップショットを作成する。
【００７０】
ここで、図１７を用いて、マスタサーバ１００のディレクトリスナップショット処理について説明する。マスタサーバ１００はファイル管理部１１０のファイルテーブル１１１から当該スナップショット元パス名配下にあるすべてのパス名のリスト（以降、スナップショット元配下パス名リスト）を取得する（ステップＳ１５０５−１）。
【００７１】
マスタサーバ１００は当該スナップショット元配下パス名リスト内のすべてのパス名に対してステップＳ１５０５−４からステップＳ１５０５−１０の処理を実行する。初めに、当該スナップショット元配下パス名リスト内のパス名の位置を示すインデックス１を当該スナップショット元配下パス名リスト内の先頭に設定する（ステップＳ１５０５−２）。
【００７２】
そして、マスタサーバ１００は当該スナップショット元配下パス名リスト内のすべてのパス名の処理が完了したか判定し（ステップＳ１５０５−３）、完了したと判定した場合には、処理を終了する。また、処理が完了していないと判定した場合には、ステップＳ１５０５−４へ遷移する。
【００７３】
マスタサーバ１００は当該スナップショット元配下パス名リスト内のすべてのパス名の処理が完了していなければ、ファイル管理部１１０のファイルテーブル１１１における当該スナップショット元配下パス名リスト内のインデックス１の位置のパス名に対するパス種別とチャンク識別子リストを取得する（ステップＳ１５０５−４）。
【００７４】
続いて、マスタサーバ１００はファイル管理部１１０のファイルテーブル１１１に、当該スナップショット元配下パス名リスト内のインデックス１の位置のパス名におけるルートディレクトリから親ディレクトリまでの部分をスナップショット先パス名で置き換えたパス名と、ステップＳ１５０５−４で取得したパス種別、ステップＳ１５０５−４で取得したチャンク識別子リストとを登録する（ステップＳ１５０５−５）。
【００７５】
そして、マスタサーバ１００は当該パス種別が「ｆ」であるか「ｄ」であるかを判定し、「ｆ」ならば、ステップＳ１５０５−７へ、「ｄ」ならば、ステップＳ１５０５−１１へ遷移する（ステップＳ１５０５−６）。ここで、当該パス種別が「ｆ」である場合には、マスタサーバ１００は当該チャンク識別子リスト内のすべてのチャンク識別子に対して後述するステップＳ１５０５−９の処理を実行する。
【００７６】
初めに、当該チャンク識別子リスト内のチャンク識別子の位置を示すインデックス２を当該チャンク識別子リストの先頭に設定する（ステップＳ１５０５−７）。
【００７７】
そして、マスタサーバ１００は当該チャンク識別子リスト内のすべてのチャンク識別子の処理が完了したら、ステップＳ１５０５−１１へ、そうでなければ、ステップＳ１５０５−９へ遷移する（ステップＳ１５０５−８）。
【００７８】
マスタサーバ１００は当該チャンク識別子リスト内のすべてのチャンク識別子の処理が完了していなければ、ファイル管理部１１０のチャンクテーブル１１２における当該チャンク識別子リスト内のインデックス２の位置のチャンク識別子に対する参照カウントの値を１増加させる（ステップＳ１５０５−９）。
【００７９】
そして、マスタサーバ１００はインデックス２を当該チャンク識別子リスト内の次の位置に設定する（ステップＳ１５０５−１０）。マスタサーバ１００は当該チャンク識別子リスト内のすべてのチャンク識別子の処理が完了したら、インデックス１を当該スナップショット元配下パス名リスト内の次の位置に設定する（ステップＳ１５０５−１１）。
【００８０】
図１５の説明に戻って、ステップＳ１５０６において、マスタサーバ１００は外部アプリケーション７００へスナップショット生成応答を送信する（ステップＳ１５０６）。
【００８１】
［書き込み処理の一例］
［書き込み処理における外部アプリケーション７００の処理の一例］
図１８は、第１の実施形態における書き込み処理において、外部アプリケーション７００がファイルへの書き込みを行うときの動作の一例を示すフローチャートである。
【００８２】
外部アプリケーション７００はマスタサーバ１００へチャンク情報取得要求と、ファイルパス名と、書き込み位置（ファイルの先頭からのオフセット）とを送信する（ステップＳ１６０１）。
【００８３】
そして、外部アプリケーション７００はマスタサーバ１００から当該書き込み位置に対応するチャンクのチャンク識別子（以降、書き込み対象チャンク識別子）と、当該書き込み対象チャンク識別子で識別されるチャンクを保持するデータサーバ（以降、書き込み対象チャンク保持データサーバ）のデータサーバ識別子のリスト（以降、書き込み対象チャンク保持データサーバ識別子リスト）とを受信する（ステップＳ１６０２）。
【００８４】
続いて、外部アプリケーション７００は当該書き込み対象チャンク保持データサーバ識別子リスト内のデータサーバ識別子で識別されるデータサーバから最も距離の近いデータサーバを選択し、選択したデータサーバへデータ送信要求と、当該書き込み対象チャンク識別子と、書き込みデータと、当該書き込み対象チャンク保持データサーバ識別子リストとを送信する（ステップＳ１６０３）。
【００８５】
データ送信要求を受信したデータサーバは、まだデータ送信要求を受信していない当該書き込み対象チャンク保持データサーバのうち、最も距離が近いデータサーバへデータ送信要求を送信する。以降、すべての当該書き込み対象チャンク保持データサーバがデータ送信要求を受信するまでデータ送信要求の送信を繰り返す。データサーバがデータ送信要求を受信したときの動作については後述する。
【００８６】
二つのデータサーバ間の距離の例として、当該二つのデータサーバが動作しているコンピュータのネットワークインタフェースに割り当てられているＩＰアドレスの排他的論理和の自然対数に１を加算した値とする。この例では、二つのＩＰアドレスの上位ビットが異なるほど距離が大きくなる。ここでは、例として、最も距離の近いデータサーバとしてデータサーバ２００を選択したとする。
【００８７】
そして、外部アプリケーション７００はデータサーバ２００からデータ送信応答を受信する（ステップＳ１６０４）。続いて、外部アプリケーション７００はプライマリデータサーバへ書き込み要求と、当該書き込み対象チャンク識別子と、当該書き込み位置とを送信する（ステップＳ１６０５）。
【００８８】
プライマリデータサーバとは、マスタサーバ１００からチャンクへの書き込みに関する制御を委譲されたデータサーバであり、当該書き込み対象チャンク保持データサーバ識別子リスト内のデータサーバ識別子で識別されるデータサーバの中からマスタサーバ１００が選択する。また、当該書き込み対象チャンク保持データサーバ識別子リスト内のデータサーバ識別子で識別されるデータサーバのうち、プライマリデータサーバ以外のデータサーバをセカンダリデータサーバとする。プライマリデータサーバの選択方法については後述する。ここでは、例として、プライマリデータサーバとしてデータサーバ４００が選択されたとする。そして、外部アプリケーション７００はデータサーバ４００から書き込み応答を受信する（ステップＳ１６０６）。
【００８９】
［書き込み処理におけるマスタサーバ１００の処理の一例］
図１９は、第１の実施形態における書き込み処理において、マスタサーバ１００が外部アプリケーション７００からチャンク情報取得要求を受信したときの動作の一例を示すフローチャートである。
【００９０】
マスタサーバ１００は外部アプリケーション７００からチャンク情報取得要求と、ファイルパス名と、書き込み位置とを受信する（ステップＳ１７０１）。そして、マスタサーバ１００はファイル管理部１１０のファイルテーブル１１１から当該ファイルパス名に対するチャンク識別子リストを取得する（ステップＳ１７０２）。
【００９１】
マスタサーバ１００は当該チャンク識別子リスト内に当該書き込み位置に対応するチャンク識別子（以降、書き込み位置チャンク識別子）が存在すれば、ステップＳ１７０４へ、そうでなければ、ステップＳ１７０７へ遷移する（ステップＳ１７０３）。コピーオンライトを発生させる書き込みでは、当該書き込み位置チャンク識別子が存在するため、ステップＳ１７０４へ遷移することになる。
【００９２】
そして、マスタサーバ１００はファイル管理部１１０のチャンクテーブル１１２における当該書き込み位置チャンク識別子に対する参照カウントが２以上ならば、ステップＳ１７０５へ、そうでなければ、ステップＳ１７０６へ遷移する（ステップＳ１７０４）。
【００９３】
コピーオンライトを発生させる書き込みでは、当該書き込み位置チャンク識別子で識別されるチャンクは複数のファイルに共有されており、当該書き込み位置チャンク識別子に対する参照カウントは２以上であるため、ステップＳ１７０５へ遷移することになる。マスタサーバ１００はコピーオンライト処理（ステップＳ１７０５−１〜ステップＳ１７０５−１３）を実行する（ステップＳ１７０５）。
【００９４】
ここで、図２０を用いて、コピーオンライト処理について説明する。マスタサーバ１００はファイル管理部１１０のチャンクテーブル１１２から当該書き込み位置チャンク識別子に対するデータサーバ識別子リスト（以降、コピー対象チャンク保持データサーバ識別子リスト）を取得する（ステップＳ１７０５−１）。ここでは、例として、コピー対象チャンク保持データサーバ識別子リストとしてｄｓ２、ｄｓ４、ｄｓ５を取得したとする。
【００９５】
そして、マスタサーバ１００は新たなチャンク識別子（以降、書き込み対象チャンク識別子）と、空のデータサーバ識別子リスト（以降、書き込み対象チャンク保持データサーバ識別子リスト）を生成する（ステップＳ１７０５−２）。
【００９６】
マスタサーバ１００は当該コピー対象チャンク保持データサーバ識別子リスト内のすべてのデータサーバ識別子（以降、コピー対象チャンク保持データサーバ識別子）に対してステップＳ１７０５−５からステップＳ１７０５−１１の処理を実行する。初めに、当該コピー対象チャンク保持データサーバ識別子リスト内のコピー対象チャンク保持データサーバ識別子の位置を示すインデックスを当該コピー対象チャンク保持データサーバ識別子リスト内の先頭に設定する（ステップＳ１７０５−３）。
【００９７】
マスタサーバ１００は当該コピー対象チャンク保持データサーバ識別子リスト内のすべてのコピー対象チャンク保持データサーバ識別子の処理が完了したら、ステップＳ１７０５−１３へ、そうでなければ、ステップＳ１７０５−５へ遷移する（ステップＳ１７０５−４）。
【００９８】
マスタサーバ１００は当該コピー対象チャンク保持データサーバ識別子リスト内のすべてのコピー対象チャンク保持データサーバ識別子の処理が完了していなければ、当該コピー対象チャンク保持データサーバ識別子リスト内のインデックスの位置にあるコピー対象チャンク保持データサーバ識別子に対して、コピーオンライト戦略に基づいて、コピーされるチャンクを保持するデータサーバ（以降、書き込み対象チャンク保持データサーバ）を決定する（ステップＳ１７０５−５）。
【００９９】
コピーオンライト戦略の例として、コピー対象チャンク保持データサーバ識別子で識別されるデータサーバのデータ記憶部の空き容量が定められた閾値以上ならば、当該データサーバ自身を書き込み対象チャンク保持データサーバとして選択し、そうでなければ、すでに書き込み対象チャンク保持データサーバとして選択されたデータサーバが動作するコンピュータと同一のラックに収納されているコンピュータ上で動作するデータサーバを除いて、データ記憶部の空き容量が定められた閾値以上のデータサーバのうち、当該コピー対象チャンク保持データサーバ識別子リスト内のコピー対象チャンク保持データサーバ識別子で識別されるデータサーバ各々との距離の最小値が最も小さいデータサーバや、最も負荷状態の低いデータサーバや、保持しているチャンクのうち、参照カウントの値が２以上のチャンクの数が定められた閾値未満のデータサーバを書き込み対象チャンク保持データサーバとして選択する。また、各データサーバにおけるデータ記憶部の空き容量、コピーされるチャンクを保持しているデータサーバと各データサーバとの距離、各データサーバの負荷状態、各データサーバにおける複数のファイルに共有されているチャンクの数のいずれか一つまたは複数に基づいて選択することもできる。
【０１００】
ここで、各データサーバに対する参照カウントの値が２以上のチャンクの数を高速に取得するために、マスタサーバ１００は、各データサーバに対して、当該データサーバのデータサーバ識別子と、当該データサーバ識別子で識別されるデータサーバにおける参照カウントの値が２以上のチャンクの数とを保持するテーブルを保持してもよい。
【０１０１】
分散ファイルシステムがあらかじめ一つ以上のコピーオンライト戦略を用意し、ユーザがそれらから利用するコピーオンライト戦略を選択したり、ユーザが独自のコピーオンライト戦略を定義して利用したりしてもよい。
【０１０２】
ここでは、例として、コピー対象チャンク保持データサーバ識別子がｄｓ２のときは書き込み対象チャンク保持データサーバとしてデータサーバ識別子ｄｓ２で識別されるデータサーバ２００が、コピー対象チャンク保持データサーバ識別子がｄｓ４のときは書き込み対象チャンク保持データサーバとしてデータサーバ識別子ｄｓ４で識別されるデータサーバ４００が、コピー対象チャンク保持データサーバ識別子がｄｓ５のときは書き込み対象チャンク保持データサーバとしてデータサーバ識別子ｄｓ６で識別されるデータサーバ６００が、それぞれ選択されたとする。
【０１０３】
そして、マスタサーバ１００は当該コピー対象チャンク保持データサーバ識別子と当該書き込み対象チャンク保持データサーバのデータサーバ識別子（以降、書き込み対象チャンク保持データサーバ識別子）とが同一ならば、ステップＳ１７０５−７へ、そうでなければ、ステップＳ１７０５−９へ遷移する（ステップＳ１７０５−６）。
【０１０４】
ここでは、コピー対象チャンク保持データサーバ識別子がｄｓ２、または、ｄｓ４のときはステップＳ１７０５−７へ、コピー対象チャンク保持データサーバ識別子がｄｓ５のときはステップＳ１７０５−９へ遷移することになる。
【０１０５】
マスタサーバ１００は当該コピー対象チャンク保持データサーバ識別子と当該書き込み対象チャンク保持データサーバ識別子とが同一ならば、当該書き込み位置チャンク識別子をコピー元チャンク識別子とし、書き込み対象チャンク保持データサーバ識別子ｄｓ２（ｄｓ４）で識別される書き込み対象チャンク保持データサーバ２００（４００）へローカルチャンクコピー要求と、当該コピー元チャンク識別子と、当該書き込み対象チャンク識別子とを送信する（ステップＳ１７０５−７）。
【０１０６】
そして、マスタサーバ１００は書き込み対象チャンク保持データサーバ２００（４００）からローカルチャンクコピー応答を受信する（ステップＳ１７０５−８）。
【０１０７】
マスタサーバ１００は当該コピー対象チャンク保持データサーバ識別子と当該書き込み対象チャンク保持データサーバ識別子とが同一でないならば、当該書き込み位置チャンク識別子をコピー元チャンク識別子とし、書き込み対象チャンク保持データサーバ識別子ｄｓ６で識別される書き込み対象チャンク保持データサーバ６００へリモートチャンクコピー要求と、当該コピー元チャンク識別子と、当該書き込み対象チャンク識別子と、当該コピー対象チャンク保持データサーバ識別子リストとを送信する（ステップＳ１７０５−９）。
【０１０８】
そして、マスタサーバ１００は書き込み対象チャンク保持データサーバ６００からリモートチャンクコピー応答を受信する（ステップＳ１７０５−１０）。
【０１０９】
マスタサーバ１００はローカルチャンクコピー応答を受信するか、リモートチャンクコピーを受信すると、当該書き込み対象チャンク保持データサーバ識別子リストへ当該書き込み対象チャンク保持データサーバ識別子ｄｓ２（ｄｓ４、ｄｓ６）を追加する（ステップＳ１７０５−１１）。
【０１１０】
そして、マスタサーバ１００はインデックスを当該コピー対象チャンク保持データサーバ識別子リスト内の次の位置に設定する（ステップＳ１７０５−１２）。
【０１１１】
マスタサーバ１００はコピー対象チャンク保持データサーバ識別子リスト内のすべてのコピー対象チャンク保持データサーバ識別子の処理が完了したら、チャンクテーブル１１２を更新する（ステップＳ１７０５−１３）。具体的には、マスタサーバ１００はファイル管理部１１０のチャンクテーブル１１２に当該書き込み対象チャンク識別子と、参照カウント「１」と、当該書き込み対象チャンク保持データサーバ識別子リストとを登録する。また、マスタサーバ１００はファイル管理部１１０のチャンクテーブル１１２における当該書き込み位置チャンク識別子に対する参照カウントの値を１減少させる。さらに、マスタサーバ１００はファイル管理部１１０のファイルテーブル１１１における当該ファイルパス名に対するチャンク識別子リスト内の当該書き込み位置チャンク識別子を当該書き込み対象チャンク識別子で置き換える。
【０１１２】
図１９の説明に戻って、マスタサーバ１００はプライマリデータサーバ、セカンダリデータサーバを選択する（ステップＳ１７０８）。具体的には、マスタサーバ１００は当該書き込み対象チャンク保持データサーバ識別子リスト内から任意の書き込み対象チャンク保持データサーバ識別子を一つ選択し、当該書き込み対象チャンク保持データサーバ識別子で識別されるデータサーバをこの書き込みにおけるプライマリデータサーバとする。また、当該書き込み対象チャンク保持データサーバ識別子リスト内のその他の書き込み対象チャンク保持データサーバ識別子で識別されるデータサーバをセカンダリデータサーバとする。
【０１１３】
当該書き込み対象チャンク保持データサーバ識別子リスト内で、どの書き込み対象チャンク保持データサーバ識別子がプライマリデータサーバのデータサーバ識別子であるかを判別できるように、例えば、プライマリデータサーバのデータサーバ識別子は当該書き込み対象チャンク保持データサーバ識別子リスト内の先頭に位置するようにする。その他の方法でプライマリデータサーバのデータサーバ識別子を判定できるようにしてもよい。
【０１１４】
ここでは、例として、データサーバ識別子ｄｓ４で識別されるデータサーバ４００がプライマリデータサーバとして、データサーバ識別子ｄｓ２で識別されるデータサーバ２００と、データサーバ識別子ｄｓ６で識別されるデータサーバ６００とがセカンダリデータサーバとして、それぞれ選択されたとする。
【０１１５】
そして、マスタサーバ１００はデータサーバ４００に書き込み制御委譲要求と、当該書き込み対象チャンク識別子と、当該書き込み対象チャンク保持データサーバ識別子リストとを送信する（ステップＳ１７０９）。
【０１１６】
そして、マスタサーバ１００はデータサーバ４００から書き込み制御委譲応答を受信する（ステップＳ１７１０）。続いて、マスタサーバ１００は外部アプリケーション７００へチャンク情報として、当該書き込み対象チャンク識別子と、当該書き込み対象チャンク保持データサーバ識別子リストとを送信する（ステップＳ１７１１）。
【０１１７】
コピーオンライトを発生させる書き込みでは、ステップＳ１７０６とステップＳ１７０７は実行されない。ステップＳ１７０６は参照カウントの値が１であり、複数のファイルに共有されていないチャンクへの書き込み処理、ステップＳ１７０７はチャンクが割り当てられていない書き込み位置への書き込み処理である。
【０１１８】
ここで、図２１を用いて、前述した既存チャンク処理について説明する。マスタサーバ１００は既存チャンク情報を取得する（ステップＳ１７０６−１）。具体的には、マスタサーバ１００は当該書き込み位置チャンク識別子を書き込み対象チャンク識別子とする。また、マスタサーバ１００はファイル管理部１１０のチャンクテーブル１１２における書き込み対象チャンク識別子に対するデータサーバ識別子リストを取得し、書き込み対象チャンク保持データサーバ識別子リストとする。
【０１１９】
ここで、図２２を用いて、前述した新規チャンク処理について説明する。マスタサーバ１００は新規チャンク処理（ステップＳ１７０７−１〜ステップＳ１７０７−９）を実行する。
【０１２０】
まず、マスタサーバ１００は新たなチャンク識別子（以降、書き込み対象チャンク識別子）と、空のデータサーバ識別子リスト（以降、書き込み対象チャンク保持データサーバ識別子リスト）を生成する（ステップＳ１７０７−１）。
【０１２１】
そして、マスタサーバ１００は冗長度の数だけステップＳ１７０７−４からステップＳ１７０７−７の処理を実行する。初めに、ループカウントの値を０に設定する（ステップＳ１７０７−２）。続いて、ループカウントの値が冗長度の数より小さければ、ステップＳ１７０７−４へ、そうでなければ、ステップＳ１７０７−９へ遷移する（ステップＳ１７０７−３）。
【０１２２】
マスタサーバ１００はループカウントの値が冗長度の数より小さければ、新たに生成するチャンクを保持する書き込み対象チャンク保持データサーバを決定する（ステップＳ１７０７−４）。例えば、データ記憶部の空き容量が定められた閾値以上、かつ、保持しているチャンクのうち、参照カウントの値が２以上のチャンクの数が定められた閾値未満のデータサーバのなかから、それぞれ異なるラックに収納されたコンピュータ上で動作するデータサーバを書き込み対象チャンク保持データサーバとして選択する。
【０１２３】
そして、マスタサーバ１００は当該書き込み対象チャンク保持データサーバへチャンク生成要求と、当該書き込み対象チャンク識別子とを送信する（ステップＳ１７０７−５）。続いて、マスタサーバ１００は当該書き込み対象チャンク保持データサーバからチャンク生成応答を受信する（ステップＳ１７０７−６）。
【０１２４】
そして、マスタサーバ１００は当該書き込み対象チャンク保持データサーバ識別子リストへ当該書き込み対象チャンク保持データサーバ識別子を追加する（ステップＳ１７０７−７）。続いて、マスタサーバ１００はループカウントの値を１増加させる（ステップＳ１７０７−８）。
【０１２５】
マスタサーバ１００はループカウントの値が冗長度の数以上ならば、チャンクテーブル１１２を更新する（ステップＳ１７０７−９）。具体的には、マスタサーバ１００はファイル管理部１１０のチャンクテーブル１１２に当該書き込み対象チャンク識別子と、参照カウント「１」と、当該書き込み対象チャンク保持データサーバ識別子リストとを登録する。また、マスタサーバ１００はファイル管理部１１０のファイルテーブル１１１における当該ファイルパス名に対するチャンク識別子リスト内の当該書き込み位置に当該書き込み対象チャンク識別子を追加する。
【０１２６】
［書き込み処理におけるデータサーバの処理の一例］
図２３は、第１の実施形態における書き込み処理において、データサーバ２００（４００）がマスタサーバ１００からローカルチャンクコピー要求を受信したときの動作の一例を示すフローチャートである。
【０１２７】
データサーバ２００（４００）はマスタサーバ１００からローカルチャンクコピー要求と、コピー元チャンク識別子と、書き込み対象チャンク識別子とを受信する（ステップＳ１８０１）。
【０１２８】
そして、データサーバ２００（４００）はローカルにチャンクをコピーする（ステップＳ１８０２）。具体的には、データサーバ２００（４００）はデータ記憶部２１０（４１０）のチャンク情報テーブル２１１（４１１）から当該コピー元チャンク識別子に対するチャンクの格納場所とチャンクのサイズとを取得する。データサーバ２００（４００）は当該チャンク格納場所に格納されているチャンクをコピーし、データ記憶部２１０（４１０）に格納する。また、データサーバ２００（４００）はデータ記憶部２１０（４１０）のチャンク情報テーブル２１１（４１１）に当該書き込み対象チャンク識別子と、コピーしたチャンクの格納場所と、当該チャンクのサイズとを登録する。
【０１２９】
続いて、データサーバ２００（４００）はマスタサーバ１００へローカルチャンクコピー応答を送信する（ステップＳ１８０３）。
【０１３０】
図２４は、第１の実施形態における書き込み処理において、データサーバ６００がマスタサーバ１００からリモートチャンクコピー要求を受信したときの動作の一例を示すフローチャートである。
【０１３１】
データサーバ６００はマスタサーバ１００からリモートチャンクコピー要求と、コピー元チャンク識別子と、書き込み対象チャンク識別子と、コピー対象チャンク保持データサーバ識別子リストとを受信する（ステップＳ１９０１）。
【０１３２】
データサーバ６００は当該コピー対象チャンク保持データサーバ識別子リスト内のコピー対象チャンク保持データサーバ識別子で識別されるデータサーバからチャンクコピー元データサーバを選択する（ステップＳ１９０２）。例えば、最も距離の近いデータサーバをチャンクコピー元データサーバとする。ここでは、例として、データサーバ５００をチャンクコピー元データサーバとして選択したとする。
【０１３３】
そして、データサーバ６００はデータサーバ５００へチャンク読み出し要求と、当該コピー元チャンク識別子とを送信する（ステップＳ１９０３）。続いて、データサーバ６００はデータサーバ５００からチャンクを受信する（ステップＳ１９０４）。
【０１３４】
そして、データサーバ６００はデータ記憶部６１０に受信したチャンクを格納する（ステップＳ１９０５）。また、データサーバ６００はデータ記憶部６１０のチャンク情報テーブル６１１に当該書き込み対象チャンク識別子と、格納したチャンクの格納場所と、当該チャンクのサイズとを登録する。続いて、データサーバ６００はマスタサーバ１００へリモートチャンクコピー応答を送信する（ステップＳ１９０６）。
【０１３５】
図２５は、第１の実施形態における書き込み処理において、データサーバ５００がデータサーバ６００からチャンク読み出し要求を受信したときの動作の一例を示すフローチャートである。
【０１３６】
データサーバ５００はデータサーバ６００からチャンク読み出し要求と、コピー元チャンク識別子とを受信する（ステップＳ２００１）。そして、データサーバ５００はデータ記憶部５１０のチャンク情報テーブル５１１から当該コピー元チャンク識別子に対するチャンクの格納場所を取得し、データ記憶部５１０から当該チャンクを読み出す（ステップＳ２００２）。続いて、データサーバ５００は当該チャンクをデータサーバ６００へ送信する（ステップＳ２００３）。
【０１３７】
図２６は、第１の実施形態における書き込み処理において、データサーバがマスタサーバ１００からチャンク生成要求を受信したときの動作の一例を示すフローチャートである。なお、コピーオンライトを発生させる書き込みでは、図２６に示す処理は実行されない。図２６に示す処理は、チャンクが割り当てられていない位置への書き込みである図１９のステップＳ１７０７を実行したときに実行される。
【０１３８】
データサーバはマスタサーバ１００からチャンク生成要求と、書き込み対象チャンク識別子とを受信する（ステップＳ２１０１）。そして、データサーバはチャンクを生成し、チャンク情報テーブルを更新する（ステップＳ２１０２）。具体的には、データサーバは空のチャンクを生成し、データ記憶部に格納する。また、当該書き込み対象チャンク識別子と、当該チャンクの格納場所と、当該チャンクのサイズ（この時点では０）とをデータ記憶部のチャンク情報テーブルに登録する。その後、データサーバはマスタサーバ１００へチャンク生成応答を送信する（ステップＳ２１０３）。
【０１３９】
図２７は、第１の実施形態における書き込み処理において、プライマリデータサーバであるデータサーバ４００がマスタサーバ１００から書き込み制御委譲要求を受信したときの動作の一例を示すフローチャートである。
【０１４０】
データサーバ４００はマスタサーバ１００から書き込み制御委譲要求と、書き込み対象チャンク識別子と、書き込み対象チャンク保持データサーバ識別子リストとを受信する（ステップＳ２２０１）。
【０１４１】
そして、データサーバ４００は当該書き込み対象チャンク識別子と当該書き込み対象チャンク保持データサーバ識別子リストをメモリに保持する（ステップＳ２２０２）。続いて、データサーバ４００はマスタサーバ１００へ書き込み制御委譲応答を送信する（ステップＳ２２０３）。
【０１４２】
図２８は、第１の実施形態における書き込み処理において、データサーバが外部アプリケーション７００または他のデータサーバからデータ送信要求を受信したときの動作の一例を示すフローチャートである。ここでは、例として、データサーバ２００は外部アプリケーション７００から、データサーバ４００はデータサーバ２００から、データサーバ６００はデータサーバ４００から、それぞれデータ送信要求を受信したとする。
【０１４３】
データサーバ２００（４００、６００）は外部アプリケーション７００（データサーバ２００、４００）からデータ送信要求と、書き込み対象チャンク識別子と、書き込みデータと、書き込み対象チャンク保持データサーバ識別子リストとを受信する（ステップＳ２３０１）。
【０１４４】
そして、データサーバ２００（４００、６００）は当該書き込み対象チャンク識別子と当該書き込みデータとをメモリに保持する（ステップＳ２３０２）。
【０１４５】
続いて、データサーバ２００（４００、６００）は当該書き込み対象チャンク保持データサーバ識別子リストから自身のデータサーバ識別子を削除する（ステップＳ２３０３）。
【０１４６】
そして、データサーバ２００（４００、６００）は当該書き込み対象チャンク保持データサーバ識別子リストが空ならば、ステップＳ２３０７へ、そうでなければ、ステップＳ２３０５へ遷移する（ステップＳ２３０４）。ここでは、データサーバ２００、４００はステップＳ２３０５へ、データサーバ６００はステップＳ２３０７へそれぞれ遷移することになる。
【０１４７】
データサーバ２００（４００）は当該書き込み対象チャンク保持データサーバ識別子リスト内のデータサーバ識別子で識別されるデータサーバから、最も距離の近いデータサーバを選択し、選択したデータサーバへデータ送信要求と、当該書き込み対象チャンク識別子と、当該書き込みデータと、当該書き込み対象チャンク保持データサーバ識別子リストとを送信する（ステップＳ２３０５）。
【０１４８】
ここでは、最も距離の近いデータサーバとして、データサーバ２００はデータサーバ４００を、データサーバ４００はデータサーバ６００をそれぞれ選択することとする。
【０１４９】
そして、データサーバ２００（４００）はデータサーバ４００（６００）からデータ送信応答を受信する（ステップＳ２３０６）。データサーバ２００（４００）はデータ送信応答を受信すると、外部アプリケーション７００（データサーバ２００）へデータ送信応答を送信する（ステップＳ２３０７）。また、データサーバ６００は書き込み対象チャンク保持データサーバ識別子リストが空になると、データサーバ４００へデータ送信応答を送信する（ステップＳ２３０７）。
【０１５０】
図２９は、第１の実施形態における書き込み処理において、プライマリデータサーバであるデータサーバ４００が外部アプリケーション７００から書き込み要求を受信したときの動作の一例を示すフローチャートである。
【０１５１】
データサーバ４００は外部アプリケーション７００から書き込み要求と、書き込み対象チャンク識別子と、書き込み位置とを受信する（ステップＳ２４０１）。
【０１５２】
そして、データサーバ４００はデータ記憶部４１０のチャンク情報テーブル４１１から当該書き込み対象チャンク識別子に対するチャンクの格納場所を取得する（ステップＳ２４０２）。
【０１５３】
続いて、データサーバ４００は図２８のステップＳ２３０２で保持した当該書き込み対象チャンク識別子に対応する当該書き込みデータを当該チャンクの当該書き込み位置に書き込む（ステップＳ２４０３）。
【０１５４】
データサーバ４００はステップＳ２２０２で保持した当該書き込み対象チャンク保持データサーバ識別子リスト内のすべてのセカンダリデータサーバのデータサーバ識別子に対してステップＳ２４０６からステップＳ２４０７の処理を実行する。ここでは、セカンダリデータサーバであるデータサーバ２００とデータサーバ６００に対して処理を実行することになる。
【０１５５】
初めに、当該書き込み対象チャンク保持データサーバ識別子リスト内のデータサーバ識別子の位置を示すインデックスを当該書き込み対象チャンク保持データサーバ識別子リスト内の２番目に設定する（ステップＳ２４０４）。ここでは、プライマリデータサーバのデータサーバ識別子は当該書き込み対象チャンク保持データサーバ識別子リスト内の先頭に位置するものとし、セカンダリデータサーバのデータサーバ識別子は当該書き込み対象チャンク保持データサーバ識別子リスト内の２番目以降に位置するものとする。
【０１５６】
そして、データサーバ４００は当該書き込み対象チャンク保持データサーバ識別子リスト内のすべてのセカンダリデータサーバのデータサーバ識別子の処理が完了したら、ステップＳ２４０９へ遷移する。そうでなければ、ステップＳ２４０６へ遷移する（ステップＳ２４０５）。
【０１５７】
データサーバ４００は当該書き込み対象チャンク保持データサーバ識別子リスト内のすべてのセカンダリデータサーバのデータサーバ識別子の処理が完了していなければ、当該書き込み対象チャンク保持データサーバ識別子リスト内のインデックスの位置のデータサーバ識別子で識別されるデータサーバにセカンダリ書き込み要求と、当該書き込み対象チャンク識別子と、当該書き込み位置とを送信する（ステップＳ２４０６）。
【０１５８】
続いて、データサーバ４００は当該書き込み対象チャンク保持データサーバ識別子リスト内のインデックスの位置のデータサーバ識別子で識別されるデータサーバからセカンダリ書き込み応答を受信する（ステップＳ２４０７）。そしてデータサーバ４００はインデックスを当該書き込み対象チャンク保持データサーバ識別子リスト内の次の位置に設定する（ステップＳ２４０８）。
【０１５９】
データサーバ４００は当該書き込み対象チャンク保持データサーバ識別子リスト内のすべてのセカンダリデータサーバのデータサーバ識別子の処理が完了したら、外部アプリケーション７００へ書き込み応答を送信する（ステップＳ２４０９）。
【０１６０】
図３０は、第１の実施形態における書き込み処理において、セカンダリデータサーバであるデータサーバ２００（６００）がプライマリデータサーバであるデータサーバ４００からセカンダリ書き込み要求を受信したときの動作の一例を示すフローチャートである。
【０１６１】
データサーバ２００（６００）はデータサーバ４００からセカンダリ書き込み要求と、書き込み対象チャンク識別子と、書き込み位置とを受信する（ステップＳ２５０１）。
【０１６２】
そして、データサーバ２００（６００）はデータ記憶部２１０（６１０）のチャンク情報テーブル２１１（６１１）から当該書き込み対象チャンク識別子に対するチャンクの格納場所を取得する（ステップＳ２５０２）。
【０１６３】
続いて、データサーバ２００（６００）は図２８のステップＳ２３０２で保持した当該書き込み対象チャンク識別子に対応する当該書き込みデータを当該チャンクの当該書き込み位置に書き込む（ステップＳ２５０３）。そして、データサーバ２００（６００）はデータサーバ４００へセカンダリ書き込み応答を送信する（ステップＳ２５０４）。
【０１６４】
［第１の実施形態の効果］
このように、第１の実施形態に係るマスタサーバ１００は、複数のデータサーバに格納されたファイルデータであって、固定長のチャンクに分割して格納されたファイルデータに対するスナップショットへの書き込み要求を受け付けた場合に、コピーオンライトにより、該書き込み要求の対象となるチャンクのコピー先のデータサーバを、各データサーバにおけるデータ記憶部の空き容量、コピーされるチャンクを保持しているデータサーバと各データサーバとの距離、各データサーバの負荷状態、各データサーバにおける複数のファイルに共有されているチャンクの数のいずれか一つまたは複数に基づいて決定する。そして、マスタサーバ１００は、決定されたデータサーバに対して、書き込み要求の対象となるチャンクをコピーするように制御する。
【０１６５】
このため、コピーオンライトによるチャンクのコピーにおいて、コピーオンライト戦略に基づいて、チャンクのコピー先となるデータサーバを決定することを可能とする。コピーオンライト戦略は、各データサーバにおけるデータ記憶部の空き容量やデータサーバ間のネットワーク上の距離や各データサーバの負荷状態、各データサーバにおける複数のファイルに共有されているチャンクの数などのいずれか、または任意の組合せなどによって、コピーオンライトにおけるチャンクのコピー先となるデータサーバを決定する。想定されるユースケースに応じて適切なコピーオンライト戦略を用いることにより、データサーバのデータ記憶部の空き容量不足によるチャンクのコピーの失敗を防止したり、データサーバ間で負荷を分散したりすることが可能となる。
【０１６６】
つまり、スナップショットへの書き込みの際のコピーオンライトにおいて、データサーバ内で無条件にチャンクをローカルにコピーするのではなく、データサーバのデータ記憶部の空き容量やデータサーバ間のネットワーク上の距離、データサーバの負荷などを勘案して、データサーバ内でローカルにコピーしたり、別データサーバにコピーしたりすることにより、データ記憶部の空き容量不足による書き込み不可を回避したり、データサーバの負荷を分散したりすることができる。
【０１６７】
（システム構成等）
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、決定部１１３と制御部１１４を統合してもよい。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【０１６８】
また、本実施形態において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１６９】
（プログラム）
また、上記実施形態に係るマスタサーバ１００またはデータサーバ２００（３００、４００、５００、６００）が実行する処理をコンピュータが実行可能な言語で記述したプログラムを作成することもできる。この場合、コンピュータがプログラムを実行することにより、上記実施形態と同様の効果を得ることができる。さらに、かかるプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータに読み込ませて実行することにより上記実施形態と同様の処理を実現してもよい。なお、以下では、マスタサーバ１００と同様の機能を実現するスナップショット制御プログラムを実行するコンピュータの一例を説明する。
【０１７０】
図３１は、スナップショット制御プログラムを実行するコンピュータを示す図である。図３１に示すように、コンピュータ１００００は、例えば、メモリ１０１００と、ＣＰＵ１０２００と、ハードディスクドライブインタフェース１０３００と、ディスクドライブインタフェース１０４００と、シリアルポートインタフェース１０５００と、ビデオアダプタ１０６００と、ネットワークインタフェース１０７００とを有する。これらの各部は、バス１０８００によって接続される。
【０１７１】
メモリ１０１００は、ＲＯＭ（Read  Only  Memory）１０１１０およびＲＡＭ（Random  Access  Memory）１０１２０を含む。ＲＯＭ１０１１０は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３００は、ハードディスクドライブ１０９００に接続される。ディスクドライブインタフェース１０４００は、ディスクドライブ１０４１０に接続される。ディスクドライブ１０４１０には、例えば、磁気ディスクや光ディスク等の着脱可能な記憶媒体が挿入される。シリアルポートインタフェース１０５００には、例えば、マウス１１１００およびキーボード１１２００が接続される。ビデオアダプタ１０６００には、例えば、ディスプレイ１１３００が接続される。
【０１７２】
ここで、図３１に示すように、ハードディスクドライブ１０９００は、例えば、ＯＳ１０９１０、アプリケーションプログラム１０９２０、プログラムモジュール１０９３０およびプログラムデータ１０９４０を記憶する。上記実施形態で説明した各テーブルは、例えばハードディスクドライブ１０９００やメモリ１０１００に記憶される。
【０１７３】
また、スナップショット制御プログラムは、例えば、コンピュータ１００００によって実行される指令が記述されたプログラムモジュールとして、ハードディスクドライブ１０９００に記憶される。具体的には、上記実施形態で説明したマスタサーバ１００が実行する各処理が記述されたプログラムモジュールが、ハードディスクドライブ１０９００に記憶される。
【０１７４】
また、スナップショット制御プログラムによる情報処理に用いられるデータは、プログラムデータとして、例えば、ハードディスクドライブ１０９００に記憶される。そして、ＣＰＵ１０２００が、ハードディスクドライブ１０９００に記憶されたプログラムモジュール１０９３０やプログラムデータ１０９４０を必要に応じてＲＡＭ１０１２０に読み出して、上述した各手順を実行する。
【０１７５】
なお、スナップショット制御プログラムに係るプログラムモジュール１０９３０やプログラムデータ１０９４０は、ハードディスクドライブ１０９００に記憶される場合に限られず、例えば、着脱可能な記憶媒体に記憶されて、ディスクドライブ１０４１０等を介してＣＰＵ１０２００によって読み出されてもよい。あるいは、スナップショット制御プログラムに係るプログラムモジュール１０９３０やプログラムデータ１０９４０は、ＬＡＮ（Local  Area  Network）やＷＡＮ（Wide  Area  Network）等のネットワークを介して接続された他のコンピュータに記憶され、ネットワークインタフェース１０７００を介してＣＰＵ１０２００によって読み出されてもよい。
【符号の説明】
【０１７６】
１００  マスタサーバ
１１０  ファイル管理部
１１１  ファイルテーブル
１１２  チャンクテーブル
１１３  決定部
１１４  制御部
１２０  データサーバ状態管理部
１２１  データサーバ状態管理テーブル
２００、３００、４００、５００、６００  データサーバ
２１０、３１０、４１０、５１０、６１０  データ記憶部
２１１、３１１、４１１、５１１、６１１  チャンク情報テーブル
２２０、３２０、４２０、５２０、６２０  データアクセス部
２３０、３３０、４３０、５３０、６３０  状態通知部
７００  外部アプリケーション
８００  ネットワーク
９００  ファイルデータ
９１０、９２０、９３０、１０１０、１０２０、１０３０、１１３０  チャンク
１０００  ファイル１
１１００  ファイル２
１００００  コンピュータ
１０１００  メモリ
１０１１０  ＲＯＭ
１０１２０  ＲＡＭ
１０２００  ＣＰＵ
１０３００  ハードディスクドライブインタフェース
１０４００  ディスクドライブインタフェース
１０４１０  ディスクドライブ
１０５００  シリアルポートインタフェース
１０６００  ビデオアダプタ
１０７００  ネットワークインタフェース
１０８００  バス
１０９００  ハードディスクドライブ
１０９１０  ＯＳ
１０９２０  アプリケーションプログラム
１０９３０  プログラムモジュール
１０９４０  プログラムデータ
１１１００  マウス
１１２００  キーボード
１１３００  ディスプレイ
【図１】
0005947336.tif 000002
【図２】
0005947336.tif 000003
【図３】
0005947336.tif 000004
【図４】
0005947336.tif 000005
【図５】
0005947336.tif 000006
【図６】
0005947336.tif 000007
【図７】
0005947336.tif 000008
【図８】
0005947336.tif 000009
【図９】
0005947336.tif 000010
【図１０】
0005947336.tif 000011
【図１１】
0005947336.tif 000012
【図１２】
0005947336.tif 000013
【図１３】
0005947336.tif 000014
【図１４】
0005947336.tif 000015
【図１５】
0005947336.tif 000016
【図１６】
0005947336.tif 000017
【図１７】
0005947336.tif 000018
【図１８】
0005947336.tif 000019
【図１９】
0005947336.tif 000020
【図２０】
0005947336.tif 000021
【図２１】
0005947336.tif 000022
【図２２】
0005947336.tif 000023
【図２３】
0005947336.tif 000024
【図２４】
0005947336.tif 000025
【図２５】
0005947336.tif 000026
【図２６】
0005947336.tif 000027
【図２７】
0005947336.tif 000028
【図２８】
0005947336.tif 000029
【図２９】
0005947336.tif 000030
【図３０】
0005947336.tif 000031
【図３１】
0005947336.tif 000032