(57)【要約】【課題】ノード間の通信量を軽減すること。【解決手段】ノード１，２，３は、主データＸ，Ｙ，Ｚのバックアップである副データＸ１，Ｙ１，Ｚ１をノード１，２，３に分散して配置する。副データＹ１を保持するノード１は、副データＹ１に対応する主データＹと主データＹを保持するノード２との対応関係を示す管理情報Ｋ１を自ノードに格納する。副データＺ１を保持するノード２は、副データＺ１に対応する主データＺと主データＺを保持するノード３との対応関係を示す管理情報Ｋ２を自ノードに格納する。副データＸ１を保持するノード３は、副データＸ１に対応する主データＸと主データＸを保持するノード１との対応関係を示す管理情報Ｋ３を自ノードに格納する。【選択図】図１
2015095015.tif 000002
【特許請求の範囲】
【請求項１】
複数の主データが分散して配置された複数のノードを含み、何れかの主データに対するアクセスを受け付けると、主データと当該主データを格納したノードとの対応関係を示す情報によりアクセス先のノードを決定するシステムが実行するデータ配置方法であって、
前記複数の主データのバックアップである複数の副データを前記複数のノードに分散して配置し、
副データを保持するノードに、当該副データに対応する主データと当該主データを保持するノードとの対応関係を示す情報を格納する、
データ配置方法。
【請求項２】
１つの主データに対する副データを少なくとも２つのノードに配置する、請求項１記載のデータ配置方法。
【請求項３】
前記複数のノードに対して許容される同時故障数を取得し、前記同時故障数よりも大きい数を、１つの主データに対し副データを配置するノード数とする、請求項１または２記載のデータ配置方法。
【請求項４】
前記複数の副データの配置先の決定方法として前記複数の主データの配置先の決定方法に依存しない方法を用い、何れかの主データがノード間で移動されても、前記複数の副データの配置を維持する、請求項１乃至３の何れか１項に記載のデータ配置方法。
【請求項５】
何れかのノードが利用できなくなると、他のノードにより当該他のノード自身に格納された前記対応関係を示す情報を参照して、当該他のノードに配置された副データが、利用できなくなったノードに配置された主データに対応するものであるか否かを確認し、当該主データに対応する副データを保持する他のノードを用いて、当該主データを何れかのノードに復元する、請求項１乃至４の何れか１項に記載のデータ配置方法。
【請求項６】
複数の主データが分散して配置された複数のノードを含み、何れかの主データに対するアクセスを受け付けると、主データと当該主データを格納したノードとの対応関係を示す情報によりアクセス先のノードを決定するシステムに用いられるデータ配置プログラムであって、前記複数のノードの１つとして用いられるコンピュータに、
前記複数の主データのバックアップである複数の副データの一部を記憶装置に配置し、
前記記憶装置に保持された副データに対応する主データと当該主データを保持するノードとの対応関係を示す情報を前記記憶装置に格納する、
処理を実行させるデータ配置プログラム。
【請求項７】
複数の主データのうちの何れかの主データに対するアクセスを受け付けると、主データと当該主データを格納したノードとの対応関係を示す情報によりアクセス先のノードを決定する情報処理システムであって、
前記複数の主データおよび前記複数の主データのバックアップである複数の副データを各ノードに分散して配置し、自ノードが保持する副データに対応する主データと当該主データを保持するノードとの対応関係を示す情報を自ノードに格納する複数のノード、
を有する情報処理システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はデータ配置方法、データ配置プログラムおよび情報処理システムに関する。
【背景技術】
【０００２】
現在、ネットワークに接続された複数のノードにデータを分散して格納する分散ストレージシステムが利用されることがある。分散ストレージシステムの一例として、各ノードがデータレコードとしてキーと値（バリュー）の組を記憶する分散キーバリューストアが挙げられる。分散キーバリューストアでは、例えば、キーのハッシュ値に基づいて、複数のノードの中からキーに対応するバリューを記憶すべきノードが決定される。
【０００３】
分散ストレージシステムでは、所定数以下のノードの故障に耐えられるよう、データをコピーして複数のノードに記憶しておくことがある。例えば、同じデータを３台のノードに記憶しておけば、２台までのノードの同時故障に耐えることができる。データを冗長化した場合、同じデータを記憶する複数のノードのうち、１つのノードのみが当該データの読み出しや書き込みなどの命令を受け付けて処理し、他のノードは当該データを専らバックアップデータとして管理することが考えられる。前者の読み書きなどの命令により処理されるデータを主データ、後者のバックアップデータを副データと呼ぶことができる。
【０００４】
複数のノードのリソースを活用するため、主データの管理専用のノードおよび副データの管理専用のノードを設けるのではなく、各ノードが主データおよび副データの両方の管理を担当することが考えられている。例えば、あるサーバにおいて、当該サーバのデータをオリジナルデータ領域に保持し、他のサーバのデータを同期データ領域に保持する提案がある。この提案では、他のサーバで障害が発生すると、当該他のサーバのデータを同期データ領域に保持するサーバを、当該他のサーバの代替として機能させる。
【０００５】
なお、主サイトと同期リモートコピーにより関連付けられる第１の副サイトと、主サイトと非同期リモートコピーにより関連付けられる第２の副サイトとを含むシステムで、主サイトに障害が発生したときの両副サイト間のデータの同期方法が考えられている。また、複数のサーバ上のアプリケーションの更新を行う際に、１つのサーバで更新が失敗すると、全てのサーバで更新を取り消して更新前の状態に戻す提案もある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００９−２６５９７３号公報
【特許文献２】特開２００６−１１９７４５号公報
【特許文献３】特開２００４−８６７６９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
主データと主データを保持するノードとの対応関係を示す情報（管理情報）を各ノードに格納することが考えられる。何れかの主データにアクセスする際に、各ノードは管理情報を用いてアクセス先のノードを決定する。このとき、アクセス先ノードの決定を各ノードで分担すれば、各ノードは全ての主データについて管理情報をもたなくてよく、アクセス先ノードの決定に伴う負荷を分散できる。各ノードで自ノードの管理情報にない主データを保持するノードを特定したいときは、他のノードに問い合わせればよい。
【０００８】
このとき、管理情報を各ノードでどのように分担するかが問題となる。例えば、障害などで利用できなくなったノード（障害ノード）が発生した場合に、各ノードは管理情報により障害ノード上の主データを特定できる。例えば、各ノードは、自身が保持する副データが障害ノード上の主データに対応するものであるかを管理情報により確認し、副データを用いて障害ノード以外のノードに当該主データを復元し得る。ところが、この場合、各ノードは自身が保持する全ての副データについて、障害ノード上の主データに対応するものであるかを確認することになる。このため、各ノードに管理情報を無作為に分担させると、ノード間での問い合わせが多発し、ノード間の通信量が増大するおそれがある。
【０００９】
１つの側面では、本発明は、ノード間の通信量を軽減できるデータ配置方法、データ配置プログラムおよび情報処理システムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
１つの態様では、データ配置方法が提供される。このデータ配置方法では、複数の主データが分散して配置された複数のノードを含み、何れかの主データに対するアクセスを受け付けると、主データと当該主データを格納したノードとの対応関係を示す情報によりアクセス先のノードを決定するシステムが、複数の主データのバックアップである複数の副データを複数のノードに分散して配置し、副データを保持するノードに、当該副データに対応する主データと当該主データを保持するノードとの対応関係を示す情報を格納する。
【００１１】
また、１つの態様では、コンピュータによって実行されるデータ配置プログラムであって、複数の主データが分散して配置された複数のノードを含み、何れかの主データに対するアクセスを受け付けると、主データと当該主データを格納したノードとの対応関係を示す情報によりアクセス先のノードを決定するシステムに用いられるデータ配置プログラムが提供される。このデータ配置プログラムは、複数のノードの１つとして用いられるコンピュータに、複数の主データのバックアップである複数の副データの一部を記憶装置に配置し、記憶装置に保持された副データに対応する主データと当該主データを保持するノードとの対応関係を示す情報を記憶装置に格納する。
【００１２】
また、１つの態様では、複数の主データのうちの何れかの主データに対するアクセスを受け付けると、主データと当該主データを格納したノードとの対応関係を示す情報によりアクセス先のノードを決定する情報処理システムが提供される。この情報処理システムは、複数の主データおよび複数の主データのバックアップである複数の副データを各ノードに分散して配置し、自ノードが保持する副データに対応する主データと当該主データを保持するノードとの対応関係を示す情報を自ノードに格納する複数のノードを有する。
【発明の効果】
【００１３】
１つの側面では、ノード間の通信量を軽減できる。
【図面の簡単な説明】
【００１４】
【図１】第１の実施の形態の情報処理システムを示す図である。
【図２】第２の実施の形態の情報処理システムを示す図である。
【図３】マスタデータの配置例を示す図である。
【図４】ノードのハードウェア例を示す図である。
【図５】ノードの機能例を示す図である。
【図６】セグメント管理テーブルの例を示す図である。
【図７】セグメント担当テーブルの例を示す図である。
【図８】バックアップ担当テーブルの例を示す図である。
【図９】バックアップデータの配置例を示す図である。
【図１０】バックアップデータの配置例を示すフローチャートである。
【図１１】マスタデータの配置変更例を示すフローチャートである。
【図１２】障害時の処理例を示すフローチャートである。
【図１３】バックアップデータの配置変更例を示すフローチャートである。
【図１４】障害時のマスタデータの配置例を示す図である。
【図１５】障害時のバックアップデータの配置例を示す図である。
【図１６】マスタデータの配置変更の具体例を示す図である。
【図１７】障害時の処理の具体例を示す図である。
【図１８】障害時の処理の具体例（続き）を示す図である。
【図１９】マスタデータの配置変更の比較例を示す図である。
【図２０】障害時の処理の比較例を示す図である。
【発明を実施するための形態】
【００１５】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の情報処理システムを示す図である。第１の実施の形態の情報処理システムは、ノード１，２，３を含む。ノード１，２，３はネットワークを介して接続されている。ノード１，２，３は、情報処理装置やストレージ装置でもよい。例えば、ノード１，２，３は、ＲＡＭ（Random Access Memory）やＨＤＤ（Hard Disk Drive）などの記憶装置とＣＰＵ（Central Processing Unit）やＡＳＩＣ（Application Specific Integrated Circuit）などのプロセッサとを備えたコンピュータでもよい。以下に示す処理は、ノード１，２，３の各記憶装置に記憶されたプログラムをノード１，２，３の各プロセッサにより実行することで実現されてもよい。以下の説明において、ノード１，２，３が記憶する各種の情報は、ノード１，２，３が備える各記憶装置に格納される。
【００１６】
ノード１，２，３は、複数のデータを分散して保持する。ノード１，２，３は、クライアント装置（図示を省略）から、何れかのデータに対する書き込みや読み出しなどの命令（データに対するアクセス）を受け付ける。ここで、クライアント装置からのアクセスに対して処理されるデータを主データと呼ぶこととする。ノード１，２，３は、何れかの主データに対するアクセスを受け付けると、主データと主データを格納したノードとの対応関係を示す情報によりアクセス先のノードを決定する。当該情報を管理情報と呼ぶこととする。
【００１７】
ノード１，２，３は、複数の主データのバックアップである複数の副データを分散して保持する。ノード１，２，３は、自ノードが保持する副データに対応する主データと当該主データを保持するノードとの対応関係を示す管理情報を自ノードに格納する。対応関係は、主データに対してノードを直接的に対応付けたものでもよいし、主データに対してノードを間接的に対応付けたものでもよい。主データに対してノードを間接的に対応付ける方法としては、例えば、管理情報では主データと所定のキーとを対応付けておき、当該キーを用いた別の演算（例えば、キーからハッシュ値を求める演算）により担当のノードを決定する方法が考えられる。
【００１８】
例えば、ノード１，２，３は主データＸ，Ｙ，Ｚを分散して記憶する。具体的には、主データＸはノード１に、主データＹはノード２に、主データＺはノード３に、それぞれ保持されている。
【００１９】
また、ノード１，２，３は副データＸ１，Ｙ１，Ｚ１を分散して保持する。副データＸ１は主データＸのバックアップである。副データＹ１は主データＹのバックアップである。副データＺ１は主データＺのバックアップである。具体的には、副データＸ１はノード３に、副データＹ１はノード１に、副データＺ１はノード２にそれぞれ保持されている。例えば、ノード１，２，３は相互に通信して、主データＸ，Ｙ，Ｚに対する更新内容を副データＸ１，Ｙ１，Ｚ１にも反映させる。
【００２０】
この場合、ノード１は管理情報Ｋ１を記憶する。管理情報Ｋ１は、主データＹとノード２との対応関係を示す情報である。ノード１は副データＹ１を保持するからである。ノード２は管理情報Ｋ２を記憶する。管理情報Ｋ２は、主データＺとノード３との対応関係を示す情報である。ノード２は副データＺ１を保持するからである。ノード３は管理情報Ｋ３を記憶する。管理情報Ｋ３は、主データＸとノード１との対応関係を示す情報である。ノード３は副データＸ１を保持するからである。
【００２１】
第１の実施の形態の情報処理システムによれば、複数の主データおよび複数の副データが、複数のノードに分散して配置される。副データを保持するノードに、その副データに対応する主データと当該主データを保持する他のノードとの対応関係を示す管理情報が格納される。
【００２２】
これにより、主データを復元する際のノード間の通信量を軽減できる。ここで、障害などで利用できなくなったノード（障害ノード）が発生した場合に、各ノードは管理情報により障害ノード上の主データを特定できる。例えば、各ノードは、自身が保持する副データが障害ノード上の主データに対応するものであるかを管理情報により確認し、副データを用いて障害ノード以外のノードに当該主データを復元し得る。ところが、この場合、各ノードは自身が保持する全ての副データについて、障害ノード上の主データに対応するものであるかを確認することになる。このため、各ノードにより管理情報を無作為に分担させると、ノード間での問い合わせが多発し、それに伴い通信量が増大するおそれがある。
【００２３】
具体的には、仮に、ノード１が副データＹ１と管理情報Ｋ２とを保持し、ノード２が副データＺ１と管理情報Ｋ１とを保持する場合を考える。この場合で、障害などによりノード３を利用できなくなったとする。すると、ノード１は、自身が保持する副データＹ１がノード３上の主データＺに対応するものであるかをノード２に問い合わせることになる。また、ノード２は、自身が保持する副データＺ１がノード３上の主データＺに対応するものであるかをノード１に問い合わせることになる。このように、各ノードによる管理情報の分担状況によってノード間の問い合わせが生じ得る。ノード間の問い合わせに伴う通信量は、問い合わせ対象となるデータ数が多い程増大し、ネットワークの負荷を高める要因になる。
【００２４】
これに対し、第１の実施の形態では、ノード１は副データＹ１と管理情報Ｋ１とを記憶する。ノード２は副データＺ１と管理情報Ｋ２とを記憶する。ノード３は副データＸ１と管理情報Ｋ３とを記憶する。このため、仮にノード３を利用できなくなったとしても、ノード１は管理情報Ｋ１を参照することで、副データＹ１がノード３上の主データＺに対応するものであるかを確認できる。また、ノード２は管理情報Ｋ２を参照することで、副データＺ１がノード３上の主データＺに対応するものであるかを確認できる。すなわち、ノード１，２は、各自が保持する副データがノード３上の主データＺに対応するものであるかを、他のノードに問い合わせなくてもよい。よって、主データを復元する際のノード間の通信量を軽減できる。
【００２５】
なお、この場合、ノード２がノード３上の主データＺに対応する副データＺ１を保持しているので、ノード２がノード１，２の何れか（ノード３の代わりに主データＺに対する処理を担当するノード）に、主データＺを復元することになる。
【００２６】
また、主データ（例えば、主データＺ）と当該主データに対応する副データ（例えば、副データＺ１）とが同一ノード（例えば、ノード３）に配置されると、当該ノードを利用できなくなったときに当該主データの復元が難しくなる可能性もある。そこで、１つの主データに対して少なくとも２つのノードに、当該主データに対する副データを配置することも考えられる。例えば、主データＺをノード３で保持している場合、副データＺ１をノード２，３の両方で保持し、管理情報Ｋ２をノード２，３の両方に格納する。そうすれば、仮にノード３が利用できなくなったとしても、ノード２により主データＺを復元できる。これにより、情報処理システムの障害に対する信頼性を向上することができる。
【００２７】
［第２の実施の形態］
図２は、第２の実施の形態の情報処理システムを示す図である。第２の実施の形態の情報処理システムは、クライアント２１およびノード１００，２００，３００を含む。ノード１００，２００，３００およびクライアント２１は、ネットワーク１０に接続されている。ネットワーク１０は、ＬＡＮ（Local Area Network）でもよいし、ＷＡＮ（Wide Area Network）やインターネットなどの広域ネットワークでもよい。
【００２８】
クライアント２１は、ユーザが操作する端末装置としてのコンピュータである。クライアント２１は、データの読み出し（リード）やデータの書き込み（ライト）を行うとき、ノード１００，２００，３００の何れかにアクセスする。アクセス先のノードとしては、データの内容にかかわらず任意のノードを選択してよい。すなわち、この情報処理システムはボトルネックとなり得る集中管理ノードをもたず、全てのノードはクライアント２１からのアクセスを受け付けることができる。また、クライアント２１は、所望のデータが何れのノードに記憶されているか知らなくてよい。
【００２９】
ノード１００，２００，３００は、データを不揮発性の記憶装置に格納して管理するサーバコンピュータである。ノード１００，２００，３００が記憶するデータには、マスタデータが含まれる。マスタデータとは、主にクライアント２１からの読み出しや書き込みなどの命令（アクセス）に応じて処理されるデータである。ノード１００，２００，３００のマスタデータに対する処理をマスタ処理ということができる。マスタデータは第１の実施の形態の主データの一例である。
【００３０】
ここで、ノード１００，２００，３００は、マスタデータＡ，Ｂ，Ｃ，Ｄを記憶する。ノード１００，２００，３００は、マスタデータＡ，Ｂ，Ｃ，Ｄをセグメントと呼ばれる単位で管理する。セグメントとは、各ノードで利用可能な記憶領域の単位である。ノード１００，２００，３００は、あるマスタデータに対してクライアント２１からアクセスを受け付けたとき、セグメント単位で（各ノードが備える）キャッシュ（例えば、ＲＡＭの所定の記憶領域）への先読みを行う。例えば、連続してアクセスされる可能性の高いマスタデータ同士を同一のセグメントに配置することで、クライアント２１からの以後のアクセスに対してキャッシュヒット率を向上し得る。
【００３１】
具体的には、ノード１００はセグメントＳＧ０を有する。セグメントＳＧ０にはマスタデータＡ，Ｂが配置されている。ノード２００はセグメントＳＧ１を有する。セグメントＳＧ１にはマスタデータＣが配置されている。ノード３００はセグメントＳＧ２を有する。セグメントＳＧ２にはマスタデータＤが配置されている。連続してアクセスされる可能性の高いマスタデータの組が見出されていないときは、セグメントＳＧ１，ＳＧ２のように単一のマスタデータが配置されることもある。
【００３２】
また、後述するように、ノード１００，２００，３００はマスタデータのバックアップであるバックアップデータを記憶する。バックアップデータにはマスタ処理に応じた更新内容が反映される。バックアップデータをマスタデータと同期させる処理をバックアップ処理ということができる。バックアップデータは第１の実施の形態の副データの一例である。
【００３３】
すなわち、第２の実施の形態の情報処理システムでは、耐障害性を高めるためデータが冗長化され、同じデータが複数のノードに重複して記憶される。同じデータを記憶する複数のノードのうち、１つのノードがそのデータについてのクライアント２１からのアクセスを処理し、他のノードはそのデータを専らバックアップコピーとして管理する。あるデータにとって、マスタ処理を担当するノードをマスタノード、バックアップ処理を担当するノードをバックアップノードと呼ぶことがある。各ノードではマスタ処理とバックアップ処理を混在させることがあり、その際、各ノードは何れかのデータにとってのマスタノードである（マスタ処理を担当する）と共に、何れかのデータにとってのバックアップノードになる（バックアップ処理を担当する）。後述するように、１つのノードが１つのデータに対して、バックアップノードおよびマスタノードの両方の役割を担うこともある。
【００３４】
なお、バックアップデータは、クライアント２１が読み出し命令を発行したときの読み出し対象としては使用されない。ただし、クライアント２１が書き込み命令を発行してマスタデータ（バックアップデータに対応するオリジナルのデータ）が更新された場合には、データの一貫性を維持するために、マスタデータに対応するバックアップデータは更新され得る。
【００３５】
各ノードには、セグメントのＩＤ（セグメントＩＤ）のハッシュ値に基づいて、マスタ処理を担当すべきマスタデータが割り当てられる。クライアント２１からアクセスを受け付けたノードは、クライアント２１から指定されたマスタデータのデータ名から、そのマスタデータが属するセグメントのセグメントＩＤを取得する。そして、当該ノードは、セグメントＩＤのハッシュ値を算出し、そのデータ名が示すマスタデータのマスタ処理を担当するマスタノードを判定する。判定されたマスタノードが他のノードであるときは、アクセスが当該他のノードに転送される。
【００３６】
図３は、マスタデータの配置例を示す図である。マスタデータをノード１００，２００，３００に配置するにあたって、図３に示すように、セグメントＩＤのハッシュ値の値域を円状に繋げたハッシュ空間を定義する。例えば、ハッシュ値がＬビットで表されるとき、２L−１（ハッシュ値の最大）の次のハッシュ値が０に戻るような循環するハッシュ空間が定義される。
【００３７】
ハッシュ空間上には、各ノードに対応する点（ハッシュ値）を設定する。ノードに対応するハッシュ値は、例えば、そのノードのＩＰ（Internet Protocol）アドレスなどのアドレスのハッシュ値とする。図３の例では、ノード１００，２００，３００に対応するハッシュ値ｖ０，ｖ１，ｖ２（ｖ０＜ｖ１＜ｖ２）が、それぞれハッシュ空間上に設定される。そして、隣接する２つのノードのハッシュ値によって挟まれる区間毎に、セグメントＩＤのハッシュ値が割り当てられる。例えば、各ノードは、ハッシュ空間上で１つ後ろのノードとの間の区間に属するセグメントに含まれるマスタデータのマスタ処理を担当する。
【００３８】
一例として、ｈｖ（）をハッシュ関数とし、ｖ２とｖ０の間に“０”があるとする。この場合、区間ｖ０≦ｈｖ（ｋｅｙ）＜ｖ１に属するセグメントＳＧ０に含まれるマスタデータＡ，Ｂのマスタ処理はノード１００が担当する（ただし、ｋｅｙにはセグメントＩＤが代入される。図３において以下同様）。区間ｖ１≦ｈｖ（ｋｅｙ）＜ｖ２に属するセグメントＳＧ１に含まれるマスタデータＣのマスタ処理はノード２００が担当する。区間ｖ２≦ｈｖ（ｋｅｙ）≦２L−１または０≦ｈｖ（ｋｅｙ）＜ｈ０に属するセグメントＳＧ２に含まれるマスタデータＤのマスタ処理はノード３００が担当する。
【００３９】
なお、各ノードがバックアップ処理を担当すべきバックアップデータの割り当て方法は、マスタデータの割り当て方法とは異なる（後述する）。
図４は、ノードのハードウェア例を示す図である。ノード１００は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ１０３、通信部１０４、画像信号処理部１０５、入力信号処理部１０６、ディスクドライブ１０７および機器接続部１０８を有する。各ユニットがノード１００のバスに接続されている。
【００４０】
プロセッサ１０１は、ノード１００の情報処理を制御する。プロセッサ１０１は、ＣＰＵやＤＳＰ（Digital Signal Processor）でもよいし、ＡＳＩＣやＦＰＧＡ（Field Programmable Gate Array）などの特定用途の電子回路でもよい。また、「プロセッサ」は、複数のプロセッサの集合（マルチプロセッサ）であってもよい。
【００４１】
ＲＡＭ１０２は、ノード１００の主記憶装置である。ＲＡＭ１０２は、プロセッサ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１０２は、プロセッサ１０１による処理に用いる各種データを記憶する。
【００４２】
ＨＤＤ１０３は、ノード１００の補助記憶装置である。ＨＤＤ１０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。ノード１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００４３】
通信部１０４は、ネットワーク１０を介して他のコンピュータと通信を行えるインタフェースである。通信部１０４は、有線インタフェースでもよいし、無線インタフェースでもよい。
【００４４】
画像信号処理部１０５は、プロセッサ１０１からの命令に従って、ノード１００に接続されたディスプレイ１１に画像を出力する。ディスプレイ１１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００４５】
入力信号処理部１０６は、ノード１００に接続された入力デバイス１２から入力信号を取得し、プロセッサ１０１に出力する。入力デバイス１２としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００４６】
ディスクドライブ１０７は、レーザ光などを利用して、光ディスク１３に記録されたプログラムやデータを読み取る駆動装置である。光ディスク１３として、例えば、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などを使用できる。ディスクドライブ１０７は、例えば、プロセッサ１０１からの命令に従って、光ディスク１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００４７】
機器接続部１０８は、ノード１００に周辺機器を接続するための通信インタフェースである。例えば、機器接続部１０８にはメモリ装置１４やリーダライタ装置１５を接続できる。メモリ装置１４は、機器接続部１０８との通信機能を搭載した記録媒体である。リーダライタ装置１５は、メモリカード１６へのデータの書き込み、またはメモリカード１６からのデータの読み出しを行う装置である。メモリカード１６は、カード型の記録媒体である。機器接続部１０８は、例えば、プロセッサ１０１からの命令に従って、メモリ装置１４またはメモリカード１６から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００４８】
ただし、ノード１００はディスクドライブ１０７や機器接続部１０８を備えなくてもよく、ノード１００に対するユーザ操作がクライアント２１などの他の装置から行える場合には画像信号処理部１０５や入力信号処理部１０６を備えなくてもよい。また、ディスプレイ１１や入力デバイス１２は、ノード１００の筐体と一体に形成されていてもよいし、ワイヤレスで接続されていてもよい。クライアント２１やノード２００，３００もノード１００と同様のユニットを用いて実現できる。
【００４９】
図５は、ノードの機能例を示す図である。ノード１００は、マスタ記憶部１１０、バックアップ記憶部１２０、マスタ処理部１３０およびバックアップ処理部１４０を有する。
マスタ記憶部１１０は、ＨＤＤ１０３に確保される不揮発性の記憶領域である。マスタ記憶部１１０は、マスタデータを記憶する記憶領域とマスタデータのノード配置（何れのノードに配置されるか）を管理するための情報を記憶する記憶領域とを含む。前者の記憶領域は、セグメント単位に分割されている。当該記憶領域は、前述のように、マスタ記憶部１１０はセグメントＳＧ０を含む。
【００５０】
また、マスタデータのノード配置を管理するための情報は、セグメント管理テーブルおよびセグメント担当テーブルを含む。セグメント管理テーブルは、マスタデータが何れのセグメントに属しているかを示す情報である。セグメント担当テーブルは、セグメントＩＤと担当ノードとの対応関係を示す情報である。セグメント管理テーブルおよびセグメント担当テーブルの両方を用いると、マスタデータとそのマスタ処理を担当するマスタノードを特定できる。よって、セグメント管理テーブルおよびセグメント担当テーブルは、第１の実施の形態の管理情報の一例であるということができる。
【００５１】
バックアップ記憶部１２０は、ＨＤＤ１０３に確保される不揮発性の記憶領域である。バックアップ記憶部１２０は、バックアップデータを記憶する記憶領域とバックアップデータのノード配置を管理するための情報を記憶する記憶領域とを含む。バックアップデータのノード配置は、バックアップデータのデータ名（キー）のハッシュ値に応じて定まる。これは、マスタデータのノード配置が、マスタデータが属するセグメントのセグメントＩＤのハッシュ値に応じて定まる点と異なる。すなわち、マスタデータのノード配置と、バックアップデータのノード配置とは、それぞれ別個の方法によって決定される。よって、マスタ記憶部１１０に記憶されたマスタデータに対応するバックアップデータが、バックアップ記憶部１２０に格納されることもある。
【００５２】
マスタ処理部１３０は、クライアント２１からのアクセスとしてのデータ操作命令を、クライアント２１または他のノードからネットワーク１０を介して受信する。データ操作命令の種類には、データ名を指定した読み出し命令（リード命令）や、データ名と値を指定した書き込み命令（ライト命令）が含まれる。マスタ処理部１３０は、マスタ記憶部１１０に記憶されたセグメント管理テーブルを参照して、データ操作命令で指定されたデータ名に対応するセグメントＩＤを取得する。マスタ処理部１３０は、そのセグメントＩＤからハッシュ値を算出し、マスタ記憶部１１０に記憶されたセグメント担当テーブルを参照して、そのデータ操作命令を実行すべきマスタノードを検索する。検索されたマスタノードが他のノードである場合、マスタ処理部１３０は、データ操作命令を検索されたマスタノードに転送する。
【００５３】
検索されたマスタノードがノード１００である場合、マスタ処理部１３０は、データ操作命令を実行し、実行結果を示す応答メッセージをクライアント２１に送信する。すなわち、データ操作命令が読み出し命令である場合、マスタ処理部１３０は、指定されたデータ名が示すマスタデータをマスタ記憶部１１０から読み出し、読み出したマスタデータをクライアント２１に送信する。データ操作命令が書き込み命令である場合、マスタ処理部１３０は、指定されたデータが属するマスタ記憶部１１０のセグメントを選択し（または新たなセグメントを割り当て）、選択したセグメントにデータ名と対応付けて当該データを書き込む。
【００５４】
マスタ処理部１３０は、複数のマスタデータに対するクライアント２１からのアクセスパターンに応じて、セグメントに対するマスタデータの配置を変更することもある（この場合、セグメント管理テーブルを更新する）。例えば、連続してアクセスされる頻度の高い所定数（第２の実施の形態では２個を想定する）のマスタデータを同一セグメントに配置する。マスタ処理部１３０は、セグメント単位にキャッシュ（図示を省略）への先読みを行うことで、クライアント２１からのアクセスに対するキャッシュヒット率を向上し得る。ここで、キャッシュは、マスタ記憶部１１０に対して設けられたＲＡＭ上の記憶領域である。キャッシュを利用することでマスタデータへのアクセスの高速化を図れる。
【００５５】
バックアップ処理部１４０は、バックアップ記憶部１２０に記憶されたバックアップデータに、マスタデータの更新内容を反映する。例えば、マスタ記憶部１１０に記憶されたマスタデータに対応するバックアップデータがバックアップ記憶部１２０に記憶されている場合を考える。この場合、バックアップ処理部１４０は、マスタ処理部１３０によるマスタデータの更新内容をマスタ処理部１３０から取得する。バックアップ処理部１４０は、そのマスタデータに対応するバックアップデータをバックアップ記憶部１２０から検索し、検索したバックアップデータに取得した更新内容を反映させる。
【００５６】
また、例えば、他のノードに記憶されたマスタデータに対応するバックアップデータがバックアップ記憶部１２０に記憶されている場合を考える。この場合、バックアップ処理部１４０は、他のノードによる当該マスタデータの更新内容を当該他のノードから取得する。バックアップ処理部１４０は、そのマスタデータに対応するバックアップデータをバックアップ記憶部１２０から検索し、取得した更新内容を反映させる。
【００５７】
バックアップ処理部１４０は、マスタ記憶部１１０にマスタデータが新たに書き込まれた場合、そのマスタデータを複製してバックアップデータを生成する。更に、バックアップデータのデータ名からハッシュ値を算出し、バックアップ記憶部１２０に記憶されたバックアップ担当テーブルを参照して、そのバックアップデータを管理すべきバックアップノードを検索する。
【００５８】
検索されたバックアップノードが他のノードである場合、バックアップ処理部１４０は、当該バックアップデータをバックアップノードに転送する。検索されたバックアップノードがノード１００である場合、バックアップ処理部１４０は、データ名と対応付けて、そのバックアップデータをバックアップ記憶部１２０に書き込む。後述するように１つのマスタデータに対して、２以上のバックアップノードが割り当てられる。あるデータのバックアップノードの１つは、そのデータのマスタノードと同一でもよい。例えば、あるデータにとってのマスタノードがノード１００である場合に、そのデータにとってのバックアップノードの１つがノード１００であることもある。その場合、ノード１００は当該データに対して、マスタデータとバックアップデータとの両方を保持することになる。
【００５９】
バックアップ処理部１４０は、ノード２００，３００と通信して、何れかのノードにおける障害の有無を監視する。具体的には、バックアップ処理部１４０は、所定の死活監視用のパケット（例えば、ｐｉｎｇ）をノード２００，３００に送信して、その応答状況からノード２００，３００が通信可能であるか否かを検出し得る。例えば、宛先のノードから応答パケットを取得できれば、そのノードは通信可能であり正常であると判断できる。宛先のノードから応答パケットを得られなければ、そのノードは通信不能であり障害により利用不可であると判断できる。
【００６０】
バックアップ処理部１４０は、障害の発生したノード（障害ノード）がある場合に、マスタデータの復元処理を実行する。具体的には、バックアップ処理部１４０は、そのマスタデータに対応するバックアップデータがバックアップ記憶部１２０に格納されていれば、そのマスタデータを正常なノード上に復元する。復元先のノードは、障害ノードの代わりに、そのマスタデータを担当することになったノードである。このとき、バックアップ処理部１４０は、他のノードと通信して、情報処理システム内に、そのマスタデータに対するバックアップデータが少なくとも２つのノード上に配置されるように制御する。
【００６１】
ここで、バックアップデータを何個のノード上に配置するかは、ユーザが確保したいデータの複製数に依る。ここで、第２の実施の形態では、マスタデータに対するバックアップデータが、そのマスタデータと同一のノードに配置される可能性もある。このため、ユーザが確保したいデータの複製数に１を加算した個数のノード上に、バックアップデータを配置する。例えば、ユーザは、情報処理システムの運用開始時に、クライアント２１や入力デバイス１２を操作して、確保したいデータの複製数をノード１００に入力できる。バックアップ処理部１４０は、受け付けた複製数に１を加算した個数のノード上に、バックアップデータを配置すると決定する。例えば、複製数として１を指定されたなら、２個のノード上にバックアップデータを配置すると決定することになる。バックアップ処理部１４０は、ノード２００，３００にも当該決定内容を通知する。
【００６２】
なお、マスタ処理部１３０およびバックアップ処理部１４０は、ＣＰＵ１０１に実行させるプログラムのモジュールとして実現することができる。ただし、これらのモジュールの機能の一部または全部を、特定用途の集積回路を用いて実現してもよい。
【００６３】
また、ノード２００，３００もノード１００と同様のモジュールを有する。ノード２００は、マスタ記憶部２１０、バックアップ記憶部２２０、マスタ処理部２３０およびバックアップ処理部２４０を有する。ノード３００は、マスタ記憶部３１０、バックアップ記憶部３２０、マスタ処理部３３０およびバックアップ処理部３４０を有する。各モジュールは、ノード１００の同名のモジュールと同様の機能であるため、説明を省略する。
【００６４】
図６は、セグメント管理テーブルの例を示す図である。図６（Ａ）はセグメント管理テーブル１１１を例示している。セグメント管理テーブル１１１はマスタ記憶部１１０に格納される。図６（Ｂ）はセグメント管理テーブル２１１を例示している。セグメント管理テーブル２１１はマスタ記憶部２１０に格納される。図６（Ｃ）はセグメント管理テーブル３１１を例示している。セグメント管理テーブル３１１はマスタ記憶部３１０に格納される。セグメント管理テーブル１１１，２１１，３１１はデータ名およびセグメントＩＤの項目を含む。
【００６５】
データ名の項目には、マスタデータのデータ名が登録される。セグメントＩＤの項目にはセグメントＩＤが登録される。例えば、セグメント管理テーブル１１１には、データ名が“Ａ”、セグメントＩＤが“ＳＧ０”という情報が登録される。これは、マスタデータＡがセグメントＳＧ０に属していることを示す。
【００６６】
このように、ノード１００，２００，３００は、マスタデータとセグメントとの対応関係の一部を記憶していればよい。自ノードが保持するセグメント管理テーブルにエントリされていないマスタデータに対するアクセスを受け付けたときは、他のノードに問い合わせればよい。例えば、ノード１００がマスタデータＢに対するアクセスを受け付けたとしても、セグメント管理テーブル１１１にはマスタデータＢのエントリがない。このため、ノード１００は、マスタデータＢに対応するセグメントをノード２００やノード３００に問い合わせることで、そのセグメントを把握できる。
【００６７】
図７は、セグメント担当テーブルの例を示す図である。セグメント担当テーブル１１２は、マスタ記憶部１１０に格納される。セグメント担当テーブル１１２は、セグメントＩＤのハッシュ値の値域およびノードＩＤの項目を含む。
【００６８】
セグメントＩＤのハッシュ値の値域の項目には、ハッシュ関数ｈｖを用いたときのセグメントＩＤのハッシュ値の値域が登録される。ノードＩＤの項目には、ノードＩＤが登録される。
【００６９】
例えば、セグメント担当テーブル１１２には、セグメントＩＤのハッシュ値の値域が“ｖ０≦ｈｖ（ｋｅｙ）＜ｖ１”、ノードＩＤが“＃０”という情報が登録される。ここで、“ｋｅｙ”にはセグメントＩＤが代入される。これは、図３で説明したように、区間ｖ０≦ｈｖ（ｋｅｙ）＜ｖ１に属するセグメントに含まれるマスタデータのマスタ処理はノード１００が担当することを示す。
【００７０】
セグメント担当テーブル１１２に登録された他のハッシュ値の値域とノードＩＤとの対応も、図３で説明した他のハッシュ値の値域とノードＩＤとの対応と同様である。また、セグメント担当テーブル１１２と同様の情報は、マスタ記憶部２１０，３１０にも格納される。
【００７１】
図８は、バックアップ担当テーブルの例を示す図である。バックアップ担当テーブル１２１は、バックアップ記憶部１２０に格納される。バックアップ担当テーブル１２１は、データ名のハッシュ値の値域およびノードＩＤの項目を含む。
【００７２】
データ名のハッシュ値の値域の項目には、ハッシュ関数ｈを用いたときのバックアップデータのデータ名のハッシュ値の値域が登録される。ここで、バックアップデータのデータ名は、マスタデータのデータ名と同一でもよいし、マスタデータのデータ名を所定の規則に従って変更したものでもよい（例えば、所定の文字列を付加するなど）。ノードＩＤの項目には、ノードＩＤが登録される。
【００７３】
ここで、バックアップノードは、マスタノードの決定方法には依存しない方法で決定される。バックアップノードをノード１００，２００，３００に配置するにあたって、図３で例示したハッシュ空間とは別個のハッシュ空間を定義する。バックアップノードの決定に用いるハッシュ空間は、バックアップデータのデータ名のハッシュ値の値域を円状に繋げたものである。例えば、ハッシュ値がＭビットで表されるとき、２M−１（ハッシュ値の最大）の次のハッシュ値が０に戻るような循環するハッシュ空間が定義される。
【００７４】
このハッシュ空間上では、ノード１００，２００，３００に対応するハッシュ値をハッシュ値ｈ０，ｈ１，ｈ２（ｈ０＜ｈ１＜ｈ２）とし、ｈ２とｈ０の間に“０”があるとする。ノードに対応するハッシュ値は、マスタデータの場合と同様に、例えば、そのノードのＩＰアドレスなどのアドレスのハッシュ値とする。バックアップ担当テーブル１２１では、バックアップデータを２つのノードに配置する場合を例示する。
【００７５】
例えば、バックアップ担当テーブル１２１には、データ名のハッシュ値の値域が“ｈ０≦ｈ（ｋｅｙ）＜ｈ２”、ノードＩＤが“＃０”という情報が登録される。ハッシュ関数ｈ（ｋｅｙ）の“ｋｅｙ”にはバックアップデータのデータ名が代入される。これは、区間ｈ０≦ｈ（ｋｅｙ）＜ｈ２に属するバックアップデータのバックアップ処理はノード１００が担当することを示す。
【００７６】
また、バックアップ担当テーブル１２１には、データ名のハッシュ値の値域が“ｈ１≦ｈ（ｋｅｙ）≦２M−１，０≦ｈ（ｋｅｙ）＜ｈ０”、ノードＩＤが“＃１”という情報が登録される。これは、区間ｈ１≦ｈ（ｋｅｙ）≦２M−１，０≦ｈ（ｋｅｙ）＜ｈ０に属するバックアップデータのバックアップ処理はノード２００が担当することを示す。
【００７７】
また、バックアップ担当テーブル１２１には、データ名のハッシュ値の値域が“ｈ２≦ｈ（ｋｅｙ）≦２M−１，０≦ｈ（ｋｅｙ）＜ｈ１”、ノードＩＤが“＃２”という情報が登録される。これは、区間ｈ２≦ｈ（ｋｅｙ）≦２M−１，０≦ｈ（ｋｅｙ）＜ｈ１に属するバックアップデータのバックアップ処理はノード３００が担当することを示す。
【００７８】
このように、バックアップデータを２つのノードに配置する場合、各ノードは、ハッシュ空間上で２つ後ろのノードとの間の区間に属するバックアップデータのバックアップ処理を担当する。なお、バックアップ担当テーブル１２１と同様の情報は、バックアップ記憶部２２０，３２０にも格納される。
【００７９】
図９は、バックアップデータの配置例を示す図である。図９では、バックアップ担当テーブル１２１で示されるバックアップノードの割り当て方法を図示している。区間ｈ０≦ｈ（ｋｅｙ）＜ｈ２に属するバックアップデータＣ，Ｄ，Ａのバックアップ処理はノード１００が担当する（ただし、“ｋｅｙ”にはバックアップデータのデータ名が代入される。図９において以下同様）。区間ｈ１≦ｈ（ｋｅｙ）≦２M−１，０≦ｈ（ｋｅｙ）＜ｈ０に属するバックアップデータＤ，Ａ，Ｂのバックアップ処理はノード２００が担当する。区間ｈ２≦ｈ（ｋｅｙ）≦２M−１，０≦ｈ（ｋｅｙ）＜ｈ１に属するバックアップデータＢ，Ｃのバックアップ処理はノード３００が担当する。
【００８０】
なお、ハッシュ関数ｈｖとハッシュ関数ｈとを同一の関数としてもよい。その場合、ｈ０＝ｖ０、ｈ１＝ｖ１、ｈ２＝ｖ２である。
図１０は、バックアップデータの配置例を示すフローチャートである。以下、図１０に示す処理をステップ番号に沿って説明する。以下では、主にノード１００に着目して、その手順を例示するが、ノード２００，３００も同様の手順を実行可能である。以下のステップＳ１１の直前では、ノード１００，２００，３００上には各マスタデータは配置されているが、バックアップデータは配置されていないものとする。
【００８１】
（Ｓ１１）バックアップ処理部１４０は、データの複製数Ｎ（Ｎは１以上の整数）の指定をクライアント２１から受け付ける。複製数Ｎは、許容される（情報処理システムの運用を継続すべき）ノードの同時故障数の上限を表しているということができる。例えば、Ｎ＝１であれば、１つのノードの故障に対して、マスタデータが失われないよう耐障害性を確保することを意味する。例えば、ユーザは、クライアント２１（または、入力デバイス１２）を操作して、複製数Ｎをノード１００に入力することができる。
【００８２】
（Ｓ１２）バックアップ処理部１４０は、指定された複製数Ｎに対してＮ＋１をバックアップノードの数と決定する。バックアップ処理部１４０は、決定したバックアップノードの数をノード２００，３００に通知する。ここでは、Ｎ＝１が指定された場合を想定する。この場合、１つのマスタデータに対するバックアップノードの数は２であり、各バックアップデータの担当ノードは、バックアップ担当テーブル１２１によって定められる。
【００８３】
（Ｓ１３）バックアップ処理部１４０は、マスタ記憶部１１０に記憶されたマスタデータのデータ名からバックアップデータ（ただし、この段階では未作成）のデータ名を決定する。前述のように、バックアップデータのデータ名は、マスタデータのデータ名と同一でもよいし、所定の規則により変更したものでもよい。バックアップ処理部１４０は、当該バックアップデータのデータ名をハッシュ関数ｈ（）に入力してハッシュ値を算出し、バックアップ担当テーブル１２１を参照して、当該マスタデータに対応する２つのバックアップノードを特定する。前述の例でいえば、マスタデータＡに対応する２つのバックアップノードは、ノード１００，２００である。なお、バックアップ処理部１４０は、マスタ記憶部１１０に記憶されたマスタデータ毎に、ステップＳ１３の処理を実行する。
【００８４】
（Ｓ１４）バックアップ処理部１４０は、マスタ記憶部１１０に記憶された１つのマスタデータに対して２つのバックアップデータを、ステップＳ１３で特定した２つのバックアップノードに配置する。前述の例でいえば、マスタデータＡに対して、ノード１００，２００の２つのノードにマスタデータＡのバックアップデータを配置する。その結果、バックアップ記憶部１２０，２２０に、マスタデータＡのバックアップデータが格納される。マスタデータＢも同様に処理される。バックアップ処理部１４０は、他のノードから自ノード（ノード１００）が担当するバックアップデータを受信することもある。その場合、バックアップ処理部１４０は、受信したバックアップデータをバックアップ記憶部１２０に格納する。
【００８５】
（Ｓ１５）バックアップ処理部１４０は、自ノードに配置されたバックアップデータに対応するマスタデータとセグメントＩＤとの対応関係をセグメント管理テーブル１１１に登録する。
【００８６】
このようにして、ノード１００，２００，３００はバックアップデータの配置を行う。なお、ステップＳ１２において、バックアップ処理部１４０，２４０，３４０は、バックアップノードの数に応じて、バックアップ担当テーブルを変更する。例えば、バックアップデータを３つのノードに配置するなら（Ｎ＝２の場合）、各ノードは、ハッシュ空間上で３つ後ろのノードとの間の区間に属するバックアップデータのバックアップ処理を担当するようバックアップ担当テーブルを作成することになる。ノードを４つ以上設け、バックアップデータを４つ以上のノードに配置する場合（Ｎ≧３の場合）も同様である。
【００８７】
ユーザにより指定された複製数よりも多い数のバックアップノードを設ける理由は、次の通りである。すなわち、マスタノードとバックアップノードとの決定を互いに独立した方法で行うため、マスタデータと、そのマスタデータに対応するバックアップデータとが同一のノードに配置される可能性があるからである。ユーザによって指定された複製数分のノードで同時に障害が起こっても運用を継続できるように、バックアップデータを指定された複製数Ｎよりも多くのノードに配置することで、ユーザの所望する耐障害性を確保できる。
【００８８】
また、複製数Ｎ“＋１”とするのは、最低限のバックアップデータ数でユーザの所望する耐障害性を確保するためである。これにより、“＋２”以上とする場合よりも、各ノードでバックアップデータを保持するための記憶領域を節約しながら、ユーザの所望する耐障害性を確保できる。ただし、バックアップノードの数を複製数Ｎ＋２以上とすることを妨げるものではない。
【００８９】
図１１は、マスタデータの配置変更例を示すフローチャートである。以下、図１１に示す処理をステップ番号に沿って説明する。以下では、主にノード１００に着目して、その手順を例示するが、ノード２００，３００も同様の手順を実行可能である。
【００９０】
（Ｓ２１）マスタ処理部１３０は、各ノード上の各マスタデータについてのアクセスパターン（各マスタデータに対するアクセス履歴）を他のノードと共有する。マスタ処理部１３０は、アクセスパターンから、連続してアクセスされる頻度の高かったマスタデータ同士を同じセグメント上に配置する。例えば、ノード１００上のセグメントＳＧ０に対して、別のセグメントに属していたマスタデータを新たに配置することもある。その場合、マスタ処理部１３０は、対象のマスタデータを他のノードから受信し、マスタ記憶部１１０上のセグメントＳＧ０に格納する。また、セグメントＳＧ０に属していたマスタデータを別のセグメントに配置することもある。その場合、マスタ処理部１３０は、対象のマスタデータを当該他のノードに送信する。
【００９１】
（Ｓ２２）マスタ処理部１３０は、ステップＳ２１における変更内容に従って、セグメント管理テーブル１１１を更新する。セグメントＳＧ０に属するマスタデータの配置替えがなかったとしても、バックアップ記憶部１２０に記憶されたバックアップデータに対応するマスタデータが配置替えされていれば、セグメント管理テーブル１１１の更新は行われることになる。また、バックアップ処理部１４０は、マスタ処理部１３０によるマスタデータの配置替えが行われても、バックアップデータの配置替えを行わない。すなわち、平常時において、各ノード上のバックアップデータの配置は維持される。
【００９２】
なお、マスタ処理部１３０は、任意のタイミングで、ステップＳ２１を開始することができる。例えば、各マスタデータに対するアクセスパターンを所定期間取得した後のタイミングが考えられる。
【００９３】
図１２は、障害時の処理例を示すフローチャートである。以下、図１２に示す処理をステップ番号に沿って説明する。以下では、主にノード１００に着目して、その手順を例示するが、ノード２００，３００も同様の手順を実行可能である。また、一例としてノード３００で障害が発生する場合を想定するが、他のノードで障害が発生する場合も同様の手順となる。
【００９４】
（Ｓ３１）バックアップ処理部１４０は、ノード３００が障害により利用不可となったことを検出する。例えば、バックアップ処理部１４０は、ノード２００，３００との間で死活監視用のパケットを送受信することで、ノード２００，３００における障害の有無を検出できる。
【００９５】
（Ｓ３２）バックアップ処理部１４０は、セグメント担当テーブル１１２に基づいて、ノード３００が担当していたセグメントを特定する。具体的には、バックアップ処理部１４０は、ノード１００，２００，３００上の全てのセグメントＩＤについて関数ｈｖ（）によるハッシュ値を算出し、セグメント担当テーブル１１２からノード３００が担当していたセグメントＳＧ２を特定する。なお、ノード１００，２００，３００上の全てのセグメントＩＤは、各ノードに予め格納される。
【００９６】
（Ｓ３３）バックアップ処理部１４０は、ステップＳ３２で特定したセグメントＳＧ２の担当ノード（セグメントＳＧ２に属するマスタデータのマスタノードに相当）を決定する。具体的には、図３のハッシュ空間において、障害のあったノードの担当区間を、そのノードよりも１つ前の区間のノードに担当させる（セグメント担当テーブル１１２のハッシュ値の値域を変更する）。ノード３００の障害に対して、ノード３００が担当していたセグメントＳＧ２は、ノード２００の担当になる。すなわち、セグメントＳＧ２に属するマスタデータのマスタ処理はノード２００の担当になる。
【００９７】
（Ｓ３４）バックアップ処理部１４０は、セグメント管理テーブル１１１を参照して、バックアップ記憶部１２０に記憶されたバックアップデータのうち、ステップＳ３２で特定したセグメントＳＧ２に属するマスタデータに対応するものを検索する。
【００９８】
（Ｓ３５）バックアップ処理部１４０は、ステップＳ３４の検索の結果、何れかのバックアップデータを検索できたか否かを判定する。検索できた場合、処理をステップＳ３６に進める。検索できなかった場合、処理をステップＳ３７に進める。
【００９９】
（Ｓ３６）バックアップ処理部１４０は、検索されたバックアップデータを複製して、ステップＳ３３で決定されたノード２００上のセグメントＳＧ２に配置する。その結果、ノード２００上のセグメントＳＧ２にマスタデータが復元される。
【０１００】
（Ｓ３７）バックアップ処理部１４０は、他のノードと連携してバックアップデータの配置変更を行う。具体的には、情報処理システムとして１つのマスタデータに対するバックアップノードの数が２以上（本例では複製数Ｎ＋１＝１＋１＝２なので２）となるように、バックアップデータの配置を変更する。
【０１０１】
なお、ステップＳ３４，Ｓ３５では、同一のバックアップデータが複数のノードで検索されることもある。例えば、ノード３００で障害があったとき、ノード３００上のセグメントＳＧ２に属する１つのマスタデータに対応するバックアップデータがノード１００，２００の両方に格納されていれば、ノード１００，２００の両方で当該バックアップデータが検索される。その場合、ノード１００，２００の両方がノード２００上のセグメントＳＧ２に対してマスタデータの復元を重複して行うことになる（上書きすればよい）。
【０１０２】
ただし、何れか一方のノードが当該マスタデータの復元を行ってもよい。重複して復元を行うのは冗長だからである。この場合、新たな担当がノード２００であれば、ノード２００にマスタデータの復元を行わせることが考えられる。ノード１００に当該マスタデータの復元を行わせる場合よりも、ノード１００，２００間の通信を抑えられるからである。また、ノードＩＤが小さい（または大きい）方のノードにマスタデータの復元を行わせることも考えられる。
【０１０３】
図１３は、バックアップデータの配置変更例を示すフローチャートである。以下、図１３に示す処理をステップ番号に沿って説明する。図１３に示す処理はステップＳ３７の処理に対応する。以下では、主にノード１００に着目して、その手順を例示するが、ノード２００，３００も同様の手順を実行可能である。また、図１２に続きノード３００で障害が発生した場合を想定するが、他のノードで障害が発生する場合も同様の手順となる。
【０１０４】
（Ｓ４１）バックアップ処理部１４０は、バックアップ担当テーブル１２１に基づいて、障害のあったノード３００が担当していたバックアップデータを特定する。具体的には、バックアップ処理部１４０は、ノード１００，２００，３００上の全てのバックアップデータのデータ名について関数ｈ（）によるハッシュ値を算出し、バックアップ担当テーブル１２１からノード３００が担当していたバックアップデータを特定する。なお、ノード１００，２００，３００上の全てのバックアップデータのデータ名は、各ノードに予め格納される。あるいは、バックアップ処理部１４０は、ノード２００と通信して、ノード１００，２００上で２つ存在していないバックアップデータを、ノード３００が担当していたバックアップデータと特定してもよい。
【０１０５】
（Ｓ４２）バックアップ処理部１４０は、ステップＳ４１で特定したバックアップデータのバックアップ処理を担当するノードを決定する。具体的には、バックアップ処理部１４０は、１つのマスタデータに対するバックアップデータがノード１００，２００の両方（２つ）に配置されるように、バックアップ担当テーブル１２１を更新する。１つのマスタデータに対するバックアップノード数２を確保するためである。図９の例でいえば、バックアップ処理部１４０は、ノード３００の担当区間の前半部をノード１００の担当区間に結合し、ノード３００の担当区間の後半部をノード２００の担当区間に結合する。その結果、１つのマスタデータに対するバックアップノード数２が確保される。
【０１０６】
（Ｓ４３）バックアップ処理部１４０は、更新後のバックアップ担当テーブル１２１を参照して、ステップＳ４１で特定したバックアップデータのうち、自ノード（ノード１００）が新たに担当することになったバックアップデータがあるか否かを判定する。ある場合、処理をステップＳ４４に進める。ない場合、処理を終了する。
【０１０７】
（Ｓ４４）バックアップ処理部１４０は、自ノードが新たに担当することになったバックアップデータを取得する。例えば、バックアップ処理部１４０は、当該バックアップデータを他のノードから取得することができる。あるいは、当該バックアップデータに対応するマスタデータがマスタ記憶部１１０に記憶されている場合は、そのマスタデータを複製することで当該バックアップデータを取得することもできる。バックアップ処理部１４０は、取得したバックアップデータをバックアップ記憶部１２０に格納する。
【０１０８】
（Ｓ４５）バックアップ処理部１４０は、セグメント管理テーブル１１１を更新する。具体的には、他のノードから取得したバックアップデータに対応するマスタデータについて、当該マスタデータとセグメントとの対応関係をセグメント管理テーブル１１１に登録する。なお、バックアップ処理部１４０は、当該マスタデータとセグメントとの対応関係を自ノードで確認できなければ、他のノードに問い合わせることで確認できる。
【０１０９】
このようにして、各ノードは何れかのノードに障害があった場合に、バックアップデータの配置を変更する。このとき、複製数Ｎ＋１（第２の実施の形態ではＮ＋１＝２）を維持する（１つのマスタデータに対してバックアップノードを２つ設ける）。また、各ノードは、バックアップデータの配置変更に伴い、自ノードで保持するバックアップデータに対応するマスタデータとセグメントとの対応関係をセグメント管理テーブル１１１に登録する。
【０１１０】
図１４は、障害時のマスタデータの配置例を示す図である。図１４では、ノード３００に障害が発生した場合を想定している。図１２のステップＳ３３で説明したように、ノード３００で障害が発生すると、（セグメントに対する）ハッシュ空間上のノード３００の担当区間をノード２００の担当区間に結合する。その結果、ノード２００の担当区間は、ｖ１≦ｈｖ（ｋｅｙ）≦２L−１，０≦ｈｖ（ｋｅｙ）＜ｖ０となる。図１４の例では、ノード２００はマスタデータＣ，Ｄのマスタノードとなる。担当区間の変更は各ノードが保持するセグメント担当テーブルに反映される。なお、図１４の例では、ノード１００の担当区間は変更なしである。
【０１１１】
図１５は、障害時のバックアップデータの配置例を示す図である。図１５では、ノード３００に障害が発生した場合を想定している。図１３のステップＳ４２で説明したように、ノード３００で障害が発生すると、（バックアップデータに対する）ハッシュ空間上のノード３００の担当区間の前半部をノード１００の担当区間に結合する。その結果、ノード１００の担当区間は、ｈ０≦ｈ（ｋｅｙ）≦２M−１，０≦ｈ（ｋｅｙ）＜ｈ０となる。また、ノード３００の担当区間の後半部をノード２００の担当区間に結合する。その結果、ノード２００の担当区間は、ｈ１≦ｈ（ｋｅｙ）≦２M−１，０≦ｈ（ｋｅｙ）＜ｈ１となる。これは、変更後のノード１００の担当区間と同一の区間である。担当区間の変更は各ノードが保持するバックアップ担当テーブルに反映される。
【０１１２】
次に、ノード１００，２００，３００に関する一連の処理を例示して、第２の実施の形態のデータ配置方法の具体例を説明する。マスタデータの各ノードにおける初期配置を、セグメント管理テーブル１１１，２１１，３１１およびセグメント担当テーブル１１２で示される配置とする。バックアップデータの各ノードにおける初期配置を、バックアップ担当テーブル１２１で示される配置とする。また、バックアップデータを区別するために、例えばマスタデータＡに対するバックアップデータをバックアップデータＡ１，Ａ２のように数字を付加した符号を用いて表記する。
【０１１３】
図１６は、マスタデータの配置変更の具体例を示す図である。以下、図１６に示す処理をステップ番号に沿って説明する。
（ＳＴ１０１）ノード１００のセグメントＳＧ０には、マスタデータＡ，Ｂが配置されている。ノード１００には、バックアップデータＣ１，Ｄ１，Ａ１が配置されている。ノード２００のセグメントＳＧ１には、マスタデータＣが配置されている。ノード２００には、バックアップデータＤ２，Ａ２，Ｂ１が配置されている。ノード３００のセグメントＳＧ２には、マスタデータＤが配置されている。ノード３００には、バックアップデータＢ２，Ｃ２が配置されている。
【０１１４】
（ＳＴ１０２）ノード１００，２００，３００は、マスタデータＡ，Ｂ，Ｃ，Ｄに対するアクセスパターンの変化に伴って、セグメントＳＧ０，ＳＧ１，ＳＧ２における各マスタデータの配置を変更する。例えば、マスタデータＢ，Ｄが連続してアクセスされる可能性が高まったため、マスタデータＢはセグメントＳＧ２に移動される。その後、マスタデータＣ，Ｄが連続してアクセスされる可能性が高まったため、マスタデータＤはセグメントＳＧ１に移動される。各マスタデータの配置が変更されても、各バックアップデータの配置は維持される。
【０１１５】
（ＳＴ１０３）ノード１００，２００，３００は、各マスタデータの配置変更に伴って、セグメント管理テーブル１１１，２１１，３１１の設定を変更する。具体的には、ノード１００は、セグメント管理テーブル１１１において、マスタデータＤに対するセグメントＩＤを“ＳＧ１”に変更する。ノード２００は、セグメント管理テーブル２１１において、マスタデータＢに対するセグメントＩＤを“ＳＧ２”に変更する。ノード２００は、セグメント管理テーブル２１１において、マスタデータＤに対するセグメントＩＤを“ＳＧ１”に変更する。ノード３００は、セグメント管理テーブル３１１において、マスタデータＢに対するセグメントＩＤを“ＳＧ２”に変更する。
【０１１６】
図１７は、障害時の処理の具体例を示す図である。以下、図１７に示す処理をステップ番号に沿って説明する。なお、図１７では、図１６で説明したマスタデータの配置変更後の状態を、各マスタデータの初期配置とする。
【０１１７】
（ＳＴ２０１）ノード１００，２００は、ノード３００が障害により利用不可となったことを検出する。ノード１００，２００は、ノード３００にはセグメントＳＧ２が存在していたことを検出する。
【０１１８】
（ＳＴ２０２）ノード１００，２００は、ノード３００の代わりにノード２００がセグメントＳＧ２を担当すると決定する。
（ＳＴ２０３）ノード１００は、セグメント管理テーブル１１１を参照して、バックアップ記憶部１２０に格納されたバックアップデータＣ１，Ｄ１，Ａ１のうち、セグメントＳＧ２に属するマスタデータに対応するものを検索する。セグメント管理テーブル１１１には、セグメントＳＧ２に対応するマスタデータのエントリはないので、検索結果なしとなる。ノード２００は、セグメント管理テーブル２１１を参照して、バックアップ記憶部２２０に格納されたバックアップデータＤ２，Ａ２，Ｂ１のうち、セグメントＳＧ２に属するマスタデータに対応するものを検索する。セグメント管理テーブル２１１には、セグメントＳＧ２に属するマスタデータＢのエントリがあるので、検索結果はバックアップデータＢ１となる。
【０１１９】
図１８は、障害時の処理の具体例（続き）を示す図である。以下、図１８に示す処理をステップ番号に沿って説明する。
（ＳＴ２０４）ノード２００は、バックアップ記憶部２２０に記憶されたバックアップデータＢ１を複製して、マスタ記憶部２１０のセグメントＳＧ２に対応する記憶領域に格納する。
【０１２０】
（ＳＴ２０５）ノード１００，２００は、図１５で例示したように、バックアップ担当テーブルの設定を変更する。変更後のバックアップ担当テーブルによれば、ノード１００はマスタデータＡ，Ｂ，Ｃ，Ｄに対する全てのバックアップデータを保持することになる。同様に、ノード２００はマスタデータＡ，Ｂ，Ｃ，Ｄに対する全てのバックアップデータを保持することになる。
【０１２１】
ノード１００では、マスタデータＢに対するバックアップデータが不足している。よって、ノード１００は、ノード２００からバックアップデータＢ３を取得し、バックアップ記憶部１２０に格納する。ノード２００では、マスタデータＣに対するバックアップデータが不足している。よって、ノード２００は、ノード１００からバックアップデータＣ３を取得し、バックアップ記憶部２２０に格納する。なお、ノード２００上のセグメントＳＧ１には、マスタデータＣが格納されている。このため、ノード２００は、バックアップデータＣ３をノード１００から取得するのではなく、マスタデータＣの複製をバックアップデータＣ３として取得し、バックアップ記憶部２２０に格納してもよい。
【０１２２】
（ＳＴ２０６）ノード１００は、セグメント管理テーブル１１１にマスタデータＢとセグメントＳＧ２との対応関係を示すエントリを追加する。ノード１００は新たにバックアップデータＢ３を保持するからである。なお、ノード１００は、マスタデータＢに対応するセグメントＩＤを自ノードで確認できなければ、例えばノード２００に問い合わせることで、当該セグメントＩＤを確認できる。また、ノード２００は、セグメント管理テーブル２１１にマスタデータＣとセグメントＳＧ１との対応関係を示すエントリを追加する。ノード２００は新たにバックアップデータＣ３を保持するからである。
【０１２３】
次に、第２の実施の形態のデータ配置方法を用いない場合を比較例として説明する。
図１９は、マスタデータの配置変更の比較例を示す図である。図１９では、ノード１００ａ，２００ａ，３００ａが例示されている。ノード１００ａ，２００ａ，３００ａは、例えばコンピュータによって実現される。ノード１００ａ，２００ａ，３００ａはネットワークで接続されており互いに通信可能である（図示を省略）。ノード１００ａは、セグメントＳＧ０を有する。ノード２００ａは、セグメントＳＧ１を有する。ノード３００ａは、セグメントＳＧ２を有する。
【０１２４】
図１９において各データの初期配置を次の通りとする。セグメントＳＧ０はマスタデータＡ，Ｂを含む。セグメントＳＧ１はマスタデータＣを含む。セグメントＳＧ２はマスタデータＤを含む。
【０１２５】
図１９（Ａ）は、マスタデータの配置変更に伴って、バックアップデータの配置も変更する例を示している。図１９（Ａ）の例では、マスタノードおよびバックアップノードの決定方法として次のような方法を想定している。図３で例示したハッシュ空間において、ノード１００のハッシュ値をノード１００ａのハッシュ値に、ノード２００のハッシュ値をノード２００ａのハッシュ値に、ノード３００のハッシュ値をノード３００ａのハッシュ値に置き換えた場合を考える。すると、図３と同様の考え方により、マスタデータＡ，Ｂ，Ｃ，Ｄを保持するマスタノードが決定される。
【０１２６】
更に、各ノードは、当該ハッシュ空間において自ノードの担当区間よりも１つ前のノードの担当区間に属するセグメントに含まれるマスタデータに対し、バックアップノードとして機能する。すなわち、ノード１００ａは、バックアップデータＤ１を保持する。ノード２００ａは、バックアップデータＡ１，Ｂ１を保持する。ノード３００ａは、バックアップデータＣ１を保持する。
【０１２７】
図１９（Ａ）において、マスタデータＢをセグメントＳＧ０からセグメントＳＧ１に移動させる場合を考える。図１９（Ａ）で想定しているバックアップノードの決定方法によれば、ノード３００ａが、マスタデータＢに対するバックアップノードとして機能することになる。よって、バックアップデータＢ１は、ノード２００ａからノード３００ａへ移動される。
【０１２８】
図１９（Ａ）の方法を採ると、マスタデータの移動のたびに、バックアップデータの移動も行われることになる。すなわち、各ノードにバックアップデータの移動のための負荷も生じることになる。この負荷は、マスタデータの移動の頻度が多い程増大する。また、各ノードに配置するバックアップデータの複製数が多い程、その複製数分の移動を伴うので、各ノードの負荷も増大する。
【０１２９】
これに対し、第２の実施の形態のノード１００，２００，３００は、ノード間でマスタデータが移動されても、バックアップデータの移動を行わない。このため、図１９（Ａ）のようにマスタデータの移動のたびにバックアップデータの移動を行う場合に比べて、マスタデータ移動時の各ノードの負荷を軽減できる。
【０１３０】
ただし、図１９（Ｂ）で示すように、マスタデータＢをセグメントＳＧ０からセグメントＳＧ１に移動させた際に、バックアップデータＢ１がノード２００ａ上に配置されていることもある。すると、ノード２００ａが障害で利用できなくなったときに、マスタデータＢの復旧が困難になるおそれがある。
【０１３１】
そこで、第２の実施の形態のノード１００，２００，３００では、１つのマスタデータに対して、少なくとも２つのバックアップノードを設ける。これにより、仮に、何れかのマスタデータと当該マスタデータに対応するバックアップデータとが同一ノードに配置され、そのノードで障害が起きても、他のノードに当該マスタデータに対応するバックアップデータが少なくとも１つは保持されることになる。したがって、他のノードに保持されたバックアップデータを用いて、障害ノードが担当していたマスタデータを復元できる。
【０１３２】
図２０は、障害時の処理の比較例を示す図である。図２０では、図１９で示したノード１００ａ，２００ａ，３００ａに加えてノード４００ａも例示している。ノード１００ａは、セグメントＳＧ０を有する。ノード２００ａは、セグメントＳＧ１を有する。ノード３００ａは、セグメントＳＧ２を有する。ノード４００ａは、セグメントＳＧ３を有する。図２０では各ノードにマスタデータＡ，Ｂ，Ｃ，Ｄ，Ｅを配置する。具体的には、セグメントＳＧ０はマスタデータＡ，Ｂを含む。セグメントＳＧ１はマスタデータＣを含む。セグメントＳＧ２はマスタデータＤを含む。セグメントＳＧ３はマスタデータＥを含む。
【０１３３】
また、図２０では、図１９（Ａ）で例示した方法を用いて各マスタデータに対するバックアップノードを決定する。具体的には、ノード１００ａは、バックアップデータＥ１を保持する。ノード２００ａは、バックアップデータＡ１，Ｂ１を保持する。ノード３００ａは、バックアップデータＣ１を保持する。ノード４００ａは、バックアップデータＤ１を保持する。
【０１３４】
この場合に、データとセグメントＩＤとの対応関係の情報（セグメント管理テーブル）を各ノードに分担して保持させることを考える。ところが、各ノードが保持するセグメント管理テーブルの内容を無作為に決定すると、何れかのノードが障害などで利用できなくなり、バックアップノードから障害ノード上のマスタデータを復元しようとする場合にノード間の通信量が増大し得る。
【０１３５】
例えば、ノード１００ａは、セグメント管理テーブル１１１ａを有する。セグメント管理テーブル１１１ａには、マスタデータＣとセグメントＳＧ１との対応が登録されている。ノード２００ａは、セグメント管理テーブル２１１ａを有する。セグメント管理テーブル２１１ａには、マスタデータＥとセグメントＳＧ３との対応およびマスタデータＤとセグメントＳＧ２との対応が登録されている。
【０１３６】
ノード３００ａは、セグメント管理テーブル３１１ａを有する。セグメント管理テーブル３１１ａには、マスタデータＢとセグメントＳＧ０との対応が登録されている。ノード４００ａは、セグメント管理テーブル４１１ａを有する。セグメント管理テーブル４１１ａには、マスタデータＡとセグメントＳＧ０との対応が登録されている。
【０１３７】
この状況で、例えば、ノード４００ａが障害により利用できなくなると、各ノードは、自ノードが保持するバックアップデータがノード４００ａ上のセグメントＳＧ３に属するマスタデータに対応するものであるかを確認することになる。例えば、ノード１００ａは、バックアップデータＥ１に対応するマスタデータＥが何れのセグメントに属するものかをノード２００ａ，３００ａに問い合わせる。ノード２００ａは、バックアップデータＡ１，Ｂ１に対応するマスタデータＡ，Ｂが何れのセグメントに属するものかをノード１００ａ，３００ａに問い合わせる。ノード３００ａは、バックアップデータＣ１に対応するマスタデータＣが何れのセグメントに属するものかをノード１００ａ，２００ａに問い合わせる。
【０１３８】
この場合、ノード１００ａは、ノード２００ａからの応答によりマスタデータＥがセグメントＳＧ３に属する旨を確認できる。よって、ノード１００ａのバックアップデータＥ１を用いて、セグメントＳＧ３（ノード１００ａ，２００ａ，３００ａの何れかが新たに担当する）上にマスタデータＥを復元することになる。
【０１３９】
しかし、この例では、ノード１００ａ，２００ａ，３００ａの間で多数の問い合わせが行われることになり、マスタデータを復元する際のノード間の通信量が増大する。このように、各ノードによるセグメント管理テーブルの分担状況によってノード間の問い合わせが生じ得る。ノード間の問い合わせに伴う通信量は、問い合わせ対象となるデータ数が多い程増大し、ネットワークの負荷を高める要因になる。
【０１４０】
そこで、第２の実施の形態では、あるノードで保持されるバックアップデータに対するマスタデータとセグメントＩＤとの対応関係を示すセグメント管理テーブルを、そのノードに格納する。したがって、何れかのノードで障害が起きても、各ノードは、各自が保持するセグメント管理テーブルを参照することで、自ノードが保持するバックアップデータが障害ノード上のセグメントに属していたマスタデータに対応するものであるかを確認できる。このため、各ノードは図２０の例のように、他のノードへの問い合わせを行わなくてもよい。よって、マスタデータを復元する際のノード間の通信量を軽減できる。
【０１４１】
なお、第１，第２の実施の形態の情報処理は、各ノードが備えるプロセッサにプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体（例えば、光ディスク１３、メモリ装置１４およびメモリカード１６など）に記録できる。
【０１４２】
例えば、プログラムを記録した記録媒体を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭ１０２やＨＤＤ１０３などの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【０１４３】
１，２，３  ノード
Ｋ１，Ｋ２，Ｋ３  管理情報
Ｘ，Ｙ，Ｚ  主データ
Ｘ１，Ｙ１，Ｚ１  副データ
【図１】
2015095015.tif 000003
【図２】
2015095015.tif 000004
【図３】
2015095015.tif 000005
【図４】
2015095015.tif 000006
【図５】
2015095015.tif 000007
【図６】
2015095015.tif 000008
【図７】
2015095015.tif 000009
【図８】
2015095015.tif 000010
【図９】
2015095015.tif 000011
【図１０】
2015095015.tif 000012
【図１１】
2015095015.tif 000013
【図１２】
2015095015.tif 000014
【図１３】
2015095015.tif 000015
【図１４】
2015095015.tif 000016
【図１５】
2015095015.tif 000017
【図１６】
2015095015.tif 000018
【図１７】
2015095015.tif 000019
【図１８】
2015095015.tif 000020
【図１９】
2015095015.tif 000021
【図２０】
2015095015.tif 000022