以下、図面を参照して本発明の実施形態(本実施形態)を説明する。なお、以下で説明する実施形態は一例に過ぎず、本発明が適用される実施形態は、以下の実施形態に限られるわけではない。
例えば、以下で説明する例では、クラスタを構成するノード自身が、テーブル保持、リバランス実行判定、リバランス設計、リバランス実行(振分ID表の配付)等を行うこととしているが、テーブル保持、リバランス実行判定、リバランス設計、リバランス実行等を、クラスタを構成するノード以外の装置が実行してもよい。この場合、当該装置が各ノードの負荷情報を収集し、テーブル保持、リバランス実行判定、リバランス設計、振分ID表の配付等を行う。
なお、テーブル保持、リバランス実行判定、リバランス設計、リバランス実行等を行う主体が、ノード自身の場合、ノード以外の装置の場合のいずれの場合も、当該主体をリバランス装置と称することができる。
また、以下で説明するリバランスの方法は一例である。本発明に係るID空間情報の持ち方は、以下で説明するリバランスの方法に限らず、他のリバランスの方法にも適用可能である。
ただし、以下で説明するリバランスの方法は、非特許文献4のように隣接ノード間での空間配置変更に限定されず、効率的に負荷の偏りを是正できる優れたリバランスの方法である。
<第1実施形態>
(システムの全体構成、ノードの構成)
図1は、本発明の第1実施形態に係る分散システムの構成例を示すブロック図である。
図1に示す分散システム10は、コンシステント・ハッシュ法を用いた複数のノード15を利用し、データ管理を行うシステムである。当該分散システム10では、分散システム10を構成するノード15間で負荷の偏りが生じた際に、現行ノード15の負荷の偏り状況を踏まえて、効率的にリバランスを行い負荷の偏りを是正する。
分散システム10は、複数のクライアントマシン(単に、クライアントともいう)11にインターネット等のネットワーク12を介して接続されたロードバランサ13と、クラスタ14を構成する複数のノード15とを備えて構成されている。
各ノード15は、コンピュータ等の物理装置や仮想マシン等の論理装置、言い換えれば、物理的又は仮想的なサーバ等である。クライアント11からのメッセージが、ロードバランサ13によって各ノード15に振り分けられる。この振り分けは、単純なラウンドロビン法等により行われる。なお、物理的又は仮想的なサーバ等である各ノード15を、「物理ノード」と称してもよい。
各ノード15、リバランス装置は、制御部18及び記憶部19を備えて構成されている。但し、制御部18及び記憶部19は、ソフトウェア(プログラム)が上記装置(コンピュータ、仮想マシン)によって実行されることにより実現されている。当該プログラムは、ネットワークを介して配信してもよいし、メモリ等の記憶媒体に記憶して配付してもよい。なお、制御部18及び記憶部19は、それぞれハードウェア(例:処理ロジックを組み込んだ集積回路)によって構成してもよい。
図2(a)に示すように、制御部18は、ノード識別子管理部18aと、振分部18bと、信号処理部18cと、ノード負荷計測部18dと、分散システム負荷リバランス部(単に、リバランス部ともいう)18eと、テーブル生成部18fと、情報アクセス部18gとを備える。
図2(b)に示すように、記憶部19は、ノード識別子管理表19aと、振分ID表19bと、データ19cと、ノード負荷計測データ19dと、分散システム負荷集計データ19eと、呼制御状態フラグ19fと、テーブルストア19gとを記憶する。なお、ノード識別子管理表19aを管理表19aともいい、分散システム負荷集計データ19eを集計データ19e、呼制御状態フラグ19fをフラグ19fともいう。
振分部18bは、クライアント11からのメッセージを、例えばコンシステント・ハッシュ法等に基づき、メッセージを担当するノード15に振り分ける。
信号処理部18cは、クライアント11からのメッセージに応じて、所定の信号処理を行い、クライアント11にサービスを提供する。つまり、メッセージを担当するノード15では、信号処理部18cにて所定の信号処理を行ってクライアント11にサービスを提供する。この振分部18b及び信号処理部18cの処理動作については後述で更に詳細に説明する。
但し、分散システム10においては、ロードバランサ13が存在せず、クライアント11から任意のノード15(振分部18b)にメッセージを送信することも可能である。また、振分部18bと信号処理部18cは、図2のように同じノード15上に同時に存在させてもよいし、別ノード15上に存在させてもよい。
制御部18において、ノード識別子管理部18a(あるいはリバランス部18e)は、分散システム10上のノード情報をノード識別子管理表19aに蓄積することにより、各ノード15が担当するID空間を管理する。このID空間は、コンシステント・ハッシュ法ではコンシステント・ハッシュ上の空間(ハッシュ空間)である。
このハッシュ空間を、例えば図3に示すように、複数のノードA〜Eで分割し、各ノードA〜Eの担当領域を決めて管理する。この際、ノードAが担当するハッシュ空間は、ノードEから時計回りにノードAまでの領域であり、このハッシュ空間に存在するデータを担当ノードAが保持(もしくは処理)する。他のノードB〜Eも同様である。なお、ハッシュ空間(担当領域)のサイズが大きい程に、多くのデータを保持(処理)できるようになっている。
図2(a)に戻って、振分部18bは、振分ID表19bに基づき、メッセージ等のデータの振分先の決定に関する処理を行う。
信号処理部18cは、ノード15における信号処理を行う。この信号処理時のアクセス対象となるデータ19cが記憶部19に記憶される。
ノード負荷計測部18dは、自ノード15の負荷を計測し、この計測結果を記憶部19にノード負荷計測データ19dとして記録すると共に、必要に応じて定められる特権ノード15(図3に示す例えばノードB)に送付する。特権ノード15は、各ノード15から収集したノード負荷計測データを記憶する。また、特権ノード15は、各ノード15から収集したノード負荷計測データと、自ノードのノード負荷計測データを他の各ノード15に配付してもよい。
分散システム負荷リバランス部18eは、分散システム10全体のノード負荷に基づいて、負荷の平均値及び標準偏差等の算出を行い、これらの算出結果である分散システム負荷集計データ19eを記憶部19に記憶する。更に、リバランス部18eは、その記憶された集計データ19eに基づくリバランスの実行判定、並びにリバランス設計を行って、リバランスを実行する。
また、記憶部19に記憶される呼制御状態フラグ19fは、新規呼を制御する状態か否かを判別するための情報である。
テーブル生成部18fは、物理ノード毎の仮想ノードIDテーブル、スロット負荷量リスト、物理ノード毎のインデックステーブル、物理ノード毎のカウンタを生成し、これらをテーブルストア(テーブル格納領域)19gに格納する。情報アクセス部18gは、物理ノードIDを指定した他機能部からの要求に基づいて、テーブル生成部18fにより生成された物理ノード毎の仮想ノードIDテーブル、物理ノード毎のインデックステーブル、物理ノード毎のカウンタを利用して、スロット負荷量リストに保持されている負荷量を取得して、他機能部に渡す。
テーブル生成部18f、データアクセス部18g、テーブルストアに格納される各テーブルの詳細については後述する。
(振分部18b及び信号処理部18cにおける処理について)
ここで、前述した図2に示すノード15の振分部18b及び信号処理部18cによるメッセージの振分処理及び信号処理について更に詳細に説明する。
振分部18bは、クライアント11から発呼されるメッセージ内の情報をもとに、信号処理を担当するノード15を特定し、当該ノード15にメッセージの振り分けを行う。メッセージは、新規呼(例えば、SIP(Session Initiation Protocol)においてはInitial−INVITE等)と後続呼(SIPにおいてはBYE等)に分けられる。
新規呼か後続呼かの識別は、呼のメッセージに後述の振分キーが埋め込まれているか否かで判定できる。例えば、SIPにおいては、To/FromヘッダのTag等で判定できる。
振分キーは、"データ識別子(SIPにおいてはcall−id)+ハッシュ値"で構成されている。ハッシュ値は、データ識別子からハッシュ関数をかけて導出された値である。
一方、上述した新規呼か後続呼かの識別の判定の結果、後続呼の場合、振分部18bにて、振分ID表19b上のノード15毎の担当領域である振分ID空間{図4(b)に示し後述する}と、振分キー内のハッシュ値とを比較して担当するノード15を特定する。更に、担当するノード15のアドレスを、後述の図4(a)に示すノード識別子管理表19aから特定し、この特定されたノード15に転送する。
一方、上述した判定の結果、新規呼の場合、振分キーが存在しないため、メッセージからCall−id(データ識別子)を抽出し、これをハッシュ関数に導入してハッシュ値を導出する。更に、振分部18bにて、振分ID表19b上のノード15毎の担当領域である振分ID空間{図4(b)に示し後述する}と、導出したハッシュ値とを比較して担当するノード15を特定する。更に、担当するノード15のアドレスを、後述の図4(a)に示すノード識別子管理表19aから特定し、この特定されたノード15に転送する。
新規呼を信号処理部18cで受信した場合も、メッセージからCall−id(データ識別子)を抽出し、これをハッシュ関数に導入してハッシュ値を導出して、振分キーを生成する。また、信号処理部18cによる信号処理後に、クライアント11(SIPにおいてはUACやUAS等)に送付するメッセージに振分キーを埋め込んで(SIPにおいてはTo/FromヘッダのTag)送付する。
以降、クライアント11からの後続呼には本振分キーを埋め込みの上、メッセージを送付し、振分部18bにて本振分キーのハッシュ値を基に振り分けが行われることで、当該呼が処理されたノード15に後続呼が届くことが可能となる。
上記のメッセージは、本実施の形態において各ノード15が処理の対象とする「データ」の例である。また、同じデータ識別子(同じID空間上の位置)のデータ(メッセージ)を処理する頻度は、当該データの負荷量に相当する。
(ノード識別子管理部18aについて)
次に、上述したノード識別子管理部18aについて、より詳細に説明する。
ノード識別子管理部18aは、分散システム10へのノード15の追加や離脱が発生した際に、分散システム10を構成するノード15の識別子情報(ノード識別子)を更新し、これを、図4(a)に示すノード識別子管理表19aとして管理する。図4(a)の例においては、ノード識別子(又はノードID)(例えば、「Node1」)に、アドレス(例えば、「10.45.0.1」)が対応付けられている。そのノード識別子は、特権ノードのノード識別子管理部18aで付与され、全ノード15へと配信される。
コンシステント・ハッシュ法においては、ノード識別子に、図4(b)に示す仮想ノード識別子(又は仮想ノードID)が従属している。この仮想ノードIDは、振分ID空間上のID(ハッシュ値による)である。例えば図4(a)に示すノード識別子「Node1」には、図4(b)の振分ID表19bに示す少なくとも1つ以上の仮想ノードID「Node1−1」,「Node1−2」が従属している。言い換えれば、ノード15に1つ以上の仮想ノードが従属している。但し、これは基本構成であって、ノード15に仮想ノードが従属しない場合もある。
このように、ノード識別子管理部18aは、前述のノード識別子管理表19aの更新と合わせて、ノード15が担当する振分ID空間の担当領域を更新し、これを振分ID表19bとして管理する。振分ID表19bには、例えば、仮想ノードID「Node1−1」に、担当する振分ID空間の担当領域として「0〜199(D=200)」のデータサイズが対応付けられ、仮想ノードID「Node1−2」に、担当する振分ID空間の担当領域として「600〜999(D=400)」のデータサイズが対応付けられている。即ち、D=200は、担当領域のサイズが200であることを示す。他のD=400等も同じである。また、振分ID表19bは各ノード15が生成してもよいし、特定のノード(特権ノード)が生成して、各ノードに配付することとしてもよい。
(ID空間の情報の持ち方について:テーブルストア19g、テーブル生成部18f、情報アクセス部18g)
次に、本実施の形態における情報の持ち方について説明する。前述したように、従来技術では、負荷量をデータの属性としてしか持たなかったことから、後述するリバランスのを行う際に、仮想ノード毎の負荷量の計算に時間がかかった。本実施の形態では、以下で説明するようなテーブル構造で負荷量等の情報を持たせることとしたので、仮想ノード毎の負荷量を高速に取得することを可能としている。
図5は、本実施の形態における情報の持ち方を説明するための図である。図5において、物理ノードID、仮想ノードID等のIDは、物理ノード、仮想ノードの識別番号であり、ID空間上の位置を示すものではない。なお、「物理ノード」は、これまでに説明したノード15に相当する。
スロットとは、ID空間上における仮想ノード間の領域であり、図4(b)で説明した各仮想ノードの担当領域に相当する。スロットIDは、スロットの識別番号である。
テーブルストア19gには、図5に示すように、物理ノード(pid)毎のカウンタ(vCounter)、物理ノード毎のインデックステーブル(randomIndexTable)、物理ノード毎の仮想ノードIDテーブル(vidTable)、スロット負荷量リスト(slotWeightList)が格納される。
物理ノード毎のカウンタは、全物理ノードについての物理ノード毎に、物理ノードに対応する仮想ノードの数をカウントする機能(プログラム等)である。当該カウンタは、仮想ノード数をnとした場合に、0からn−1までの値のリストであってもよい。
物理ノード毎のインデックステーブルは、物理ノード毎に、カウンタ値に対応する仮想ノードIDを格納するテーブルであり、より具体的なイメージを図6(a)に示す。図6(a)の例では、物理ノードID=「ノードA」の情報が示されている。
物理ノード毎の仮想ノードIDテーブルは、物理ノード毎に、仮想ノードIDに対応するスロットIDを格納するテーブルであり、より具体的なイメージを図6(b)に示す。図6(b)の例では、物理ノードID=「ノードA」の情報が示されている。
スロット負荷量リストは、スロット毎に、対応する物理ノードID、スロットの先頭番地(ID空間におけるid)、及び負荷量を格納するテーブルであり、より具体的なイメージを図6(c)に示す。
上記の各テーブルは、各ノード15が生成してもよいし、特権ノードが生成して、各ノード15に配付することとしてもよい。
上記の各テーブルは、テーブル生成部18fが生成する。一例として、テーブル生成部18fは、ノード識別子管理部18aから、物理ノード毎の仮想ノード数、各仮想ノードID、担当領域(スロット)等の情報を取得し、上記の各テーブルを作成する。
スロット負荷量リストにおける負荷値については、例えば、ノード負荷計測部18dが、自ノードで担当するデータの負荷量(例:データの処理時間、データのアクセス頻度等)を測定するとともに、他の各ノードから、それぞれ担当する各データの負荷量を収集し、これらの負荷量をノード負荷計測データとして記憶部19に記憶する。
そして、テーブル生成部18fが、データの識別子(ID空間上の位置)に基づき、データ毎のスロットを判断し、各スロットに含まれる各データの負荷量を合計することで、スロット毎の負荷量を算出し、スロット負荷量リストに記録する。
上記の負荷量の収集、テーブルへの記録は、リバランスとは独立して周期的に行われる。これにより、図5に示すテーブルとその格納情報が常に新しい状態で維持される。
上述した各テーブルがテーブルストア19gに格納されることで、例えば、仮想ノード毎、物理ノード毎の負荷量を高速に取得することができる。ある機能部が、仮想ノードあるいは物理ノードの負荷量を使用する場合には、情報アクセス部18gが使用される。一例として、リバランス部18eが、仮想ノード毎、物理ノード毎の負荷量を取得する場合の動作を説明する。
リバランス部18eは、負荷量を取得する対象の物理ノードのID(ここでは「物理ノードA」とする)を情報アクセス部18gに対して指定する。情報アクセス部18gは、テーブルストア19gを参照し、当該物理ノードAのカウンタ(0〜n−1)を使用して、まず、物理ノード毎のインデックステーブルを参照して、物理ノードAの0番の仮想ノードID(ここでは、「仮想ノード0」とする)を取得する。そして、情報アクセス部18gは、物理ノード毎の仮想ノードIDテーブルを参照し、物理ノードAの仮想ノード0に対応するスロットIDを取得し、スロット負荷量リストを参照して、当該スロットにおける負荷量を取得する。
上記の処理をカウンタの値1〜n−1のそれぞれについても同様に行うことで、情報アクセス部18gは、物理ノードAの各仮想ノードの負荷量を取得し、これらをリバランス部18eに渡す。リバランス部18eは、各仮想ノードの負荷量から、後述する種々の値を計算する。例えば、物理ノードAの全仮想ノードに負荷量の合計を物理ノードAの負荷量として求めることができる。
(ノード負荷計測部18dの処理について)
ノード負荷計測部18dは、所定の周期で当該ノード15(自ノード)の負荷を計測し、これをノード負荷計測データ19dとして記憶部19に記録して蓄積する。また、ノード負荷計測部18dは、所定の周期で特権ノード(例えば図3に示すノードB)に、蓄積したノード負荷計測データ19dを送付する。
また、特権ノードは、各ノード15から収集した全ノードの負荷データを、全ノード15へ配信する。各ノード15は、この負荷データをノード負荷計測データ19dとして記憶部19に記録することができる。
上述したノード負荷計測部18dにおいて所定周期で計測されるノード15の負荷として、CPU(Central Processing Unit)使用率、メモリ使用率、アクセス頻度等の、ノード15にて取得可能なあらゆるパラメータを使用することができる。本実施形態では、アクセス頻度を例にとって説明を行っている。
(分散システム負荷リバランス部18eによるリバランスの処理について)
次に、上述した分散システム負荷リバランス部18eによるノード15の負荷の偏り算出及びリバランス実行の処理について説明する。以下で説明する分散システム負荷リバランス部18eにおけるリバランス実行判断、リバランス設計、実行(振分ID表配付)の処理は、どのノード15が行ってもよいが、ここでは、特権ノードが行うことを想定している。
リバランス部18eは、テーブルストア19gに格納されているテーブルの情報に基づき、分散システム10全体のノード15の負荷の平均値及び標準偏差、偏差並びに偏差/標準偏差(偏差を標準偏差で除した値)の算出を行う。更に、リバランス部18eは、それらの算出結果を、図7に一例を示すように集計データ19eとして記録し、この記録した集計データ19eに基づき、後述の3つの条件(1)〜(3)の何れか1つを満たす場合、ノード15間の負荷の偏りを是正するリバランスが必要であると判定する。何れも満たさない場合はリバランスを実行しない。
図7に示す集計データ19eには、収集(集計時)の時刻、ノードID(ノード識別子)、平均値(アクセス頻度)、標準偏差、実測値(アクセス頻度)、偏差(平均値からの差分)、及び偏差/標準偏差が記録される。なお、平均値及び実測値は、アクセス頻度の平均値及び実測値である。前述したように、図7に示すノード(物理ノード)毎の集計データは以下のようにして取得できる。
リバランス部18eは、情報アクセス部18gに対して各ノードIDを指定して、ノード毎に、全仮想ノードの負荷量(アクセス頻度)を取得して、合計を算出することで、ノード毎の実測値を取得する。これを基に、平均値等を計算する。
条件(1)、リバランス部18eは、集計データ19eに基づき、いずれかのノード15の負荷が、当該ノード15が許容する負荷の上限値(予め定められた上限値)を超えていないか否かをチェックし、上限値を超えるノードが存在する場合に、リバランスを実行する。
条件(2)、リバランス部18eは、集計データ19eに基づき、ノード15全体の負荷の標準偏差が所定の閾値(第1閾値)以下であるか否かを確認し、閾値を超えている場合に、リバランスを実行する。
条件(3)、リバランス部18eは、集計データ19eに基づき、ノード15毎の負荷の偏差/標準偏差が所定の閾値(第2閾値)以下であるか否かを確認し、閾値を超えているノード15がある場合に、リバランスを実行する。
但し、図7に示す集計データ19eは、各ノード15が許容する負荷の上限値をアクセス頻度の実測値についての上限値として、これを「90」{条件(1)}とし、標準偏差の閾値を「15」{条件(2)}、偏差/標準偏差の閾値(乖離閾値ともいう)を「1.2」{条件(3)}とした際の例である。
この例では、条件(1)、(2)は満たさない。しかし、図7ではノード識別子の「Node1」、「Node3」、「Node4」の偏差/標準偏差が「1.5」であり、閾値「1.2」を超えており、条件(3)を満たしているため、リバランスが実行される。
(分散システム負荷リバランス部18eによるリバランスの設計、及び実行処理について)
リバランス部18eが実行するリバランスの設計、及び実行処理について説明する。
リバランスでは、負荷の高いノード15の担当領域(担当のID空間)中の移譲領域(後述)を、負荷の低いノード15へ移譲することで負荷の偏りを是正する。この時、負荷の乖離を是正するために、担当領域の必要な移譲領域のサイズを推定の上、その移譲領域のみを移譲する。但し、移譲領域は、担当領域の全てであったり、担当領域の100%未満の割合の領域であったりする。
本実施の形態において、この移譲の方法は、次の(T1)〜(T4)のようになる。
(T1)全てのノード15の中で最も負荷の高いノード15の担当領域中の移譲領域を、最も低いノード15に対して移譲していくものとする。
(T2)移譲領域の移譲は次の場合に終了するものとする。即ち、上記の条件(1)〜(3)の何れかを満たす要因となった偏差の全てが存在しなくなった場合(T2−1)、若しくは、その偏差の一部(予め指定の偏差解消割合を満たす偏差)を解消する移譲領域の移譲が決定した場合(T2−2)、若しくは、移譲領域の移譲を許容可能な移譲先ノード15が存在しなくなった場合(T2−3)に終了するものとする。
(T3)移譲領域の移譲単位は、ノード単位や仮想ノード単位でも構わないし、仮想ノード単位でなく、仮想ノードの担当領域の半分を割譲する単位や、1つのハッシュ値によるデータのみの移譲単位でも構わない。
(T4)リバランス部18eがリバランスを行う際に事前に実行するリバランス設計は、ノード単位で行ってもよいし、仮想ノード単位で行ってもよいし、データ単位で行ってもよい。どの単位で実行するかで、可能なリバランス設計の粒度が、次に記載するように変わる。なお、ノード単位の負荷量、仮想ノード単位の負荷量は、テーブルストア19gのテーブルから取得/算出できる。また、データ単位の負荷量は、ノード負荷計測部18dにより格納されるデータ毎の負荷量から得ることができる。
即ち、ノード単位の場合、後述のリバランス粒度が粗い場合のみの方式となる。
仮想ノード単位の負荷計測の場合、後述のリバランス粒度が粗い場合及びリバランス粒度が中間(粗いと細かいとの中間)の場合の方式が可能となる。
データ単位の負荷計測の場合、後述のリバランス粒度が粗い場合、中間の場合及び細かい場合の3つ全ての方式が採用可能となる。
まず、リバランス粒度が粗い場合について説明する。
ノード15全体における負荷の総量を、ノード15全ての仮想ノードID数で割った仮想ノード当たりの平均負荷量「Lv_ave」を算出する。次に、ノード15間において最も負荷の高いノード15に着目し、このノード15について解消すべき負荷量の偏差(この偏差の符号は+であることから、プラス偏差ともいう)「Ltarget」を算出する。この偏差は、例えば、当該ノード15について、図7で示されているプラスの偏差(実測値の平均値との差分)である。
次に、「Ltarget」を「Lv_ave」で割った値を、解消すべき負荷量を解消するために必要な仮想ノードID数「Vtarget_num」と考える。
この最も負荷の高いノード15の仮想ノードの中から無作為に「Vtarget_num」の仮想ノードIDを抽出する。この時、「Vtarget_num」に小数が含まれる場合は、上記(T3)にその概要を記載したように、所定の仮想ノードIDの仮想ノードの担当領域を例えば小数に基づき割譲してもよい。これは、例えば「1.5」の場合、仮想ノード1つの担当領域の割譲と、仮想ノード2つ目の担当領域を半分にして割譲することである。更に、小数部分を切り捨てや切り上げ、又は四捨五入する等して整数個の仮想ノードIDを抽出してもよい。
上述したように、無作為に抽出された仮想ノードID「Vtarget_num」の仮想ノードの担当領域中の移譲領域を移譲する際に、全てのノード15の中で、最も負荷の低いノード15から順に移譲していく。この際、移譲によって移譲先のノード15の負荷が高まりすぎないように、許容可能な担当領域の移譲サイズを求める必要がある。
具体的には、移譲先のノード15は、負荷量の偏差(この偏差の符号は−であることから、マイナス偏差ともいう)までは受け入れ許容可能である。このため、負荷量のマイナス偏差を平均負荷量「Lv_ave」で割った値である負荷量解消に必要な仮想ノードID数「Vget_num1」が、許容可能な仮想ノードID数となる。
ここで、移譲先のノード15の担当領域が許容量を越える場合は、次に負荷の低いノード15について、同様の手順で許容可能な仮想ノードID数「Vget_num2」を求めていき、Vtarget_num<Vget_num1+Vget_num2+…となって、全ての必要な担当領域中の移譲領域の移譲が完了すれば終了となる。
以降同様の処理を、次に負荷の高いノードに対しても実行し、全ての負荷乖離の解消が必要なノード15において、負荷の乖離を是正する担当領域中の移譲領域の移譲が完了するか、若しくは、移譲領域の移譲が可能なノードが存在しなくなるまで実行する。
次に、リバランス粒度が中間の場合について説明する。
基本的に上述したリバランス粒度が粗い場合と同じであるため、粗い場合との差分のみを説明する。
上述したように、移譲元のノード15の仮想ノードの中から無作為に仮想ノードを抽出するのではなく、解消すべき負荷量のプラス偏差を発生させている仮想ノードを選択的に抽出し、この抽出した仮想ノードの担当領域中の移譲領域を移譲するものとする。
次に、リバランス粒度が細かい場合について説明する。
基本的に上述したリバランス粒度が粗い場合と同じであるため、粗い場合との差分のみを説明する。
上述したように、移譲元のノード15の仮想ノードの中から無作為に仮想ノードを抽出するのではなく、解消すべき負荷量のプラス偏差を発生させているデータのハッシュ値を選択的に抽出し、そのハッシュ値のみを移譲するものとする。この場合、データ単位で負荷量を扱っているため、計算負荷はリバランス粒度が中間の場合よりも高くなるが、負荷の乖離を是正するための移譲領域の移譲を、より正確に行うことが可能となる。また、移譲の単位も最小化することができる。
リバランス部18eは、リバランスの実行を行うことを決定した後は、負荷の偏りを是正するリバランス設計を、上述した手順で実行し、振分ID表19bに反映し、全ノード15に送付する。
例えば、図8(a)に示すように、リバランス前の振分ID表19bは、仮想ノードID「Node1−1」に、担当する振分ID空間の担当領域として「0〜199(D=200)」のデータサイズが対応付けられ、「Node2−1」に「200〜399(D=200)」、「Node3−1」に「400〜599(D=200)」、「Node1−2」に「600〜999(D=400)」のデータサイズが対応付けられているとする。
ここで、例えば図8(a)に示す「Node1−2」の仮想ノードの担当領域「600〜999(D=400)」を全て、他の仮想ノードID「Node3_2」の仮想ノードへ移譲するものとする。この場合、図8(b)に示すように、仮想ノードID「Node3_2」の仮想ノードの担当領域が「600〜999(D=400)」のサイズとなる。
また、図8(a)に示す「Node1−2」の仮想ノードの担当領域「600〜999(D=400)」の半分を、他の仮想ノードID「Node3_2」の仮想ノードへ移譲するものとする。この場合、図8(c)に示すように、仮想ノードID「Node1_2」の仮想ノードの担当領域が「600〜799(D=200)」のサイズとなり、仮想ノードID「Node3_2」の仮想ノードの担当領域が「800〜999(D=200)」のサイズとなる。
(システムの動作)
次に、第1実施形態に係る分散システム10において、ノード15間の負荷の偏りを是正するリバランスを実行する際の動作(第1のリバランス動作)を、図9〜図13を参照して説明する。
まず、リバランスを実行する前提条件について、図9を参照して説明する。図9に示すように、ハッシュ空間を3つのノードA〜Cの□示す仮想ノードA1〜A6,B1〜B5,C1〜C5で分割し、各仮想ノードA1〜A6,B1〜B5,C1〜C5の担当領域を決めて管理している。但し、A〜CはノードIDであり、A1〜A6,B1〜B5,C1〜C5は仮想ノードIDであるとする。
例えば、仮想ノードB1が担当するハッシュ空間(担当領域)は、仮想ノードA6から時計回りに仮想ノードB1までの領域となり、この担当領域に存在するデータを担当仮想ノードB1が保持している。他の仮想ノードA1〜A6,B2〜B5,C1〜C5においても同様である。
また、各仮想ノードA1〜A6,B1〜B5,C1〜C5は、担当領域に負荷データを保持するが、本例では、○記号で示す負荷量が「1」の低負荷データ、◎記号で示す負荷量が「2」の中負荷データ、●記号で示す負荷量が「3」の高負荷データを、任意数保持するものとする。
例えば、仮想ノードB1は、高負荷データ●を3つ保持し、合計「9」の負荷データを保持している。仮想ノードA1であれば、高負荷データ●を2つ、中負荷データ◎を1つ保持し、合計「8」の負荷データを保持している。このように、他の仮想ノードA2〜A6,B2〜B5,C1〜C5においても、負荷データを保持している。
このように各仮想ノードA1〜A6,B1〜B5,C1〜C5が保持する負荷データの表を図10に示す。図10の負荷データ表は、最上段の行欄にノードA,B,Cを示し、最左列に上から順に仮想ノードIDの「1」〜「6」を示した。
但し、最上段行欄のノードAは、担当領域に保持する負荷量が(40)であり、偏差/標準偏差が「+1.39」で閾値「1.2」よりも大きく、高負荷であることを前提条件として示している。ノードBは、負荷量が(21)で、偏差/標準偏差が「−0.93」で閾値「1.2」よりも小さく、中負荷であることを前提条件として示している。ノードCは、負荷量が(25)であり、偏差/標準偏差が「−0.44」で閾値「1.2」よりも小さく、中負荷であることを前提条件として示している。
また、負荷データ表において、ノードAの「1」の欄には、仮想ノードA1の負荷データを示し、本例では、高負荷データ●の負荷量を示す「高(3)」が2つと、中負荷データ◎の負荷量を示す「中(2)」が1つ示してある。この様態は、他のノードA〜Cの仮想ノードA2〜A6,B1〜B5,C1〜C5の欄においても同様である。
また、図11は各ノードA〜Cが保持する負荷量の偏差を表す棒グラフである。この棒グラフに示す各ノードA〜Cの総負荷量は「86」、ノードA〜C当たりの平均負荷量は「28.6」、標準偏差は「8.17」、乖離閾値は「1.2」、仮想ノード数は「16」、仮想ノード当たりの平均負荷量は「5.375」、ノードAの偏差は「+11.4」、ノードBの偏差は「−7.6」、ノードCの偏差は「−3.6」である。
また、各ノードA〜Cの負荷量は、1つのノード(例えばA)の全ての仮想ノードの担当領域の負荷の和と見なすことができる。
このような前提条件において、各ノードA〜Cのリバランスを実行する際の動作を、図12及び図13に示すフローチャートを参照して説明する。
まず、図12に示すステップS1において、所定のノード(A〜Cの何れか)の分散システム負荷リバランス部18eは、所定の周期で各ノードA〜Cから収集したノード負荷計測データ19dに基づき作成されているテーブル(テーブルストア19g内のテーブル)を参照して、仮想ノード毎の負荷量を取得することで、各ノードA〜Cの負荷の平均値及び標準偏差、偏差並びに偏差/標準偏差の算出を行う。
次に、ステップS2において、リバランス部18eは、上記ステップS1での算出結果を集計データ19e(図6参照)として記憶部19に記録する。
ステップS3において、リバランス部18eは、上記ステップS2で記録したデータ19eに基づき、上述した3つの条件(1)〜(3)の何れか1つを満たすか否かを判定する。この結果、満たさなければ(No)、リバランスの処理を終了する。
一方、その判定の結果、例えば、条件(3)のみを満たした(Yes)とする。この場合、ステップS4において、リバランス部18eは、各ノードA〜Cの偏差/標準偏差と乖離閾値「1.2」とを比較することにより、図11に示すように、ノードAが高負荷ノード「+11.4」、ノードB、Cが中負荷ノード「−7.6」,「−3.6」であることを検知する。これによって、リバランス部18eは、高負荷ノードAの担当領域中の移譲領域を他ノードB,Cに移譲することで負荷の偏りを是正するリバランスの実行準備を行う。
この際、ステップS5において、リバランス部18eは、移譲元ノードの担当領域中の移譲領域のサイズ(=負荷量)を求める。高負荷ノードAで解消すべき負荷の偏りは、ノードAの偏差全てとした場合、「+11.4」である。この偏差を解消するために必要な仮想ノードの担当領域サイズは、偏差「+11.4」÷仮想ノード当たりの平均負荷量「5.375」で求めることができる。即ち、11.4÷5.375=2.12であり、仮想ノードの2.12個分の担当領域中の移譲領域を移譲する必要がある。
次に、ステップS6において、リバランス部18eは、移譲元ノードAの担当領域中の移譲領域を移譲するための、移譲先ノードB,Cの担当領域の許容可能なサイズを求める。移譲先ノードは最も負荷の低いノードBから移譲を受け入れることとし、この移譲先ノードBの許容可能な担当領域サイズは、偏差「−7.6」÷仮想ノード当たりの平均負荷量「5.375」より、仮想ノードの1.41個分となる。また、移譲先ノードBの許容可能な担当領域サイズは、偏差「−3.6」÷仮想ノード当たりの平均負荷量「5.375」より、仮想ノードの0.67個分となる。
次に、図13に示すステップS7において、リバランス部18eは、移譲元ノードAの移譲対象の担当領域、即ち担当領域中の移譲領域を移譲可能な、移譲先ノードB,Cが有るか否かを判定する。この判定は、移譲先ノードB,Cの担当領域の許容可能なサイズが、移譲元ノードAの担当領域中の移譲領域を移譲可能であるか否かを検知して行う。この結果、移譲可能な移譲先ノードB,Cが無ければ(No)、リバランスの処理を終了する。
一方、移譲可能な移譲先ノードB,Cが有れば(Yes)、ステップS8において、リバランス部18eは、移譲元ノードAの担当領域中の移譲領域を、移譲先ノードBへ移譲する。この移譲では、例えば、1.41個分の担当領域の空きを有する移譲先ノードBに、移譲元ノードAから移譲対象が2.12個分の担当領域が移譲されるので、2.12−1.41=0.71個分の仮想ノードが残ることになる。この場合は、仮想ノード単位での移譲である。
これを、図9に示すハッシュ空間においてデータ単位で移譲する場合に置き換えて説明する。例えば、移譲元ノードAにおける仮想ノードA1の「8」の負荷データが、移譲先ノードBにおける負荷量「2」の低負荷の仮想ノードB3へ移譲される。この場合、移譲元ノードAは、11.4−8=3.4の負荷量が残ることになる。
この後、図13に示すステップS9において、リバランス部18eは、移譲元ノードAの担当領域中の移譲領域の残りが有るか否かを判定する。この結果、残りが無ければ(No)、言い換えれば、移譲対象の担当領域が全て移譲完遂されていれば、リバランスの処理を終了する。
一方、上記ステップS9の判定で残り(上記の0.71個分)が有れば(Yes)、ステップS10において、リバランス部18eは、移譲元ノードAの残りの移譲領域が移譲可能な、移譲先ノードが有るか否かを判定する。この結果、移譲先ノードが無ければ(No)、リバランスの処理を終了する。
上記ステップS10の判定の結果、残りの移譲領域が移譲可能な移譲先ノードが有れば(Yes)、ステップS11において、リバランス部18eは、移譲元ノードAの残り(0.71個分)の移譲領域を、上記ステップS9で存在が認められた移譲先ノードCへ移譲する。この移譲により、移譲元ノードAには、0.71−0.67=0.04個分が残る。
この後、上記ステップS9に戻って、リバランス部18eは、移譲元ノードAの担当領域中の移譲領域の残りが有るか否かを判定する。この場合、上記0.04個分の残りが有るので(Yes)、ステップS10において、リバランス部18eは、移譲元ノードAの残りの移譲領域が移譲可能な、移譲先ノードが有るか否かを判定する。この場合、ノードB,C以外に、移譲可能なノードは無いので(No)、リバランスの処理を終了する。ここで、リバランス処理は終了となるが、移譲元ノードAには仮想ノードの0.04個分の負荷しか残っていないので、ノードA〜C間の負荷の乖離が低減されたことになる。
但し、以上の内容では、移譲元ノードAの移譲可能な負荷量を、平均負荷量からの差分(例えばノードAでは「+11.4」)としたが、任意に定めてもよい。例えば、移譲可能な負荷量を「+5」としてもよい。
上記の処理により、リバランス後の振分ID表19bが作成され、各ノードに配付されることで、リバランス後の振り分け処理が実行され、負荷の偏りが解消される。
<第2実施形態>
次に、第2実施形態を説明する。以下では、第1実施形態と異なる点を主に説明する。
第2実施形態の分散システムが、第1実施形態の分散システム10と異なる点は、分散システム負荷リバランス部18eが行うリバランス処理の違いにある。
第2実施形態の特徴は、リバランス部18eが次の処理を行うようにした。即ち、分散システム10の各ノード15のリソースの総量(負荷の総量)が、使用リソース量(使用負荷量)に対して十分であるにも関わらず、使用リソース量に偏りが生じているとする。この際に、リバランス部18eが、第1実施形態のように担当領域中の移譲領域を移譲する対象ノードや、該当ノード15の適切な移譲サイズを指定することなく、各ノード15が持つ仮想ノード数を、ノード15毎の現状の負荷の状況に応じて、ノード15毎に必要な負荷量とする仮想ノード数に再設定するリバランスを行うようにした。
この際、リバランス部18eは、各ノード15の仮想ノード数を、負荷の状況に合わせて下式(1)により算出し、この算出された各ノード15の仮想ノード数に基づきリバランスする。
このリバランスにおいては、算出された仮想ノード数に基づき、各仮想ノードの振分ID空間の先頭から仮想ノードIDと振分ID空間の再マッピングを行う。再マッピングは、担当領域の総延長(総サイズ)を算出した仮想ノード数で除し、1仮想ノード当たりの振分ID空間サイズを求め、振分ID空間の先頭から新たな振分ID空間サイズ毎に、仮想ノードID毎の仮想ノード数を再設定していく。
リバランス後の仮想ノード数=現状の仮想ノード数×(全ノードの負荷の平均値/該当ノードの負荷の実測値) …(式1)
但し、式(1)中の「該当ノードの負荷の実測値」は、現状の仮想ノードを有するノードの負荷の実測値である。また、式(1)はリバランス部18eの図示せぬ記憶部に保持されるものとする。
第2実施形態のリバランス処理について具体的に説明する。
リバランス部18eは、まず、ノード15が持つ仮想ノード数を再設定する。この再設定の処理を図14(a)及び(b)を参照して説明する。但し、図14(a)及び(b)に示す仮想ノードID「Node1−1」,「Node1−2」は、ノードID「Node1」のノード1(図示せず)に従属する仮想ノード1−1,1−2(図示せず)に対応するものとする。他の仮想ノードIDにおいても同様であり、例えば、仮想ノードID「Node5−1」,「Node5−2」,「Node5−3」は、ノードID「Node5」のノード5(図示せず)に従属する仮想ノード5−1,5−2,5−3(図示せず)に対応するものとする。
図14(a)に示す振分ID表19bには、仮想ノードID「Node1−1」に、担当する振分ID空間の担当領域として「0〜199(D=200)」のデータサイズが対応付けられ、「Node1−2」に、「200〜399(D=200)」のデータサイズが対応付けられている。他の仮想ノードIDにおいても図示する通りである。
更に、各ノード1〜5の仮想ノード数は、ノード1の仮想ノード数が2個、ノード2の仮想ノード数が1個、ノード3の仮想ノード数が1個、ノード4の仮想ノード数が2個、ノード5の仮想ノード数が2個である。
このような条件において、リバランス部18eは、ノード1〜5が持つ仮想ノード数を現状の負荷の状況に応じて、必要な負荷量に再設定する。以降、この再設定の処理について説明する。
まず、リバランス部18eは、各ノード1〜5の仮想ノード数を変更する。例えば、各ノード1〜5の現状の仮想ノード数は、図14(a)に示すように、ノード1が2個、ノード2が1個、ノード3が1個、ノード4が2個、ノード5が2個の合計8個である。これを、各ノード1〜5の負荷の現状に応じて、図14(b)に示すように、ノード1が1個、ノード2が2個、ノード3が2個、ノード4が2個、ノード5が3個の合計10個に変更する。
この仮想ノード数の変更を行う場合に上記式(1)を用いる。仮想ノード数の変更は、例えば図14(a)に示す各ノード1〜5の個数「2個、1個、1個、2個、2個」=8個を、図14(b)に示す各ノード1〜5の個数「1個、2個、2個、2個、3個」=10個に変更することである。
図14(a)の現状では、全ノード1〜5のハッシュ空間サイズ(担当領域のサイズ)は「0〜1599」の1600であり、仮想ノード数は8個なので、仮想ノード当たりの担当領域のサイズDは、1600÷8=200である。このD=200の担当領域のサイズの内、該当ノード1の負荷の実測値は、例えば「80」や「150」のようになる。なお、この実測値は、前述したように、テーブルストア19gに格納されたテーブルを参照することで迅速に求めることができる。このような全ノード1〜5の実測値から、全ノード1〜5の負荷の平均値が求められるので、その平均値及び実測値を上記式(1)に代入する。
例えば、仮想ノードID=「Node1−1」の振分ID空間の担当領域(サイズD=200)では負荷の実測値が「140」、「Node1−2」では負荷の実測値が「160」であるとすると、ノード1の負荷の実測値は「300」である。この際、全ノード1〜5の負荷の平均値が「150」とする。この場合、ノード1のリバランス後の仮想ノード数は、2×(150/300)=1となる。同様に、他のノード2〜5においてもリバランス後の仮想ノード数を求め、各ノード1〜5の仮想ノード数を、その求められた仮想ノード数に変更する。但し、式(1)に当て嵌めた計算結果が、1.6等の小数点を伴う場合、切り上げ、切り捨て、四捨五入とすることを予め決めておく。
次に、リバランス部18eは、仮想ノード当たりのハッシュ空間サイズを変更する。図14(a)に示す現状では、上述したように、仮想ノード当たりのハッシュ空間サイズDは、1600÷8=200である。
これを、上述した変更後の仮想ノード数=10個を用いると、仮想ノード当たりのハッシュ空間サイズは、1600÷10=160となる。このハッシュ空間サイズを用いて、図14(b)に示すように、1個当たりの仮想ノードのハッシュ空間サイズDを「160」とする。
次に、リバランス部18eは、その変更後のハッシュ空間サイズD=「160」の仮想ノードを、前述で変更した後の各ノード1〜5の仮想ノード数だけ割り振って行く。即ち、ノード1では変更後の仮想ノードが1個なので、図14(b)に示すように、ノード1において、変更後のハッシュ空間サイズD=「160」の仮想ノード{仮想ノードID「Node1−1」}が1個割り振られる。
同様に、ノード2では変更後の仮想ノードが2個なので、サイズD=「160」の仮想ノード{仮想ノードID「Node2−1,Node2−2」}が2個割り振られる。以降、同様に図示するように、ノード3〜5まで変更後の仮想ノード2個〜3個が割り振られる。
(実施の形態のまとめ、効果)
本実施形態では、複数のクライアントマシンからの情報がネットワークを介して振り分けられる複数のノードを有し、各ノードに複数の仮想ノードが従属している分散システムにおいて用いられるリバランス装置であって、仮想ノード毎の負荷量を保持する負荷量テーブルを有する記憶手段と、前記負荷量テーブルから取得された仮想ノード毎の負荷量に基づいて、前記複数のノード間の負荷量の偏りを抑制するリバランスを行うリバランス手段とを備えるリバランス装置が提供される。
前記負荷量テーブルにおける仮想ノード毎の負荷量は、例えば、仮想ノードが担当するコンシステントハッシュにおけるID空間上の領域の負荷量として保持されている。
前記記憶手段は、ノード毎に、仮想ノードの識別子と前記領域の識別子とを対応付けて保持する第1テーブルと、ノード毎に、カウンタ値と仮想ノードの識別子とを対応付けて保持する第2テーブルとを更に有することとしてもよい。
要求元からあるノードの指定を受けて、前記第2テーブルから、当該ノードに従属する各仮想ノードの識別子を取得し、前記第1テーブルから各仮想ノードの領域の識別子を取得し、前記負荷量テーブルから各領域の負荷量を取得し、取得した各負荷量を前記要求元に返す情報アクセス手段を更に備えてもよい。
以上、説明したように、本実施形態では、ID空間情報を物理ノード毎の仮想ノードIDテーブル、スロット負荷量リスト、物理ノード毎のインデックステーブル、物理ノード毎のカウンタに分割することとした。これにより、再計算を抑え、かつ、データへのアクセスをO(1)で実現でき、処理を高速化することができる。
本発明は、上記の実施の形態に限定されることなく、特許請求の範囲内において、種々変更・応用が可能である。