説明

ノード決定プログラム、ノード決定装置およびノード決定方法

【課題】指定した割合に応じてデータを分散させた上で、ノード数の増減時におけるノード間のデータ移動を減らすこと。
【解決手段】ノード決定装置101は、ノードN1〜N3ごとに、それぞれ異なる関数f_1()〜f_3()を関連付け、比率c_1〜c_3を関連付ける。ノード決定装置101は、データDのキーkを代入することにより算出したノードN1〜N3ごとの関数値f_1(k),f_2(k),f_3(k)と比率c_1〜c_3とを重み付け関数g()に代入することにより、ノードN1〜N3ごとの重み付け関数値g(f_1(k),c_1),g(f_2(k),c_2),g(f_3(k),c_3)を算出する。ノード決定装置101は、ノードN1〜N3ごとの重み付け関数値g(f_1(k),c_1),g(f_2(k),c_2),g(f_3(k),c_3)の大小関係に基づいて、データDを格納するノードNを決定する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、データを格納するノードを決定するノード決定プログラム、ノード決定装置およびノード決定方法に関する。
【背景技術】
【0002】
ある種の分散データストアでは、データのキーごとに、キーから特定されるデータを格納するノードが異なるものがある。また、分散データストアでは、耐障害の観点から、同一キーのデータを複数のノードに冗長して格納する場合がある。さらに、データストアとしてのサービスを停止させることなく、分散データストア内のノード数を動的に増減させる場合がある。
【0003】
このような分散データストアでは、データのキーごとに、キーから特定されるデータを格納するノードを複数のノードの中から決定することになる(いわゆる、キー空間分割)。従来の一手法として、例えば、ハッシュ関数h()を一つ決め、データのキー「k」をハッシュ関数h()に与えて得られるハッシュ値h(k)をノード数で割った余りにより、データを格納するノードを決める手法がある。
【0004】
また、関連する先行技術として、例えば、ノードごとに重みを設定しておき、重みに基づいてノードの担当する識別子空間(例えば、ノードの担当するハッシュ値の範囲)を分けるものがある(例えば、下記特許文献1参照。)。また、関連する先行技術として、例えば、複数の情報処理装置でファイルを分割して保持するものがある(例えば、下記特許文献2参照。)。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2010−134630号公報
【特許文献2】特許第4068473号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかしながら、上述した従来技術では、分散データストア内のノード数の増減時に、多くのデータの格納先が変わってしまう場合があり、ノード間のデータ移動が増大するという問題があった。例えば、上述した従来の一手法では、分散データストア内のノード数が10個から11個に増えた場合、全データの11分の10のデータの格納先が変わってしまう。また、キー空間の割り当てをノードごとに設定するような場合は、考慮されていない。
【0007】
本発明の一側面では、指定した割合に応じてデータを分散させた上で、ノード数の増減時におけるノード間のデータ移動を減らすことを目的とする。
【課題を解決するための手段】
【0008】
本発明の一側面によれば、複数のノードに含まれるノードごとに異なる関数であって、当該関数の定義域がデータを一意に特定するためのキーを含む関数をノードごとに関連付け、格納するデータ量を示すノードごとの指標値をノードごとに関連付け、関連付けられたノードごとの関数にキーをそれぞれ代入することにより、ノードごとの関数の値を算出し、定義域がノードごとの関数の値とノードごとの指標値との組み合わせを含む重み付け関数であって、重み付け関数の値域で当該重み付け関数の値の大小関係が定義される重み付け関数に、ノードごとの関数の値とノードごとの指標値とを代入することにより、重み付け関数の値をノードごとに算出し、算出されたノードごとの重み付け関数の値の大小関係に基づいて、データを格納するノードを決定し、決定された決定結果を出力するノード決定プログラム、ノード決定装置およびノード決定方法が提案される。
【発明の効果】
【0009】
本発明の一側面によれば、指定した割合に応じてデータを分散させた上で、ノード数の増減時におけるノード間のデータ移動を減らすことができるという効果を奏する。
【図面の簡単な説明】
【0010】
【図1】図1は、実施の形態にかかるノード決定装置のノード決定処理の一実施例を示す説明図である。
【図2】図2は、ノード追加時のデータ移動の一例を示す説明図である。
【図3】図3は、ノード削除時のデータ移動の一例を示す説明図である。
【図4】図4は、実施の形態にかかる分散システムの一例を示す説明図である。
【図5】図5は、実施の形態に用いられるコンピュータのハードウェア構成の一例を示すブロック図である。
【図6】図6は、実施の形態にかかるノード決定装置の機能的構成を示すブロック図である。
【図7】図7は、キーリストの記憶内容の一例を示す説明図である。
【図8】図8は、関数リストの記憶内容の一例を示す説明図である。
【図9】図9は、指標値リストの記憶内容の一例を示す説明図である。
【図10】図10は、関数値リストの記憶内容の一例を示す説明図である。
【図11】図11は、重み付け関数値リストの記憶内容の一例を示す説明図である。
【図12】図12は、ノード/キー対応リストの記憶内容の一例を示す説明図である。
【図13】図13は、実施の形態にかかるノード決定装置のノード決定処理手順の一例を示すフローチャートである。
【図14】図14は、ステップS1308のノード決定処理の具体的処理手順の一例を示すフローチャート(その1)である。
【図15】図15は、ステップS1308のノード決定処理の具体的処理手順の一例を示すフローチャート(その2)である。
【図16】図16は、ノード追加時のノード決定装置のノード決定処理手順の一例を示すフローチャートである。
【図17】図17は、ノード削除時のノード決定装置のノード決定処理手順の一例を示すフローチャートである。
【図18】図18は、ノード/キー対応リストの記憶内容の具体例1を示す説明図(その1)である。
【図19】図19は、ノード/キー対応リストの記憶内容の具体例1を示す説明図(その2)である。
【図20】図20は、ノード/キー対応リストの記憶内容の具体例2を示す説明図(その1)である。
【図21】図21は、ノード/キー対応リストの記憶内容の具体例2を示す説明図(その2)である。
【発明を実施するための形態】
【0011】
以下に添付図面を参照して、本発明にかかるノード決定プログラム、ノード決定装置およびノード決定方法の好適な実施の形態を詳細に説明する。ノード決定プログラム、ノード決定装置およびノード決定方法によれば、指定された指標値に基づいて分散データストア内のノード間でデータを偏らせて分散させた上で、ノード増減時のデータ移動量を減らすことができる。
【0012】
そのために、ノード決定プログラム、ノード決定装置およびノード決定方法によれば、データのキーから得られたノードごとの関数値(例えばハッシュ値)を、ノードごとに設定された指標値で補正した値が算出される。そして、ノード決定プログラム、ノード決定装置およびノード決定方法によれば、ノードごとの補正された値の大小関係に基づいて、データを格納するノードが決定される。
【0013】
これにより、ノード決定プログラム、ノード決定装置およびノード決定方法によれば、ノードごとに設定された指標値に応じて、データストア内のノード間でデータを偏らせて分散させることができる。結果として、記憶容量・演算能力・回線速度などの点で高性能なノードに多くのデータを格納させることができ、分散データストアの効率化を図ることができる。そして、ノードの増減時には、増減するノード以外のノード間ではノードごとの補正された値の大小関係は変化しないため、増減するノード以外のノード間ではデータの移動が生じず、ノード増減時のデータ移動量を抑制することができる。
【0014】
(ノード決定処理の一実施例)
図1は、実施の形態にかかるノード決定装置のノード決定処理の一実施例を示す説明図である。ここでは、分散データストア内のノードN1〜N3の中からデータDを格納するノードを決定する場合を例に挙げて説明する。
【0015】
ここで、分散データストアは、複数のノード(ここでは、ノードN1〜N3)にデータ群を分散して格納するシステムである。分散データストアでは、データDとキーkがペアになっており、キーkを指定することでデータDを参照することができる。データDのキーkは、データDを一意に特定するための情報である。
【0016】
図1において、まず、ノード決定装置101は、ノードN1と関数f_1()を関連付ける。また、ノード決定装置101は、ノードN2と関数f_2()を関連付ける。また、ノード決定装置101は、ノードN3と関数f_3()を関連付ける。ここで、関数f_1(),f_2(),f_3()は、それぞれ異なる関数であって、該関数の定義域がデータDのキーkを含む関数である。
【0017】
つぎに、ノード決定装置101は、ノードN1と比率c_1を関連付ける。また、ノード決定装置101は、ノードN2と比率c_2を関連付ける。また、ノード決定装置101は、ノードN3と比率c_3を関連付ける。ここで、比率c_1,c_2,c_3は、ノードN1〜N3に分散して格納されるデータ群の中で、ノードN1〜N3のそれぞれに格納するデータをどの程度の量にするかを示す指標値である。
【0018】
そして、ノード決定装置101は、ノードN1〜N3ごとの関数f_1(),f_2(),f_3()にデータDのキーkをそれぞれ代入することにより、ノードN1〜N3ごとの関数値f_1(k),f_2(k),f_3(k)を算出する。
【0019】
つぎに、ノード決定装置101は、ノードN1〜N3ごとの関数値f_1(k),f_2(k),f_3(k)と、ノードN1〜N3ごとの比率c_1,c_2,c_3と、を重み付け関数g()に代入する。これにより、ノード決定装置101は、ノードN1〜N3ごとの重み付け関数値g(f_1(k),c_1),g(f_2(k),c_2),g(f_3(k),c_3)を算出する。
【0020】
ここで、重み付け関数g()は、該関数の定義域がノードN1〜N3ごとの関数値f_1(k),f_2(k),f_3(k)とノードN1〜N3ごとの比率c_1,c_2,c_3との組み合わせを含み、重み付け関数の値域で該重み付け関数の値(重み付け関数値)の大小関係が定義される関数である。
【0021】
そして、ノード決定装置101は、ノードN1〜N3ごとの重み付け関数値g(f_1(k),c_1),g(f_2(k),c_2),g(f_3(k),c_3)の大小関係に基づいて、データDを格納するノードを決定する。
【0022】
ここでは一例として、ノード決定装置101が、重み付け関数値g(f_1(k),c_1),g(f_2(k),c_2),g(f_3(k),c_3)のうち最小の重み付け関数値g(f_3(k),c_3)に対応するノードN3を、データDを格納するノードに決定する。
【0023】
以上説明した一実施例によれば、分散データストア内のノード数の増減時におけるノード間のデータ移動を減らすことができる。具体的には、分散データストア内のノード数が変化した場合であっても、ノードN1〜N3の重み付け関数値の大小関係は変化しないため、ノード間のデータ移動の発生を抑えることができる。
【0024】
より具体的には、例えば、分散データストア内のノード数が増える場合、新たに追加されるノードの重み付け関数値が最小とならない限り、データDの移動は発生しない。一方、分散データストア内のノード数が減る場合、ノードN3が削除されない限り、データDの移動は発生しない。以下、図2および図3を用いて、ノード数の増減時におけるノード間のデータ移動について説明する。
【0025】
(ノード追加時のデータ移動の一例)
図2は、ノード追加時のデータ移動の一例を示す説明図である。ここでは、ノードN3にデータDが格納されたあと、分散データストアに新たなノードN4が追加される場合について説明する。ここで、ノードN4が追加された場合であっても、ノードN1〜N3の重み付け関数値g(f_1(k),c_1),g(f_2(k),c_2),g(f_3(k),c_3)の大小関係は変化しない。
【0026】
したがって、新たなノードN4の重み付け関数値g(f_4(k),c_4)が算出された結果、重み付け関数値g(f_1(k),c_1)〜g(f_4(k),c_4)のうち最小となる重み付け関数値は、つぎのパターン1またはパターン2のいずれかである。パターン1は、依然としてノードN3の重み付け関数値g(f_3(k),c_3)が最小となる場合である。パターン2は、ノードN4の重み付け関数値g(f_4(k),c_4)が最小となる場合である。
【0027】
ここで、パターン1の場合、データDの移動は発生しない。一方、パターン2の場合、データDを格納するためのノードとしてノードN4が決定され、ノードN3に格納されているデータDがノードN4に移動することになる。すなわち、ノード追加時は、ノードN4の重み付け関数値g(f_4(k),c_4)が最小とならない限り、データDの移動は発生しないため、ノード間のデータ移動の発生を抑えることができる。
【0028】
(ノード削除時のデータ移動の一例)
図3は、ノード削除時のデータ移動の一例を示す説明図である。ここでは、ノードN3にデータDが格納されたあと、分散データストア内のノードN3を削除する場合(パターン3)と、ノードN2を削除する場合(パターン4)について説明する。
【0029】
パターン3の場合、ノードN3を削除するため、ノードN3に格納されているデータDの移動が発生する。ただし、ノードN3が削除された場合であっても、残余のノードN1,N2の重み付け関数値g(f_1(k),c_1),g(f_2(k),c_2)の大小関係は変化しない。したがって、ノードN3に格納されているデータDが、ノードN3のつぎに重み付け関数値が小さいノードN1に移動することになる。一方、パターン4の場合、データDの移動は発生しない。すなわち、ノード削除時は、データDを格納しているノードN3が削除されない限り、データDの移動は発生しないため、ノード間のデータ移動の発生を抑えることができる。
【0030】
(分散システム400の一例)
図4は、実施の形態にかかる分散システムの一例を示す説明図である。図4において、分散システム400は、ノード決定装置101と、ノードN1〜Nnと、クライアント装置Cと、を含む構成である。分散システム400において、ノード決定装置101、ノードN1〜Nnおよびクライアント装置Cは、例えば、インターネット、LAN(Local Area Network)、WAN(Wide Area Network)などのネットワーク410を介して相互に通信可能に接続されている。
【0031】
ここで、ノードN1〜Nnは、例えば、ファイルサーバ、データベースサーバなどのサーバである。クライアント装置Cは、例えば、データストアのサービスの提供を受けるコンピュータである。クライアント装置Cは、分散データストアDS内のいずれかのノードに格納されているデータDを、データDのキーkを用いて参照することができる。
【0032】
以下の説明では、複数のノードN1〜Nnのうち任意のノードを「ノードNi」と表記する(i=1,2,…,n)。また、ノードN1〜Nnのそれぞれに関する比率を「c_1〜c_n」と表記し、比率c_1〜c_nのうちノードNiに関する比率を「c_i」と表記する。また、格納対象となるデータ群を「データD1〜Dm」と表記し、データD1〜Dmのうち任意のデータDを「データDj」と表記する(j=1,2,…,m)。また、データDjを一意に特定するためのキーを「キーkj」と表記する。
【0033】
(コンピュータのハードウェア構成)
つぎに、実施の形態に用いられるコンピュータ(ノード決定装置101、ノードN1〜Nn、クライアント装置C)のハードウェア構成について説明する。
【0034】
図5は、実施の形態に用いられるコンピュータのハードウェア構成の一例を示すブロック図である。図5において、コンピュータは、CPU(Central Processing Unit)501と、ROM(Read‐Only Memory)502と、RAM(Random Access Memory)503と、磁気ディスクドライブ504と、磁気ディスク505と、光ディスクドライブ506と、光ディスク507と、ディスプレイ508と、I/F(Interface)509と、キーボード510と、マウス511と、を備えている。また、各構成部はバス500によってそれぞれ接続されている。
【0035】
ここで、CPU501は、コンピュータの全体の制御を司る。ROM502は、ブートプログラムなどのプログラムを記憶している。RAM503は、CPU501のワークエリアとして使用される。磁気ディスクドライブ504は、CPU501の制御にしたがって磁気ディスク505に対するデータのリード/ライトを制御する。磁気ディスク505は、磁気ディスクドライブ504の制御で書き込まれたデータを記憶する。
【0036】
光ディスクドライブ506は、CPU501の制御にしたがって光ディスク507に対するデータのリード/ライトを制御する。光ディスク507は、光ディスクドライブ506の制御で書き込まれたデータを記憶したり、光ディスク507に記憶されたデータをコンピュータに読み取らせたりする。
【0037】
ディスプレイ508は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ508には、例えば、CRT、TFT液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【0038】
I/F509は、通信回線を通じてLAN、WAN、インターネットなどのネットワーク410に接続され、このネットワーク410を介して他の装置に接続される。そして、I/F509は、ネットワーク410と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F509には、例えば、モデムやLANアダプタなどを採用することができる。
【0039】
キーボード510は、文字、数字、各種指示などの入力のためのキーを備え、データの入力を行う。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス511は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などを行う。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【0040】
(ノード決定装置101の機能的構成)
つぎに、実施の形態にかかるノード決定装置101の機能的構成について説明する。図6は、実施の形態にかかるノード決定装置の機能的構成を示すブロック図である。図6において、ノード決定装置101は、受付部601と、第1の関連付け部602と、第2の関連付け部603と、第1の算出部604と、第2の算出部605と、決定部606と、並換部607と、選択部608と、出力部609と、を含む構成である。
【0041】
各機能部(受付部601〜出力部609)は、例えば、図5に示したROM502、RAM503、磁気ディスク505、光ディスク507などの記憶装置に記憶されたプログラムをCPU501に実行させることにより、または、I/F509により、その機能を実現する。また、各機能部(受付部601〜出力部609)の処理結果は、特に指定する場合を除いて、RAM503、磁気ディスク505、光ディスク507などの記憶装置に記憶される。
【0042】
受付部601は、格納対象となるデータDjに関するキー情報を受け付ける機能を有する。ここで、キー情報は、例えば、格納対象となるデータDjのデータ名と、キーkjと、冗長度Rjと、を含む。データDjは、例えば、フォルダ、ファイル、レコード単位の情報である。キーkjは、例えば、ファイルのパス名やデータベース内のレコードの主キーなどの文字列である。冗長度Rjは、耐障害の観点から、同一キーkjのデータDjを複数のノードNiに冗長して格納する場合のノード数である。
【0043】
具体的には、例えば、受付部601が、図5に示したキーボード510やマウス511を用いたユーザの操作入力によりキー情報を受け付ける。また、受付部601が、ネットワーク410を介して、クライアント装置Cからキー情報を受け付けてもよい。受け付けたキー情報は、例えば、図7に示すキーリスト700に記憶される。
【0044】
図7は、キーリストの記憶内容の一例を示す説明図である。図7において、キーリスト700は、データ名、キーおよび冗長度のフィールドを有し、各フィールドに情報を設定することで、キー情報700−1〜700−mをレコードとして記憶している。ここで、データ名とは、データDjの名称である。キーとは、データDjを一意に特定するための情報である。冗長度は、データDjを複数のノードNiに冗長して格納する場合のノード数である。
【0045】
キーリスト700の記憶内容は、例えば、キー情報を受け付けた場合、また、分散データストアDSからデータDjが削除された場合に、その都度更新される。キーリスト700は、例えば、ROM502、RAM503、磁気ディスク505、光ディスク507などの記憶装置により、その機能を実現する。
【0046】
図6の説明に戻り、また、受付部601は、ノードNiに関する指標値を受け付ける機能を有する。ここで、指標値とは、ノードN1〜Nnに分散して格納されるデータD1〜Dmの中で、ノードNiに格納するデータDをどの程度の量にするかを示す値である。具体的には、例えば、指標値とは、上述した比率c_iであり、ノードNiの記憶容量・演算能力・回線速度に基づいて決定された値である。
【0047】
具体的には、例えば、受付部601が、キーボード510やマウス511を用いたユーザの操作入力によりノードNiに関する比率c_iを受け付ける。また、受付部601が、ネットワーク410を介して、ノードNiやクライアント装置CからノードNiに関する比率c_iを受け付けてもよい。受け付けたノードNiに関する指標値は、例えば、後述する第2の関連付け部603により、図9に示す指標値リスト900に記憶される。
【0048】
また、受付部601は、分散データストアDS内のノード数の増減にともなうノード決定指示を受け付ける機能を有する。ここで、ノード決定指示とは、ノード数の増減にともなって、データDjの格納先となるノードNiを再決定するように指示するものである。
【0049】
具体的には、ノード追加にともなうノード決定指示には、例えば、分散データストアDSに追加されるノードNiのノード名が含まれている。また、ノード追加にともなうノード決定指示には、例えば、追加されるノードNiに関する比率c_iが含まれている。受け付けたノード決定指示に含まれるノードNiに関する指標値は、例えば、後述する第2の関連付け部603により、図9に示す指標値リスト900に記憶される。なお、新たなノードNiの追加は、例えば、分散システム400のパフォーマンスの向上などを目的として行われる。
【0050】
また、ノード削除にともなうノード決定指示には、例えば、分散データストアDSから削除されるノードNiのノード名が含まれている。なお、ノードNiの削除は、例えば、ノードNiの故障時などに行われる。
【0051】
具体的には、例えば、受付部601が、キーボード510やマウス511を用いたユーザの操作入力によりノード決定指示を受け付ける。また、受付部601が、ネットワーク410を介して、ノードNiやクライアント装置Cからノード決定指示を受け付けてもよい。
【0052】
第1の関連付け部602は、ノードNiごとに関数を関連付ける機能を有する。以下、ノードNiの関数を「関数f_i()」と表記する。ここで、関数f_i()は、ノードNiごとに異なる関数であって、その定義域がデータDjのキーkjを含む関数である。すなわち、関数f_i()は、その定義域がキーkjがとりえる値の範囲を含んでいる関数である。
【0053】
具体的には、例えば、第1の関連付け部602が、予め用意されている関数群Fの中から、任意の関数を関数f_i()として選択して、ノードNiと関数f_i()とを関連付ける。関連付け結果は、例えば、図8に示す関数リスト800に記憶される。なお、関数群Fは、少なくともノード数n分の関数の集合であり、ROM502、RAM503、磁気ディスク505、光ディスク507などの記憶装置に記憶されている。
【0054】
また、第1の関連付け部602が、二つの引数をとる関数f()を一つ用意して、関数f_i()を、例えば下記式(1)のように定義することにしてもよい。ただし、iはノードNiのノード名、kjはデータDjのキーである。なお、二つの引数をとる関数f()は、例えば、ROM502、RAM503、磁気ディスク505、光ディスク507などの記憶装置に記憶されている。
【0055】
f_i()=f(i,kj) ・・・(1)
【0056】
また、関数f_i()としては、上述の定義域の条件を満たすものであれば、任意の関数を用いることができる。具体的には、例えば、関数f_i()として、キーkjを引数として与えることで固定長の乱数が得られる関数を用いることにしてもよい。より具体的には、例えば、関数f_i()として、SHA1(Secure Hash Algorithm 1)などのハッシュ関数を用いることにしてもよい。SHA1は、入力が少し異なれば出力が大きく異なるという性質を有する関数である。また、例えば、キーkjおよびノード名「i」がともに整数の場合は、関数f_i()として、キーkjにノード名「i」を加算する「f_i()=kj+i」という関数を用いることにしてもよい。
【0057】
さらに、ノードN1〜Nnの関数f_1()〜f_n()として、関数値の頻度分布が十分に等しく、互いに独立な関数を用いることにしてもよい。具体的には、例えば、第1の関連付け部602が、SHA1などのハッシュ関数を用いて、関数f_i()を下記式(2)のように定義することにしてもよい。ただし、concatnate(i,kj)は、ノードNiのノード名「i」とデータDjのキーkjを文字列として連結する関数である。
【0058】
f_i()=SHA1(concatnate(i,kj)) ・・・(2)
【0059】
図8は、関数リストの記憶内容の一例を示す説明図である。図8において、関数リスト800は、ノードID、ノード名および関数のフィールドを有し、各フィールドに情報を設定することで、関数情報800−1〜800−nをレコードとして記憶している。
【0060】
ノードIDは、本明細書において説明上使用するノードNiの識別子である。ノード名は、ノードNiの名称である。関数は、ノードNiと関連付けられている関数f_i()である。関数リスト800は、例えば、ROM502、RAM503、磁気ディスク505、光ディスク507などの記憶装置により、その機能を実現する。
【0061】
図6の説明に戻り、第2の関連付け部603は、格納するデータ量を示すノードNiごとの指標値をノードNiごとに関連付ける機能を有する。具体的には、例えば、第2の関連付け部603は、受付部601によって受け付けられたノードNiに関する比率c_iを、ノードNiに関連付ける。関連付け結果は、例えば、図9に示す指標値リスト900に記憶される。
【0062】
図9は、指標値リストの記憶内容の一例を示す説明図である。図9において、指標値リスト900は、ノードID、ノード名および指標値のフィールドを有し、各フィールドに情報を設定することで、指標値情報900−1〜900−nをレコードとして記憶している。指標値は、ノードNiと関連付けられている比率c_iである。指標値リスト900は、例えば、ROM502、RAM503、磁気ディスク505、光ディスク507などの記憶装置により、その機能を実現する。
【0063】
図6の説明に戻り、第1の算出部604は、関連付けられたノードNiごとの関数f_i()にキーkをそれぞれ代入することにより、ノードNiごとの関数f_i()の値(以下、「関数値f_i(k)」)を算出する機能を有する。具体的には、例えば、第1の算出部604が、キーkを引数として関数f_i()に与えることで、ノードNiごとの関数値f_i(k)を算出する。
【0064】
また、関数f_i()として上記式(1)を用いる場合、第1の算出部604が、ノードNiのノード名「i」およびキーkを引数として上記式(1)に与えることで、ノードNiごとの関数値f_i(k)を算出する。算出された算出結果は、例えば、図10に示す関数値リスト1000に記憶される。
【0065】
図10は、関数値リストの記憶内容の一例を示す説明図である。図10において、関数値リスト1000は、ノードID、ノード名および関数値のフィールドを有し、各フィールドに情報を設定することで、関数値情報1000−1〜1000−nをレコードとして記憶している。関数値リスト1000は、例えば、ROM502、RAM503、磁気ディスク505、光ディスク507などの記憶装置により、その機能を実現する。
【0066】
図6の説明に戻り、第2の算出部605は、重み付け関数g()に、ノードNiごとの関数値f_i(k)とノードNiごとの指標値とを代入することにより、重み付け関数g()の値(以下、「重み付け関数値g(f_i(k),c_i)」)をノードNiごとに算出する機能を有する。
【0067】
ここで、重み付け関数g()は、その定義域がノードNiごとの関数値f_i(k)とノードNiごとの指標値との組み合わせを含み、その値域で重み付け関数値g(f_i(k),c_i)の大小関係が定義される関数である。すなわち、重み付け関数g()は、その定義域がノードNiごとの関数値f_i(k)がとりうる値とノードNiごとの指標値とがとりうる値とを組み合わせた範囲を含んでおり、その値域で重み付け関数値g(f_i(k),c_i)の大小関係を比較することができる関数である。
【0068】
また、重み付け関数g()は、引数となる関数値f_i(k)の増加にともなって、重み付け関数値g(f_i(k),c_i)が増加する関数、または、重み付け関数値g(f_i(k),c_i)が減少する関数である。また、重み付け関数g()は、引数となる指標値の増加にともなって、重み付け関数値g(f_i(k),c_i)が増加する関数、または、重み付け関数値g(f_i(k),c_i)が減少する関数である。なお、重み付け関数g()は、例えば、ROM502、RAM503、磁気ディスク505、光ディスク507などの記憶装置に記憶されている。
【0069】
重み付け関数g()としては、上述の条件を満たすものであれば、任意の関数を用いることができる。具体的には、例えば、重み付け関数g()として、「g(f_i(k),c_i)=f_i(k)/c_i」という関数を用いることにしてもよい。これにより、各ノードNiの指標値c_iを反映して、重み付け関数値g(f_i(k),c_i)を算出することができる。
【0070】
また、重み付け関数g()としては、重み付け関数の値域で定義される当該重み付け関数の値の大小関係が、ノードNiごとの指標値c_iの和に対するいずれかのノードNiの指標値c_iの割合で、いずれかのノードNiの重み付け関数値g(f_i(k),c_i)が最大または最小になる関係である関数を用いることができる。
【0071】
具体的には、例えば、重み付け関数g()として、「g(f_i(k),c_i)=f_i(k)^c_i」という関数を用いることにしてもよい。なお、「f_i(k)^c_i」はf_i(k)をc_iで冪乗する数式を示す。これにより、各ノードNiの指標値c_iを反映して、重み付け関数値g(f_i(k),c_i)を算出することができる。
【0072】
具体的には、第2の算出部605は、重み付け関数g()に、ノードNiごとの関数値f_i(k)とノードNiごとの比率c_iとを代入することにより、重み付け関数値g(f_i(k),c_i)をノードNiごとに算出する。算出された算出結果は、例えば、図11に示す重み付け関数値リスト1100に記憶される。
【0073】
図11は、重み付け関数値リストの記憶内容の一例を示す説明図である。図11において、重み付け関数値リスト1100は、ノードID、ノード名および重み付け関数値のフィールドを有し、各フィールドに情報を設定することで、重み付け関数値情報1100−1〜1100−nをレコードとして記憶している。重み付け関数値リスト1100は、例えば、ROM502、RAM503、磁気ディスク505、光ディスク507などの記憶装置により、その機能を実現する。
【0074】
図6の説明に戻り、決定部606は、算出されたノードNiごとの重み付け関数値g(f_i(k),c_i)の大小関係に基づいて、データDjを格納するノードNiを決定する機能を有する。具体的には、例えば、決定部606が、重み付け関数値g(f_1(k),c_1)〜g(f_n(k),c_n)のうち最小(または、最大)の重み付け関数値g(f_i(k),c_i)に対応するノードNiを、データDjを格納するノードNiに決定する。
【0075】
並換部607は、算出されたノードNiごとの重み付け関数値g(f_i(k),c_i)の大小関係に基づいて、ノードNiごとの重み付け関数値g(f_i(k),c_i)を並び換える機能を有する。具体的には、例えば、並換部607が、ノードN1〜Nnの重み付け関数値g(f_1(k),c_1)〜g(f_n(k),c_n)が昇順(または、降順)となるように並び換える。
【0076】
選択部608は、並び換えられたノードNiごとの重み付け関数値g(f_i(k),c_i)の順序にしたがって、ノードN1〜Nnの中から所定数のノードNiを選択する機能を有する。ここで、所定数は、例えば、データDjの冗長度Rjである。以下の説明では、並び換え後のノードN1〜Nnの重み付け関数値g(f_1(k),c_1)〜g(f_n(k),c_n)を「関数値g[1]〜g[n]」と表記する。
【0077】
具体的には、例えば、まず、選択部608が、並び換え後の関数値g[1]〜g[n]の先頭(または、後尾)からRj個の関数値g[1]〜g[Rj]を選択する。そして、選択部608が、重み付け関数値リスト1100を参照することにより、選択された関数値g[1]〜g[Rj]に対応するRj個のノードNiを特定して選択する。
【0078】
以下の説明では、選択されたRj個のノードNiを「ノードN[1]〜N[Rj]」と表記する。なお、冗長度Rjが「Rj=1」の場合は、選択部608は、並び換え後の関数値g[1]〜g[n]の先頭(または、後尾)から特定の順番のノードNiを選択することにしてもよい。
【0079】
また、決定部606は、選択された所定数のノードNiを、データDjを格納するノードNiに決定することにしてもよい。具体的には、例えば、決定部606が、選択されたRj個のノードN[1]〜N[Rj]を、データDjを格納するノードNiに決定する。決定された決定結果は、図12に示すノード/キー対応リスト1200に記憶される。
【0080】
図12は、ノード/キー対応リストの記憶内容の一例を示す説明図である。図12において、ノード/キー対応リスト1200は、ノードID、ノード名およびキーのフィールドを有する。各フィールドに情報を設定することで、ノードN1〜Nnごとの対応情報1200−1〜1200−nがレコードとして記憶される。
【0081】
一例として、ノードN1がデータD1,D3,D9を格納するノードNiに決定された場合、対応情報1200−1の「キー」フィールドに、データD1,D3,D9のキーk1,k3,k9が設定される。また、ノードN2がデータD4,D5を格納するノードNiに決定された場合、対応情報1200−2の「キー」フィールドに、データD4,D5のキーk4,k5が設定される。なお、各データDjのキーkjは、例えば、キーリスト700を参照することで特定することができる。
【0082】
図6の説明に戻り、出力部609は、決定された決定結果を出力する機能を有する。具体的には、例えば、出力部609が、図12に示したノード/キー対応リスト1200を出力する。出力形式としては、例えば、ディスプレイ508への表示、プリンタ(不図示)への印刷出力、I/F509による外部装置への送信がある。また、RAM503、磁気ディスク505、光ディスク507などの記憶領域に記憶することとしてもよい。
【0083】
より具体的には、例えば、出力部609が、ノード間のデータ移動を制御する外部のコンピュータにノード/キー対応リスト1200を送信してもよい。この場合、例えば、外部のコンピュータが、ノード/キー対応リスト1200にしたがって、ノード間のデータ移動を制御することになる。また、出力部609が、ノード/キー対応リスト1200にしたがって、データDiの移動指示をノードNiに送信してもよい。
【0084】
なお、上述した説明では、ノード決定装置101とノードNiとを別体に設ける場合について説明したが、これに限らない。具体的には、例えば、ノードNiがノード決定装置101を備える構成にしてもよい。
【0085】
(ノード決定装置101のノード決定処理手順)
つぎに、実施の形態にかかるノード決定装置101のノード決定処理手順について説明する。ここでは、ノードN1〜Nnの中から、データD1〜Dmの格納先となるノードNiを決定する場合を例に挙げて説明する。また、ここでは、受付部601により、キーリスト700が作成されており、第2の関連付け部603により指標値リスト900が作成されているとする。
【0086】
図13は、実施の形態にかかるノード決定装置のノード決定処理手順の一例を示すフローチャートである。図13のフローチャートにおいて、まず、第1の関連付け部602により、ノードNiの「i」を「i=1」で初期化して(ステップS1301)、関数群Fの中から関数f_i()を選択する(ステップS1302)。そして、第1の関連付け部602により、ノードNiのノード名と、選択された関数f_i()とを関連付けて関数リスト800に登録する(ステップS1303)。
【0087】
つぎに、第1の関連付け部602により、ノードNiの「i」をインクリメントして(ステップS1304)、「i」が「n」より大きいか否かを判断する(ステップS1305)。ここで、「i」が「n」以下の場合(ステップS1305:No)、ステップS1302に戻る。
【0088】
一方、「i」が「n」より大きい場合(ステップS1305:Yes)、第1の算出部604により、データDjの「j」を「j=1」で初期化する(ステップS1306)。そして、第1の算出部604により、キーリスト700の中からデータDjのキーkjおよび冗長度Rjを抽出する(ステップS1307)。
【0089】
このあと、決定部606により、データDjを格納するノードNiを決定するノード決定処理を実行する(ステップS1308)。そして、第1の算出部604により、データDjの「j」をインクリメントして(ステップS1309)、「j」が「m」より大きいか否かを判断する(ステップS1310)。ここで、「j」が「m」以下の場合(ステップS1310:No)、ステップS1307に戻る。
【0090】
一方、「j」が「m」より大きい場合(ステップS1310:Yes)、出力部609により、ノード/キー対応リスト1200を出力して(ステップS1311)、本フローチャートによる一連の処理を終了する。
【0091】
つぎに、図13に示したステップS1308のノード決定処理の具体的処理手順について説明する。図14および図15は、ステップS1308のノード決定処理の具体的処理手順の一例を示すフローチャートである。
【0092】
図14のフローチャートにおいて、まず、第1の算出部604により、ノードNiの「i」を「i=1」で初期化して(ステップS1401)、関数リスト800の中からノードNiの関数f_i()を抽出する(ステップS1402)。
【0093】
つぎに、第1の算出部604により、抽出された関数f_i()に図13に示したステップS1307において抽出されたキーkjを代入して、ノードNiの関数値f_i(kj)を算出する(ステップS1403)。そして、第1の算出部604により、算出されたノードNiの関数値f_i(kj)を関数値リスト1000に登録する(ステップS1404)。
【0094】
つぎに、第2の算出部605により、関数値リスト1000の中からノードNiの関数値f_i(kj)を抽出する(ステップS1405)。そして、第2の算出部605により、指標値リスト900の中からノードNiに関する比率c_iを抽出する(ステップS1406)。
【0095】
つぎに、第2の算出部605により、重み付け関数g()に抽出されたノードNiの関数値f_i(kj)と比率c_iとを代入して、ノードNiの重み付け関数値g(f_i(kj),c_i)を算出する(ステップS1407)。そして、第2の算出部605により、算出されたノードNiの重み付け関数値g(f_i(kj),c_i)を重み付け関数値リスト1100に登録する(ステップS1408)。
【0096】
このあと、第2の算出部604により、ノードNiの「i」をインクリメントして(ステップS1409)、「i」が「n」より大きいか否かを判断する(ステップS1410)。ここで、「i」が「n」以下の場合(ステップS1410:No)、ステップS1402に戻る。
【0097】
一方、「i」が「n」より大きい場合(ステップS1410:Yes)、図15に示すステップS1501に移行する。図15のフローチャートにおいて、並換部607により、重み付け関数値リスト1100を参照して、重み付け関数値g(f_1(kj),c_1)〜g(f_n(kj),c_n)を昇順に並び換える(ステップS1501)。
【0098】
このあと、選択部608により、並び換え後の重み付け関数値g[1]〜g[n]の先頭からRj個の重み付け関数値g[1]〜g[Rj]を選択する(ステップS1502)。ただし、Rjは、図13に示したステップS1307において抽出された冗長度Rjである。つぎに、選択部608により、重み付け関数値リスト1100を参照して、選択されたRj個の重み付け関数値g[1]〜g[Rj]に対応するノードN[1]〜N[Rj]を選択する(ステップS1503)。
【0099】
このあと、決定部606により、選択されたノードN[1]〜N[Rj]を、データDjを格納するノードNiに決定する(ステップS1504)。そして、決定部606により、決定された決定結果をノード/キー対応リスト1200に登録して(ステップS1505)、図13に示したステップS1309に移行する。
【0100】
これにより、重み付け関数g()にノードNiごとの関数値f_i(kj)とノードNiごとの比率c_iを引数として与えて得られる重み付け関数値g(f_i(kj),c_i)の大小関係から、データDjを格納するノードNiを決定することができる。この結果、ノードNiごとに設定された指標値c_iに応じて、分散データストアDS内の各ノードNiにデータDjを分散させて格納することができる。また、分散データストアDS内のノード数の増減時におけるノード間のデータ移動を減らすことができる。
【0101】
(ノード追加時のノード決定処理手順)
つぎに、ノード追加時のノード決定装置101のノード決定処理手順について説明する。ここでは、分散データストアDSに新たに追加されるノードNiを「ノードNx」と表記する。図16は、ノード追加時のノード決定装置のノード決定処理手順の一例を示すフローチャートである。
【0102】
図16のフローチャートにおいて、まず、受付部601により、ノード追加にともなうノード決定指示を受け付けたか否かを判断する(ステップS1601)。ここで、ノード決定指示を受け付けるのを待って(ステップS1601:No)、受け付けた場合(ステップS1601:Yes)、第1の関連付け部602により、関数群Fの中からノードNxの関数f_x()を選択する(ステップS1602)。
【0103】
そして、第1の関連付け部602により、ノードNxのノード名と、選択された関数f_x()とを関連付けて関数リスト800に登録する(ステップS1603)。ただし、ノードNxのノード名および関数f_x()は、関数リスト800の後尾の関数情報800−nとして登録される。
【0104】
つぎに、第2の関連付け部603により、ノード決定指示に含まれるノードNxの比率c_xが取得される。そして、第2の関連付け部603により、ノードNxのノード名と、比率c_xとを関連付けて指標値リスト900に登録する(ステップS1604)。ただし、ノードNxのノード名および比率c_xは、指標値リスト900の後尾の指標値情報900−nとして登録される。
【0105】
つぎに、決定部606により、ノード/キー対応リスト1200を初期化する(ステップS1605)。そして、第1の算出部604により、データDjの「j」を「j=1」で初期化して(ステップS1606)、キーリスト700の中からデータDjのキーkjおよび冗長度Rjを抽出する(ステップS1607)。
【0106】
このあと、決定部606により、データDjを格納するノードNiを決定するノード決定処理を実行する(ステップS1608)。そして、第1の算出部604により、データDjの「j」をインクリメントして(ステップS1609)、「j」が「m」より大きいか否かを判断する(ステップS1610)。
【0107】
ここで、「j」が「m」以下の場合(ステップS1610:No)、ステップS1607に戻る。一方、「j」が「m」より大きい場合(ステップS1610:Yes)、出力部609により、ノード/キー対応リスト1200を出力して(ステップS1611)、本フローチャートによる一連の処理を終了する。
【0108】
これにより、分散データストアDSへのノード追加時に、データD1〜Dmを格納するノードNiを再決定することができる。また、ノードNxの追加にともなってデータ移動が発生する場合は、新たに追加されたノードNxにデータDjが移動することになるため、ノード追加時におけるパフォーマンスを効率的に向上させることができる。なお、ステップS1608のノード決定処理の具体的処理手順は、図14および図15に示したステップS1308のノード決定処理の具体的処理手順と同様のため、ここでは説明を省略する。
【0109】
(ノード削除時のノード決定処理手順)
つぎに、ノード削除時のノード決定装置101のノード決定処理手順について説明する。ここでは、分散データストアDSから削除されるノードNiを「ノードNy」と表記する。図17は、ノード削除時のノード決定装置のノード決定処理手順の一例を示すフローチャートである。
【0110】
図17のフローチャートにおいて、まず、受付部601により、ノード削除にともなうノード決定指示を受け付けたか否かを判断する(ステップS1701)。ここで、ノード決定指示を受け付けるのを待って(ステップS1701:No)、受け付けた場合(ステップS1701:Yes)、第1の関連付け部602により、関数リスト800の中からノードNyに対応するレコードを削除する(ステップS1702)。なお、関数リスト800内のノードIDは、ノードNyに対応するレコードが削除されたあと振り直される。
【0111】
つぎに、第2の関連付け部603により、指標値リスト900の中からノードNyに対応するレコードを削除する(ステップS1703)。なお、指標値リスト900内のノードIDは、ノードNyに対応するレコードが削除されたあと振り直される。
【0112】
このあと、決定部606により、ノード/キー対応リスト1200を参照して、ノードNyに対応するキー(ここでは、キーk[1]〜k[P]と表記する)を特定する(ステップS1704)。そして、第1の算出部604により、データDpの「p」を「p=1」で初期化して(ステップS1705)、キーリスト700の中からデータDpのキーk[p]および冗長度R[p]を抽出する(ステップS1706)。
【0113】
このあと、決定部606により、データDpを格納するノードNiを決定するノード決定処理を実行する(ステップS1707)。そして、第1の算出部604により、データDpの「p」をインクリメントして(ステップS1708)、「p」が「P」より大きいか否かを判断する(ステップS1709)。
【0114】
ここで、「p」が「P」以下の場合(ステップS1709:No)、ステップS1706に戻る。一方、「p」が「P」より大きい場合(ステップS1709:Yes)、出力部609により、ノード/キー対応リスト1200を出力して(ステップS1710)、本フローチャートによる一連の処理を終了する。
【0115】
これにより、分散データストアDSからのノード削除時に、削除するノードNyに格納されているデータD[1]〜D[P]を格納するノードNiを再決定することができる。なお、ステップS1707のノード決定処理の具体的処理手順は、図14および図15に示したステップS1308のノード決定処理の具体的処理手順と同様のため、ここでは説明を省略する。
【0116】
(ノード決定処理の具体例1)
つぎに、ノード決定装置101のノード決定処理の具体例1について説明する。ここでは、ノードNiの関数f_i()として、下記式(3)を用いる。ただし、iはノードNiのノード名、kjはデータDjのキー、(i+kj)はノード名とキーの文字列としての結合を表す。
【0117】
f_i()=f(i,kj)=<SHA1(i+kj)の最初の32bit>
・・・(3)
【0118】
また、ここでは、重み付け関数g()として、下記式(4)を用いる。ただし、c_iはノードNiに関する比率である。
【0119】
g()=g(f(i,kj),c_i)=f(i,kj)/c_i
・・・(4)
【0120】
(i)n=5の場合
まず、分散データストアDS内のノード数nを5(n=5)とし、ノードN1〜N5の中からデータD1〜D20を格納するノードNiを決定する場合について説明する。ただし、ノードN1〜N5のノード名を、それぞれ”n00”,”n01”,”n02”,”n03”,”n04”とする。
【0121】
また、各データD1〜D20の冗長度R1〜R20を、すべて「2」とする。また、ノードN1〜N5の比率を、それぞれ「1.2」、「1.3」、「1.3」、「1.3」、「2.0」とする。そして、ノード決定装置101は、キーkjから特定されるデータDjの格納先として、ノードN1〜N5の重み付け関数値を昇順に並び換えた場合の先頭から1番目と2番目の重み付け関数値に対応するノードNiを決定する。
【0122】
ここで、データD1のキーk1を”k00”とすると、ノード決定装置101により、上記式(3)および式(4)を用いてノードN1〜N5の重み付け関数値を算出して昇順に並べ換えると、以下のようになる。
g(f_n04(”k00”), 2.0) = 0.033895
g(f_n01(”k00”), 1.3) = 0.042616
g(f_n02(”k00”), 1.3) = 0.151522
g(f_n03(”k00”), 1.3) = 0.254016
g(f_n00(”k00”), 1.2) = 0.435007
【0123】
この場合、ノードN1〜N5のうち最小の重み付け関数値をとるノードNiはノードN5(ノード名:n04)であり、つぎに小さい重み付け関数値をとるノードNiはノードN2(ノード名:n01)である。したがって、キーk1(”k00”)から特定されるデータD1の格納先はノードN5,N2となる。
【0124】
つぎに、データD2のキーk2を”k01”とすると、ノード決定装置101により、上記式(3)および式(4)を用いてノードN1〜N5の重み付け関数値を算出して昇順に並び換えると、以下のようになる。
g(f_n04(”k01”), 2.0) = 0.441253
g(f_n01(”k01”), 1.3) = 0.517887
g(f_n03(”k01”), 1.3) = 0.547294
g(f_n02(”k01”), 1.3) = 0.675380
g(f_n00(”k01”), 1.2) = 0.686856
【0125】
この場合、ノードN1〜N5のうち最小の重み付け関数値をとるノードNiはノードN5(ノード名:n04)であり、つぎに小さい重み付け関数値をとるノードNiはノードN2(ノード名:n01)である。したがって、キーk2(”k01”)から特定されるデータD2の格納先はノードN5,N2となる。
【0126】
同様に、データD3〜D20のキーk3〜k20を”k02”〜”k19”として、各データD3〜D20の格納先を決定すると、ノード名およびキーの対応関係は、図18に示すノード/キー対応リスト1800のようになる。
【0127】
図18は、ノード/キー対応リストの記憶内容の具体例1を示す説明図(その1)である。図18において、ノードN1〜N5ごとにノード名およびキーの対応関係が示されている。ここで、ノードN1〜N5の比率通りにキーkjを分散させた場合は、ノードN1〜N5には、それぞれ「約6.7個」、「約7.3個」、「約7.3個」、「約7.3個」、「約11.2個」のキーkjが対応付けられることになる。図18に示す例では、ノードN1〜N5には、それぞれ「6個」、「7個」、「10個」、「6個」、「11個」のキーkjが対応付けられている。したがって、ノードN1〜N5にそれぞれ対応付けられたキーkjの個数は、十分にノードN1〜N5の比率を反映している。
【0128】
(ii)n=6の場合
つぎに、分散データストアDS内のノード数nが5(n=5)から6(n=6)に増える場合について説明する。ここで、新たに追加されたノードN6のノード名を”n05”とする。
【0129】
上記同様に、データD1のキーk1を”k00”として、ノード決定装置101により、上記式(3)および式(4)を用いてノードN1〜N6の重み付け関数値を算出して昇順に並び換えると、以下のようになる。
g(f_n04(”k00”), 2.0) = 0.033895
g(f_n01(”k00”), 1.3) = 0.042616
g(f_n05(”k00”), 2.5) = 0.134690
g(f_n02(”k00”), 1.3) = 0.151522
g(f_n03(”k00”), 1.3) = 0.254016
g(f_n00(”k00”), 1.2) = 0.435007
【0130】
この場合、ノード数nが5(n=5)の場合と同様に、ノードN1〜N6のうち最小の重み付け関数値をとるノードNiはノードN5(ノード名:n04)であり、つぎに小さい重み付け関数値をとるノードNiはノードN2(ノード名:n01)である。したがって、キーk1(”k00”)から特定されるデータD1の格納先は変化しない。
【0131】
つぎに、データD2のキーk2を”k01”として、ノード決定装置101により、上記式(3)および式(4)を用いてノードN1〜N6の重み付け関数値を算出して昇順に並び換えると、以下のようになる。
g(f_n05(”k01”), 2.5) = 0.137733
g(f_n04(”k01”), 2.0) = 0.441253
g(f_n01(”k01”), 1.3) = 0.517887
g(f_n03(”k01”), 1.3) = 0.547294
g(f_n02(”k01”), 1.3) = 0.675380
g(f_n00(”k01”), 1.2) = 0.686856
【0132】
この場合、ノードN1〜N6のうち最小の重み付け関数値をとるノードNiはノードN6(ノード名:n05)であり、つぎに小さい重み付け関数値をとるノードNiはノードN5(ノード名:n04)である。したがって、キーk2(”k01”)から特定されるデータD2の格納先はノードN5,N2からノードN6,N5に変化する。
【0133】
同様に、データD3〜D20のキーk3〜k20を”k02”〜”k19”として、各データD3〜D20の格納先を決定すると、ノード名およびキーの対応関係は、図19に示すノード/キー対応リスト1900のようになる。
【0134】
図19は、ノード/キー対応リストの記憶内容の具体例1を示す説明図(その2)である。図19において、ノードN1〜N6ごとにノード名およびキーの対応関係が示されている。ここで、ノード数が変化するときに移動するデータDjの総数(すなわち、キーkjの総数)が「K×R×1/(n+1)」に十分近い場合は、ノード数が変化するときのデータ移動量が最小に十分近いといえる。
【0135】
ここでは、「K=20,R=2,n=5」のため、移動するキーkjの総数が「7」に近い場合はデータ移動量が最小に十分近いといえる。図19に示す例では、ノードN6を追加した結果、キー”k01”,”k02”,”k05”,”k06”,”k07”,”k09”,”k13”,”k15”,”k16”,”k17”,”k19”から特定されるデータD2,D6,D7,D8,D10,D14,D20の格納先が変化している。したがって、ノード数が変化するときのデータ移動量が最小に十分近くなっている。
【0136】
また、ノードN1〜N6の比率通りにキーkjを分散させた場合は、ノードN1〜N6には、それぞれ「約5個」、「約5.4個」、「約5.4個」、「約5.4個」、「約8.3個」、「約10.4個」のキーkjが対応付けられることになる。図19に示す例では、ノードN1〜N6には、それぞれ「4個」、「5個」、「6個」、「5個」、「9個」、「11個」のキーkjが対応付けられている。したがって、ノードN1〜N6にそれぞれ対応付けられたキーkjの個数は、十分にノードN1〜N6の比率を反映している。
【0137】
(ノード決定処理の具体例2)
つぎに、ノード決定装置101のノード決定処理の具体例2について説明する。ここでは、ノードNiの関数f_i()として、上記式(3)を用いる。ただし、iはノードNiのノード名、kjはデータDjのキー、(i+kj)はノード名とキーの文字列としての結合を表す。また、ここでは、重み付け関数g()として、下記式(5)を用いる。ただし、c_iはノードNiに関する比率である。なお、「f(i,kj)^c_i」はf(i,kj)をc_iで冪乗する数式である。
【0138】
g()=g(f(i,kj),c_i)=f(i,kj)^c_i
・・・(5)
【0139】
(i)n=5の場合
まず、分散データストアDS内のノード数nを5(n=5)とし、ノードN1〜N5の中からデータD1〜D20を格納するノードNiを決定する場合について説明する。ただし、ノードN1〜N5のノード名を、それぞれ”n00”,”n01”,”n02”,”n03”,”n04”とする。
【0140】
また、各データD1〜D20の冗長度R1〜R20を、すべて「2」とする。また、ノードN1〜N5の比率を、それぞれ「1.2」、「1.3」、「1.3」、「1.3」、「2.0」とする。そして、ノード決定装置101は、キーkjから特定されるデータDjの格納先として、ノードN1〜N5の重み付け関数値を昇順に並び換えた場合の先頭から1番目と2番目の重み付け関数値に対応するノードNiを決定する。
【0141】
ここで、データD1のキーk1を”k00”とすると、ノード決定装置101により、上記式(3)および式(5)を用いてノードN1〜N5の重み付け関数値を算出して昇順に並べ換えると、以下のようになる。
g(f_n04(”k00”), 2.0) = 0.004595
g(f_n01(”k00”), 1.3) = 0.023258
g(f_n02(”k00”), 1.3) = 0.120988
g(f_n03(”k00”), 1.3) = 0.236834
g(f_n00(”k00”), 1.2) = 0.458367
【0142】
この場合、ノードN1〜N5のうち最小の重み付け関数値をとるノードNiはノードN5(ノード名:n04)であり、つぎに小さい重み付け関数値をとるノードNiはノードN2(ノード名:n01)である。したがって、キーk1(”k00”)から特定されるデータD1の格納先はノードN5,N2となる。
【0143】
つぎに、データD2のキーk2を”k01”とすると、ノード決定装置101により、上記式(3)および式(5)を用いてノードN1〜N5の重み付け関数値を算出して昇順に並び換えると、以下のようになる。
g(f_n01(”k01”), 1.3) = 0.597905
g(f_n03(”k01”), 1.3) = 0.642411
g(f_n04(”k01”), 2.0) = 0.778818
g(f_n00(”k01”), 1.2) = 0.792969
g(f_n02(”k01”), 1.3) = 0.844382
【0144】
この場合、ノードN1〜N5のうち最小の重み付け関数値をとるノードNiはノードN2(ノード名:n01)であり、つぎに小さい重み付け関数値をとるノードNiはノードN4(ノード名:n03)である。したがって、キーk2(”k01”)から特定されるデータD2の格納先はノードN2,N4となる。
【0145】
同様に、データD3〜D20のキーk3〜k20を”k02”〜”k19”として、各データD3〜D20の格納先を決定すると、ノード名およびキーの対応関係は、図20に示すノード/キー対応リスト2000のようになる。
【0146】
図20は、ノード/キー対応リストの記憶内容の具体例2を示す説明図(その1)である。図20において、ノードN1〜N5ごとにノード名およびキーの対応関係が示されている。ここで、ノードN1〜N5の比率通りにキーkjを分散させた場合は、ノードN1〜N5には、それぞれ「約6.7個」、「約7.3個」、「約7.3個」、「約7.3個」、「約11.2個」のキーkが対応付けられることになる。図20に示す例では、ノードN1〜N5には、それぞれ「6個」、「7個」、「9個」、「8個」、「10個」のキーkjが対応付けられている。したがって、ノードN1〜N5にそれぞれ対応付けられたキーkjの個数は、十分にノードN1〜N5の比率を反映している。
【0147】
(ii)n=6の場合
つぎに、分散データストアDS内のノード数nが5(n=5)から6(n=6)に増える場合について説明する。ここで、新たに追加されたノードN6のノード名を”n05”とする。
【0148】
上記同様に、データD1のキーk1を”k00”として、ノード決定装置101により、上記式(3)および式(5)を用いてノードN1〜N6の重み付け関数値を算出して昇順に並び換えると、以下のようになる。
g(f_n04(”k00”), 2.0) = 0.004595
g(f_n01(”k00”), 1.3) = 0.023258
g(f_n05(”k00”), 2.5) = 0.065794
g(f_n02(”k00”), 1.3) = 0.120988
g(f_n03(”k00”), 1.3) = 0.236834
g(f_n00(”k00”), 1.2) = 0.458367
【0149】
この場合、ノード数nが5(n=5)の場合と同様に、ノードN1〜N6のうち最小の重み付け関数値をとるノードNiはノードN5(ノード名:n04)であり、つぎに小さい重み付け関数値をとるノードNiはノードN2(ノード名:n01)である。したがって、キーk1(”k00”)から特定されるデータD1の格納先は変化しない。
【0150】
つぎに、データD2のキーk2を”k01”として、ノード決定装置101により、上記式(3)および式(5)を用いてノードN1〜N6の重み付け関数値を算出して昇順に並び換えると、以下のようになる。
g(f_n05(”k01”), 2.5) = 0.069574
g(f_n01(”k01”), 1.3) = 0.597905
g(f_n03(”k01”), 1.3) = 0.642411
g(f_n04(”k01”), 2.0) = 0.778818
g(f_n00(”k01”), 1.2) = 0.792969
g(f_n02(”k01”), 1.3) = 0.844382
【0151】
この場合、ノードN1〜N6のうち最小の重み付け関数値をとるノードNiはノードN6(ノード名:n05)であり、つぎに小さい重み付け関数値をとるノードNiはノードN2(ノード名:n01)である。したがって、キーk2(”k01”)から特定されるデータD2の格納先はノードN2,N4からノードN6,N2に変化する。
【0152】
同様に、データD3〜D20のキーk3〜k20を”k02”〜”k19”として、各データD3〜D20の格納先を決定すると、ノード名およびキーの対応関係は、図21に示すノード/キー対応リスト2100のようになる。
【0153】
図21は、ノード/キー対応リストの記憶内容の具体例2を示す説明図(その2)である。図21において、ノードN1〜N6ごとにノード名およびキーの対応関係が示されている。ここで、ノード数が変化するときに移動するデータDjの総数(すなわち、キーkjの総数)が「K×R×1/(n+1)」に十分近い場合は、ノード数が変化するときのデータ移動量が最小に十分近いといえる。
【0154】
ここでは、「K=20,R=2,n=5」のため、移動するキーkjの総数が「7」に近い場合はデータ移動量が最小に十分近いといえる。図21に示す例では、ノードN6を追加した結果、キー”k01”,”k02”,”k05”,”k06”,”k07”,”k09”,”k13”,”k15”,”k16”,”k19”から特定されるデータD2,D3,D6,D7,D8,D10,D14,D16,D17,D20の格納先が変化している。したがって、ノード数が変化するときのデータ移動量が最小に十分近くなっている。
【0155】
また、ノードN1〜N6の比率通りにキーkjを分散させた場合は、ノードN1〜N6には、それぞれ「約5個」、「約5.4個」、「約5.4個」、「約5.4個」、「約8.3個」、「約10.4個」のキーkjが対応付けられることになる。図21に示す例では、ノードN1〜N6には、それぞれ「4個」、「6個」、「5個」、「6個」、「9個」、「10個」のキーkjが対応付けられている。したがって、ノードN1〜N6にそれぞれ対応付けられたキーkjの個数は、十分にノードN1〜N6の比率を反映している。また、重み付け関数g()として上記式(5)を採用することにより、分散するデータ数が十分に多ければ、ノードN1〜N6にそれぞれ対応付けられるキーkjの個数を、ノードN1〜N6の比率通りの個数にすることができる。
【0156】
以上説明したように、実施の形態にかかるノード決定装置101によれば、ノードNiごとに異なる関数f_i()を用意し、データDjのキーkjを引数として関数値f_i(k)を算出する。そして、ノード決定装置によれば、関数値f_i(k)とノードNiの比率c_iとを引数として得られた重み付け関数値g(f_i(k),c_i)の大小関係から、データDjを格納するノードNiを決定することができる。これにより、ノードNiに格納されるデータDjの個数は比率c_iの値に応じた個数になる。そのため、比率c_iの設定によって記憶容量の大きいノードNiや処理速度の速いノードNiにより多くのデータDjが格納されるようにすることができる。結果として、記憶容量の小さいノードNiや処理の遅いノードNiに過負荷がかかることを回避し、分散データストアDSの効率化を図ることができる。
【0157】
また、ノード決定装置101によれば、関数値f_i(k)とノードNiの比率c_iとを引数として得られた重み付け関数値g(f_i(k),c_i)の大小関係から、データDjを格納するノードNiを決定することができる。これにより、以降において、ノード数が増減しても元のノード間での重み付け関数値g(f_i(k),c_i)の大小関係は不変のため、追加または削除するノードNi以外のノード間でデータDjは移動しない。
【0158】
また、ノード決定装置101によれば、ノードNiごとの重み付け関数値g(f_i(k),c_i)を大小関係に基づいて並び換えたあとの順序にしたがって、データDjを格納する所定数のノードNiを決定することができる。これにより、データDjをRj個のノードNiに冗長して格納することができ、分散データストアDSの耐障害性能を向上させることができる。そして、データDjをRj個のノードNiに冗長して格納する場合も、以降において、ノード数が増減しても元のノード間での重み付け関数値g(f_i(k),c_i)の大小関係は不変のため、追加または削除するノードNi以外のノード間でデータDjは移動しない。
【0159】
また、ノード決定装置101によれば、ノードNiごとのノード名と関数f_i()のペアを用いて、重み付け関数g()によりデータDjを格納するノードNiを決定することができる。このため、データDjを格納するノードNiをキーkjごとに管理して、データDjを格納するノードNiを決定する手法に比べて、データDjの格納先を決定するための情報量を削減することができる。さらに、上記式(1)のような二つの引数をとる関数f()を用いる場合、関数f()とノードNiごとのノード名を用いてデータDjを格納するノードNiを決定することができるため、より情報量を削減することができる。
【0160】
また、ノード決定装置101によれば、関数f_i()として、関数値の頻度分布が十分に等しい関数を用いることで、重み付け関数g()の引数となる関数値f_i(kj)を均等に分散させることができる。したがって、キーkjの値に依存してデータDjの格納先に偏りが生じることはない。
【0161】
また、ノード決定装置101によれば、関数f_1()〜f_n()として、関数値の頻度分布が十分に等しい関数を用いることで、データDjを冗長して格納する場合の重み付け関数g()の引数となる関数値f_i(kj)を均等に分散させることができる。したがって、キーkjの値に依存してデータDjを冗長した格納先に偏りが生じることはない。これにより、例えば、データDjをノードN1〜N3に冗長して格納している場合、ノードN1に障害が発生すると、いつもノードN2,N3に負荷がかかってしまうような状況を回避することができる。
【0162】
また、ノード決定装置101によれば、重み付け関数g()として、引数となる関数値f_i(k)の増加にともなって、重み付け関数値g(f_i(k),c_i)が増加する関数、または、重み付け関数値g(f_i(k),c_i)が減少する関数が採用される。また、ノード決定装置101によれば、重み付け関数g()として、引数となる指標値の増加にともなって、重み付け関数値g(f_i(k),c_i)が増加する関数、または、重み付け関数値g(f_i(k),c_i)が減少する関数が採用される。これにより、各ノードNiの指標値c_iを反映して、重み付け関数値g(f_i(k),c_i)を算出することができ、各ノードNiの指標値c_iに応じて分散データストアDS内の各ノードNiにデータDjを分散させて格納することができる。
【0163】
また、ノード決定装置101によれば、重み付け関数g()として、重み付け関数の値域で定義される当該重み付け関数の値の大小関係が、ノードNiごとの指標値c_iの和に対するいずれかのノードNiの指標値c_iの割合で、いずれかのノードNiの重み付け関数値g(f_i(k),c_i)が最大または最小になる関係である関数を採用できる。これにより、各ノードNiの指標値c_iを反映して、重み付け関数値g(f_i(k),c_i)を算出することができ、各ノードNiの指標値c_iに応じて分散データストアDS内の各ノードNiにデータDjを分散させて格納することができる。
【0164】
なお、本実施の形態で説明したノード決定方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本ノード決定プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本ノード決定プログラムは、インターネット等のネットワークを介して配布してもよい。
【0165】
上述した実施の形態に関し、さらに以下の付記を開示する。
【0166】
(付記1)複数のノードの中からデータを格納するノードを決定するコンピュータに、
前記複数のノードに含まれるノードごとに異なる関数であって、当該関数の定義域が前記データを一意に特定するためのキーを含む前記関数を前記ノードごとに関連付け、
格納するデータ量を示す前記ノードごとの指標値を前記ノードごとに関連付け、
前記ノードごとの関数に前記キーをそれぞれ代入することにより、前記ノードごとの関数の値を算出し、
定義域が前記ノードごとの関数の値と前記ノードごとの指標値との組み合わせを含む重み付け関数であって、前記重み付け関数の値域で当該重み付け関数の値の大小関係が定義される前記重み付け関数に、前記ノードごとの関数の値と前記ノードごとの指標値とを代入することにより、前記重み付け関数の値を前記ノードごとに算出し、
前記ノードごとの前記重み付け関数の値の大小関係に基づいて、前記データを格納するノードを決定し、
決定結果を出力する、
処理を実行させることを特徴とするノード決定プログラム。
【0167】
(付記2)前記ノードごとの前記重み付け関数の値の大小関係に基づいて、前記ノードごとの前記重み付け関数の値を並び換え、
並び換えられた前記ノードごとの前記重み付け関数の値の順序にしたがって、前記複数のノードの中から所定数のノードを選択する処理を、前記コンピュータにさらに実行させ、
前記決定する処理は、選択された前記所定数のノードを、前記データを格納するノードに決定することを特徴とする付記1に記載のノード決定プログラム。
【0168】
(付記3)前記複数のノードに新たなノードを追加する場合、前記複数のノードに格納されているデータごとに、前記各処理を前記コンピュータに実行させることを特徴とする付記1または2に記載のノード決定プログラム。
【0169】
(付記4)前記複数のノードからノードを削除する場合、当該ノードに格納されているデータごとに、前記各処理を前記コンピュータに実行させることを特徴とする付記1〜3のいずれか一つに記載のノード決定プログラム。
【0170】
(付記5)前記関数は、前記キーを引数として与えることで固定長の乱数が得られる関数であることを特徴とする付記1〜4のいずれか一つに記載のノード決定プログラム。
【0171】
(付記6)前記重み付け関数は、前記指標値の増加にともなって前記重み付け関数の値が増加する関数または前記指標値の増加に対して前記重み付け関数の値が減少する関数であることを特徴とする付記1〜5のいずれか一つに記載のノード決定プログラム。
【0172】
(付記7)前記重み付け関数の値域で定義される当該重み付け関数の値の大小関係は、前記ノードごとの指標値の和に対するいずれかのノードの指標値の割合で、前記いずれかのノードの前記重み付け関数の値が最大または最小になる関係であることを特徴とする付記1〜6のいずれか一つに記載のノード決定プログラム。
【0173】
(付記8)複数のノードの中からデータを格納するノードを決定するノード決定装置において、
前記複数のノードに含まれるノードごとに異なる関数であって、当該関数の定義域が前記データを一意に特定するためのキーを含む前記関数を前記ノードごとに関連付ける第1の関連付け手段と、
格納するデータ量を示す前記ノードごとの指標値を前記ノードごとに関連付ける第2の関連付け手段と、
前記第1の関連付け手段によって関連付けられた前記ノードごとの関数に前記キーをそれぞれ代入することにより、前記ノードごとの関数の値を算出する第1の算出手段と、
定義域が前記ノードごとの関数の値と前記ノードごとの指標値との組み合わせを含む重み付け関数であって、前記重み付け関数の値域で当該重み付け関数の値の大小関係が定義される前記重み付け関数に、前記ノードごとの関数の値と前記ノードごとの指標値とを代入することにより、前記重み付け関数の値を前記ノードごとに算出する第2の算出手段と、
前記第2の算出手段によって算出された前記ノードごとの前記重み付け関数の値の大小関係に基づいて、前記データを格納するノードを決定する決定手段と、
前記決定手段によって決定された決定結果を出力する出力手段と、
を備えることを特徴とするノード決定装置。
【0174】
(付記9)複数のノードの中からデータを格納するノードを決定するコンピュータが、
前記複数のノードに含まれるノードごとに異なる関数であって、当該関数の定義域が前記データを一意に特定するためのキーを含む前記関数を前記ノードごとに関連付け、
格納するデータ量を示す前記ノードごとの指標値を前記ノードごとに関連付け、
前記ノードごとの関数に前記キーをそれぞれ代入することにより、前記ノードごとの関数の値を算出し、
定義域が前記ノードごとの関数の値と前記ノードごとの指標値との組み合わせを含む重み付け関数であって、前記重み付け関数の値域で当該重み付け関数の値の大小関係が定義される前記重み付け関数に、前記ノードごとの関数の値と前記ノードごとの指標値とを代入することにより、前記重み付け関数の値を前記ノードごとに算出し、
前記ノードごとの前記重み付け関数の値の大小関係に基づいて、前記データを格納するノードを決定し、
決定結果を出力する、
処理を実行することを特徴とするノード決定方法。
【符号の説明】
【0175】
101 ノード決定装置
400 分散システム
601 受付部
602 第1の関連付け部
603 第2の関連付け部
604 第1の算出部
605 第2の算出部
606 決定部
607 並換部
608 選択部
609 出力部
700 キーリスト
800 関数リスト
900 指標値リスト
1000 関数値リスト
1100 重み付け関数値リスト
1200 ノード/キー対応リスト
C クライアント装置
N1〜Nn ノード

【特許請求の範囲】
【請求項1】
複数のノードの中からデータを格納するノードを決定するコンピュータに、
前記複数のノードに含まれるノードごとに異なる関数であって、当該関数の定義域が前記データを一意に特定するためのキーを含む前記関数を前記ノードごとに関連付け、
格納するデータ量を示す前記ノードごとの指標値を前記ノードごとに関連付け、
前記ノードごとの関数に前記キーをそれぞれ代入することにより、前記ノードごとの関数の値を算出し、
定義域が前記ノードごとの関数の値と前記ノードごとの指標値との組み合わせを含む重み付け関数であって、前記重み付け関数の値域で当該重み付け関数の値の大小関係が定義される前記重み付け関数に、前記ノードごとの関数の値と前記ノードごとの指標値とを代入することにより、前記重み付け関数の値を前記ノードごとに算出し、
前記ノードごとの前記重み付け関数の値の大小関係に基づいて、前記データを格納するノードを決定し、
決定結果を出力する、
処理を実行させることを特徴とするノード決定プログラム。
【請求項2】
前記ノードごとの前記重み付け関数の値の大小関係に基づいて、前記ノードごとの前記重み付け関数の値を並び換え、
並び換えられた前記ノードごとの前記重み付け関数の値の順序にしたがって、前記複数のノードの中から所定数のノードを選択する処理を、前記コンピュータにさらに実行させ、
前記決定する処理は、選択された前記所定数のノードを、前記データを格納するノードに決定することを特徴とする請求項1に記載のノード決定プログラム。
【請求項3】
前記複数のノードに新たなノードを追加する場合、前記複数のノードに格納されているデータごとに、前記各処理を前記コンピュータに実行させることを特徴とする請求項1または2に記載のノード決定プログラム。
【請求項4】
前記複数のノードからノードを削除する場合、当該ノードに格納されているデータごとに、前記各処理を前記コンピュータに実行させることを特徴とする請求項1〜3のいずれか一つに記載のノード決定プログラム。
【請求項5】
複数のノードの中からデータを格納するノードを決定するノード決定装置において、
前記複数のノードに含まれるノードごとに異なる関数であって、当該関数の定義域が前記データを一意に特定するためのキーを含む前記関数を前記ノードごとに関連付ける第1の関連付け手段と、
格納するデータ量を示す前記ノードごとの指標値を前記ノードごとに関連付ける第2の関連付け手段と、
前記第1の関連付け手段によって関連付けられた前記ノードごとの関数に前記キーをそれぞれ代入することにより、前記ノードごとの関数の値を算出する第1の算出手段と、
定義域が前記ノードごとの関数の値と前記ノードごとの指標値との組み合わせを含む重み付け関数であって、前記重み付け関数の値域で当該重み付け関数の値の大小関係が定義される前記重み付け関数に、前記ノードごとの関数の値と前記ノードごとの指標値とを代入することにより、前記重み付け関数の値を前記ノードごとに算出する第2の算出手段と、
前記第2の算出手段によって算出された前記ノードごとの前記重み付け関数の値の大小関係に基づいて、前記データを格納するノードを決定する決定手段と、
前記決定手段によって決定された決定結果を出力する出力手段と、
を備えることを特徴とするノード決定装置。
【請求項6】
複数のノードの中からデータを格納するノードを決定するコンピュータが、
前記複数のノードに含まれるノードごとに異なる関数であって、当該関数の定義域が前記データを一意に特定するためのキーを含む前記関数を前記ノードごとに関連付け、
格納するデータ量を示す前記ノードごとの指標値を前記ノードごとに関連付け、
前記ノードごとの関数に前記キーをそれぞれ代入することにより、前記ノードごとの関数の値を算出し、
定義域が前記ノードごとの関数の値と前記ノードごとの指標値との組み合わせを含む重み付け関数であって、前記重み付け関数の値域で当該重み付け関数の値の大小関係が定義される前記重み付け関数に、前記ノードごとの関数の値と前記ノードごとの指標値とを代入することにより、前記重み付け関数の値を前記ノードごとに算出し、
前記ノードごとの前記重み付け関数の値の大小関係に基づいて、前記データを格納するノードを決定し、
決定結果を出力する、
処理を実行することを特徴とするノード決定方法。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate

【図20】
image rotate

【図21】
image rotate


【公開番号】特開2013−109672(P2013−109672A)
【公開日】平成25年6月6日(2013.6.6)
【国際特許分類】
【出願番号】特願2011−255556(P2011−255556)
【出願日】平成23年11月22日(2011.11.22)
【出願人】(000005223)富士通株式会社 (25,993)