(57)【要約】【課題】従来システムをスケールアウト型の記憶システムに単純に適用すると、性能を十分に発揮できないことができないことがある。【解決手段】複数台のストレージノードにおいて、同じプログラムクラスタのアクティブの制御プログラムとパッシブの制御プログラムとは、異なるストレージノードに配置されるとともに、いずれのストレージノードも、複数のアクティブまたはパッシブの制御プログラムが配置されることが可能である。複数のパッシブの制御プログラムのうちのいずれかのパッシブの制御プログラムがアクティブに変更になった場合に、当該制御プログラムと同じストレージノードで稼働している他のパッシブの制御プログラムの稼働状況の変更が生じる。【選択図】図１
2019174875.tif 000002
【特許請求の範囲】
【請求項１】
それぞれが１個以上のプロセッサを有する複数のストレージノードと、
データを格納する１個以上の記憶デバイスと、を備え、
前記複数台のストレージノードは、前記１個以上のプロセッサのうちの少なくとも１個のプロセッサ上でそれぞれ稼働する複数個の制御プログラムで構成された２個以上のプログラムクラスタを有し、
いずれの制御プログラムも、当該制御プログラムに関連付けられた記憶領域に対してＩ／Ｏを行うためのプログラムであり、
前記２個以上のプログラムクラスタの各々は、
アクティブの制御プログラムと、
当該アクティブの制御プログラムに代わってアクティブとなるパッシブの制御プログラムと、
を有し、
前記制御プログラムの前記プロセッサの計算リソース使用は、アクティブのときがパッシブときよりも大きく、
同じプログラムクラスタの前記アクティブの制御プログラムと前記パッシブの制御プログラムとは、異なるストレージノードに配置されるとともに、前記複数台のストレージノードのいずれも、複数のアクティブまたはパッシブの制御プログラムが配置されることが可能であり、
複数の前記パッシブの制御プログラムのうちのいずれかの前記パッシブの制御プログラムがアクティブに変更になった場合に、当該制御プログラムと同じストレージノードで稼働している他のパッシブの制御プログラムの稼働状況を変更する
記憶システム。
【請求項２】
前記稼働状況の変更として、他のパッシブの制御プログラムを、停止させる、または、他のストレージノードに移動させて稼働させて、前記他のパッシブの制御プログラムが使用する計算リソースを減少させる
請求項１記載の記憶システム。
【請求項３】
前記複数のストレージノードでの前記制御プログラムへの計算リソースの割り当てを管理するクラスタ制御部を有しており、
前記クラスタ制御部が、前記他のパッシブの制御プログラムを、停止させるか移動させるか、または／及び、移動させる場合の移動先のストレージノードを、決定する
請求項２記載の記憶システム。
【請求項４】
前記移動先のストレージノードを、移動先ストレージノードの計算リソースの使用状況に基づいて、決定する
請求項３記載の記憶システム。
【請求項５】
前記移動先のストレージノードを、前記パッシブの制御プログラム以外が使用している移動先ストレージノードの計算リソースの使用状況に基づいて、決定する
請求項４記載の記憶システム。
【請求項６】
複数のストレージノードで構成される単一障害点共有範囲を複数有しており、
前記移動されるパッシブの制御プログラムは、対応するアクティブの制御プログラムとは別の単一障害点共有範囲に属するように、移動先ストレージノードを選択される
請求項３記載の記憶システム。
【請求項７】
複数のストレージノードは、各々が前記記憶デバイスを有しており、
前記アクティブの制御プログラムは、
自ストレージノード及び他ストレージノードの記憶デバイスの記憶領域について、Ｉ／Ｏが可能で、複数のストレージノードの記憶デバイスにデータセットを格納しており、
データセットを格納した複数のストレージノードのうちの１のストレージノードに格納したデータセットを、他のストレージノードに格納したデータセットから復元可能である
請求項１記載の記憶システム。
【請求項８】
前記アクティブの制御プログラムは、ミラーリングにより、複数のストレージノードに復元可能にデータセットを格納している
請求項７記載の記憶システム。
【請求項９】
前記パッシブの制御プログラムは、対応するアクティブの制御プログラムの障害または停止時にアクティブに変更になり、前記対応するアクティブの制御プログラムが扱うデータセットの論理構成を用いて、そのデータセットのＩ／Ｏを行う
請求項１記載の記憶システム。
【請求項１０】
前記対応するアクティブの制御プログラムと同じストレージノードに格納したデータセットを使用できない場合、前記アクティブに変更になった制御プログラムは、前記使用ができないデータセットにかかるストレージノードとは異なるストレージノードに格納されたデータセットを用い、そのデータセットまたはそのデータセットから復元したデータセットに対してＩ／Ｏを行う
請求項９記載の記憶システム。
【請求項１１】
前記制御プログラムは、
Ｉ／Ｏが不能になったデータセットを、他のストレージノードに格納しているデータセットから復元し、
前記アクティブに変更された制御プログラムは、
前記復元したデータセットを自ストレージノードに格納し、
前記復元前のデータセットについてＩ／Ｏ要求を受けた場合に、前記異なるストレージノードに格納されたデータセットを用いてＩ／Ｏを行い、
前記復元が完了したデータセットについてＩ／Ｏ要求を受けて場合に、前記自ストレージノードに格納されたデータセットを用いてＩ／Ｏを行う
請求項１０記載の記憶システム。
【請求項１２】
いずれかの制御プログラムは、前記障害または停止になったアクティブの制御プログラムと同じストレージノードに格納されたデータセットを、他のストレージノードに格納したデータセットを用いて復元し、前記アクティブに変更された制御プログラムと同じストレージノードに格納する
請求項１１記載の記憶システム。
【請求項１３】
それぞれが１個以上のプロセッサを有する複数のストレージノードと、データを格納する１個以上の記憶デバイスと、を備えた記憶システムの記憶制御方法であって、
前記複数台のストレージノードが有する複数個のプロセッサ上で稼働する２個以上のプログラムクラスタにおける複数のパッシブの制御プログラムのうちのいずれかのパッシブの制御プログラムがアクティブに変更になったことを検出し、
アクティブに変更になった当該制御プログラムと同じストレージノードで稼働している他のパッシブの制御プログラムの稼働状況の変更を行い、
いずれの制御プログラムも、当該制御プログラムに関連付けられた記憶領域に対してＩ／Ｏを行うためのプログラムであり、
前記２個以上のプログラムクラスタの各々は、
アクティブの制御プログラムと、
当該アクティブの制御プログラムに代わってアクティブとなるパッシブの制御プログラムと、
を有し、
前記制御プログラムの前記プロセッサの計算リソース使用は、アクティブのときがパッシブときよりも大きく、
同じプログラムクラスタの前記アクティブの制御プログラムと前記パッシブの制御プログラムとは、異なるストレージノードに配置されるとともに、前記複数台のストレージノードのいずれも、複数のアクティブまたはパッシブの制御プログラムが配置されることが可能である
記憶制御方法。
【請求項１４】
それぞれが１個以上のプロセッサを有する複数のストレージノードと、データを格納する１個以上の記憶デバイスと、を備えた記憶システムのうちの、一のストレージノードに、
前記複数台のストレージノードが有する複数個のプロセッサ上で稼働する２個以上のプログラムクラスタにおける複数のパッシブの制御プログラムのうちのいずれかのパッシブの制御プログラムがアクティブに変更になったことを検出し、
アクティブに変更になった当該制御プログラムと同じストレージノードで稼働している他のパッシブの制御プログラムの稼働状況の変更を行う、
ことを実行させ、
いずれの制御プログラムも、当該制御プログラムに関連付けられた記憶領域に対してＩ／Ｏを行うためのプログラムであり、
前記２個以上のプログラムクラスタの各々は、
アクティブの制御プログラムと、
当該アクティブの制御プログラムに代わってアクティブとなるパッシブの制御プログラムと、
を有し、
前記制御プログラムの前記プロセッサの計算リソース使用は、アクティブのときがパッシブときよりも大きく、
同じプログラムクラスタの前記アクティブの制御プログラムと前記パッシブの制御プログラムとは、異なるストレージノードに配置されるとともに、前記複数台のストレージノードのいずれも、複数のアクティブまたはパッシブの制御プログラムが配置されることが可能である
コンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、概して、複数台のストレージノードで構成された記憶システムの記憶制御に関する。
【背景技術】
【０００２】
複数台の計算ノードで構成されたスケールアウト型の分散計算システムが知られている。特許文献１には、現用系の仮想マシンと予備系の仮想マシンをそれぞれ別個の物理サーバに上に集約して配置することが開示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１４−０７５０２７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
記憶システムについても、スケールアウト型の記憶システム、すなわち、複数台のストレージノードで構成された記憶システムが知られている。この種の記憶システムでは、関連付けられた論理記憶領域に対してＩ／Ｏ（Input/Output）を行うためのプログラムである制御プログラムが実行される。この種の記憶システムは、高可用且つ高性能であることが望ましい。
【０００５】
特許文献１に開示のシステム（以下、従来システム）は、高可用且つ高性能であると期待される。具体的には、現用系の仮想マシンと予備系の仮想マシンがあることから、現用系の仮想マシンから予備系の仮想マシンへのフェイルオーバーが可能であるため、高可用が期待される。また、現用系の仮想マシンと予備系の仮想マシンがそれぞれ別個の物理サーバに配置されていることから、現用系の仮想マシンが使用可能なリソース量が予備系の仮想マシンに使用されることがないため、高性能も期待される。
【０００６】
そこで、従来システムでのプログラム配置を、スケールアウト型の記憶システムでのプログラム配置に適用することが検討される。
【０００７】
しかし、従来システムでは、複数の仮想マシンに対してフェイルオーバーが起きることを考慮していない。スケールアウト型の記憶システムを構成する仮想マシンの数は多数であり、複数の仮想マシンにフェイルオーバーが発生し、複数の予備系の仮想マシンがアクティブに変更される場合がありうる。
【０００８】
このような理由により（又は、それに代えて又は加えて他の理由により）、従来システムをスケールアウト型の記憶システムに単純に適用すると、性能を十分に発揮できないことができないことがある。
【課題を解決するための手段】
【０００９】
記憶システムが、それぞれが１個以上のプロセッサを有する複数のストレージノードと、データを格納する１個以上の記憶デバイスと、を備える。複数台のストレージノードは、１個以上のプロセッサのうちの少なくとも１個のプロセッサ上でそれぞれ稼働する複数個の制御プログラムで構成された２個以上のプログラムクラスタを有する。いずれの制御プログラムも、当該制御プログラムに関連付けられた記憶領域に対してＩ／Ｏを行うためのプログラムである。２個以上のプログラムクラスタの各々は、アクティブの制御プログラムと、当該アクティブの制御プログラムに代わってアクティブとなるパッシブの制御プログラムとを有する。制御プログラムのプロセッサの計算リソース使用は、アクティブのときがパッシブときよりも大きい。同じプログラムクラスタのアクティブの制御プログラムとパッシブの制御プログラムとは、異なるストレージノードに配置されるとともに、複数台のストレージノードのいずれも、複数のアクティブまたはパッシブの制御プログラムが配置されることが可能である。複数のパッシブの制御プログラムのうちのいずれかのパッシブの制御プログラムがアクティブに変更になった場合に、当該制御プログラムと同じストレージノードで稼働している他のパッシブの制御プログラムの稼働状況の変更が生じる。
【発明の効果】
【００１０】
本発明によれば、スケールアウト型の記憶システムにおいて、アクティブの制御プログラムとパッシブの制御プログラムを適切に配置し、リソースを有効活用することができる。
【図面の簡単な説明】
【００１１】
【図１】実施例１の概要を模式的に示す。
【図２】記憶システムを含むシステム全体の構成を示す。
【図３】ノードの物理的な構成を示す。
【図４】アクティブ制御プログラムが実行されるノード内のメモリにおける代表的なプログラム及びテーブルを示す。
【図５】パッシブ制御プログラムが実行されるノード内のメモリにおける代表的なプログラム及びテーブルを示す。
【図６】制御プログラム配置の一例を示す。
【図７】論理チャンクと物理チャンクの関係の一例を示す。
【図８】制御プログラム管理テーブルの構成を示す。
【図９】ノード管理テーブルの構成を示す。
【図１０】リソース割当管理テーブルの構成を示す。
【図１１】構成テーブルの一部である物理チャンク管理テーブルの構成を示す。
【図１２】構成テーブルの残りである論理チャンク管理テーブルの構成を示す。
【図１３】実施例１に係るクラスタ制御部が行う処理の流れを示す。
【図１４】実施例２の概要を模式的に示す。
【図１５】実施例２に係るクラスタ制御部が行う処理の流れを示す。
【図１６】実施例２に係る再配置制御処理の流れを示す。
【図１７】制御プログラム移動処理の流れを示す。
【図１８】実施例３に係る記憶システムの構成を示す。
【図１９】実施例３に係る制御プログラム配置の第１の例を示す。
【図２０】実施例３に係る制御プログラム配置の第２の例を示す。
【図２１】実施例３に係るノード管理テーブルの構成を示す。
【図２２】実施例３に係る再配置制御処理の流れを示す。
【図２３】実施例４の概要を模式的に示す。
【図２４】実施例４に係るクラスタ制御部が行う処理の流れを示す。
【図２５】ノード間通信を必要とし冗長度が低下した状態の一例を模式的に示す。
【図２６】ノード間通信を必要とせず冗長度が回復した状態の一例を模式的に示す。
【発明を実施するための形態】
【００１２】
以下の説明では、「インターフェース部」は、１個以上のインターフェースでよい。当該１個以上のインターフェースは、１個以上の同種の通信インターフェースデバイス（例えば１個以上のＮＩＣ（Network Interface Card））であってもよいし２個以上の異種の通信インターフェースデバイス（例えばＮＩＣとＨＢＡ（Host Bus Adapter））であってもよい。
【００１３】
また、以下の説明では、「メモリ部」は、１個以上のメモリであり、典型的には主記憶デバイスでよい。メモリ部における少なくとも１つのメモリは、揮発性メモリであってもよいし不揮発性メモリであってもよい。
【００１４】
また、以下の説明では、「ＰＤＥＶ部」は、１個以上のＰＤＥＶであり、典型的には補助記憶デバイスでよい。「ＰＤＥＶ」は、物理的な記憶デバイス（Physical storage DEVice）を意味し、典型的には、不揮発性の記憶デバイス、例えばＨＤＤ（Hard Disk Drive）又はＳＳＤ（Solid State Drive）である。つまり、ＰＤＥＶ部は、記憶デバイス部の一例である。
【００１５】
また、以下の説明では、「記憶部」は、メモリ部及びＰＤＥＶ部のうちの少なくとも１つ（典型的には少なくともメモリ部）である。
【００１６】
また、以下の説明では、「プロセッサ部」は、１個以上のプロセッサである。少なくとも１つのプロセッサは、典型的には、ＣＰＵ（Central Processing Unit）のようなマイクロプロセッサであるが、ＧＰＵ（Graphics Processing Unit）のような他種のプロセッサでもよい。少なくとも１つのプロセッサは、シングルコアでもよいしマルチコアでもよい。少なくとも１つのプロセッサは、処理の一部又は全部を行うハードウェア回路（例えばＦＰＧＡ（Field-Programmable Gate Array）又はＡＳＩＣ（Application Specific Integrated Circuit））といった広義のプロセッサでもよい。
【００１７】
また、以下の説明では、「ｘｘｘテーブル」といった表現にて、入力に対して出力が得られる情報を説明することがあるが、この種の情報は、どのような構造のデータでもよいし、入力に対する出力を発生するニューラルネットワークのような学習モデルでもよい。従って、「ｘｘｘテーブル」を「ｘｘｘ情報」と言うことができる。また、以下の説明において、各テーブルの構成は一例であり、１つのテーブルは、２個以上のテーブルに分割されてもよいし、２個以上のテーブルの全部又は一部が１つのテーブルであってもよい。
【００１８】
また、以下の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサ部によって実行されることで、定められた処理を、適宜に記憶部及び／又はインターフェース部等を用いながら行うため、処理の主語が、プロセッサ部（或いは、そのプロセッサ部を有するコントローラのようなデバイス）とされてもよい。プログラムは、プログラムソースから計算機のような装置にインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバ又は計算機が読み取り可能な（例えば非一時的な）記録媒体であってもよい。また、以下の説明において、２個以上のプログラムが１つのプログラムとして実現されてもよいし、１つのプログラムが２個以上のプログラムとして実現されてもよい。
【００１９】
また、以下の説明では、「ｋｋｋ部」（インターフェース部、記憶部及びプロセッサ部を除く）の表現にて機能を説明することがあるが、機能は、１個以上のコンピュータプログラムがプロセッサ部によって実行されることで実現されてもよいし、１個以上のハードウェア回路によって実現されてもよい。各機能の説明は一例であり、複数の機能が１つの機能にまとめられたり、１つの機能が複数の機能に分割されたりしてもよい。
【００２０】
また、以下の説明では、「記憶システム」は、複数台のストレージノードを含んだシステムである。当該記憶システムは、典型的には、スケールアウト型の記憶システム、或いは、分散記憶システムと呼ばれてよい。「ストレージノード」は、記憶システムのメンバとしての装置であり、汎用計算機でもよいし、専用計算機（例えば、複数個のＰＤＥＶを有するいわゆるディスクアレイ装置のようなストレージ装置）でもよい。記憶システムは、冗長構成グループを有してよい。冗長構成は、Erasure Coding、ＲＡＩＮ（Redundant Array of Independent Nodes）及びノード間ミラーリングのように複数台のストレージノードでの構成でもよいし、ＰＤＥＶ部の少なくとも一部としての１以上のＲＡＩＤ（Redundant Array of Independent (or Inexpensive) Disks）グループのように単一の計算機（例えばストレージノード）での構成でもよい。
【００２１】
また、以下の説明では、「データセット」とは、アプリケーションプログラムのようなプログラムから見た１つの論理的な電子データの塊であり、例えば、レコード、ファイル、キーバリューペア及びタプルのうちのいずれでもよい。また、ユーザデータのみならず、冗長コードを含んでいる場合もある。
【００２２】
また、「プログラムクラスタ」は、１個以上のアクティブの制御プログラムと、１個以上のパッシブの制御プログラムを含む。各プログラムクラスタにおいて、アクティブの制御プログラムとパッシブの制御プログラムは、１：１、１：多、多：１及び多：多のいずれでもよい。以下、説明を簡潔にするために、アクティブの制御プログラムとパッシブの制御プログラムは１：１であるとし、それに伴い、プログラムクラスタを「プログラムペア」と呼ぶことにする。
【００２３】
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号のうちの共通部分を使用し、同種の要素を区別して説明する場合に、参照符号を使用することがある。例えば、ストレージノードを特に区別しないで説明する場合には、「ストレージノード１０１」と記載し、個々のノードを区別して説明する場合には、「ストレージノード１０１ａ」、「ストレージノード１０１ｂ」のように記載することがある。
【００２４】
以下、幾つかの実施例を説明する。
【実施例１】
【００２５】
図１は、実施例１の概要を模式的に示す。
【００２６】
記憶システム１００が、それぞれが１個以上のＰＤＥＶ１２（記憶デバイスの一例）を有する複数台のストレージノード（以下、ノード）１０１を備える。図１には、ノード１０１ａ〜１０１ｄが例示されている。以下の説明では、ノードα（αはａ、ｂ、…といった小文字英語アルファベット）内の要素の参照符号がαを含むことがある。要素の参照符号内のαを見ることで、当該要素がいずれのノードの要素であるかを区別することができる。
【００２７】
複数台のノード１０１は、複数個の制御プログラム２０で構成された２個以上のプログラムペア（プログラムクラスタの一例）を有する。いずれの制御プログラム２０も、当該制御プログラム２０に関連付けられた論理チャンク３３（論理記憶領域の一例）に対してＩ／Ｏ（Input/Output）を行うためのプログラムである。以下、制御プログラム２０に関し、状態がアクティブである制御プログラム２０を、「アクティブ制御プログラム２０Ａ」と言い、状態がパッシブである制御プログラム２０を、「パッシブ制御プログラム２０Ｐ」と言うことがある。
【００２８】
各プログラムペアは、アクティブ制御プログラム２０Ａとパッシブ制御プログラム２０Ｐ（当該アクティブ制御プログラム２０Ａが停止した場合に当該アクティブ制御プログラム２０Ａに代わってアクティブとなる制御プログラム２０Ｐ）とのペアである。以下、プログラムペアβ（βは自然数）に属するアクティブ制御プログラム２０Ａを、「アクティブ制御プログラム２０Ａ−β」と言い、プログラムペアｎに属するパッシブ制御プログラム２０Ｐを、「パッシブ制御プログラム２０Ｐ−β」と言う。
【００２９】
各ノード１０１は、当該ノード１０１における１個以上の論理チャンク３３を提供する冗長化部２２を有する。各ＰＤＥＶ１２は、複数個の物理チャンク４３（物理記憶領域の一例）を有する。各ノード１０１において、各論理チャンク３３には、異なる２台以上のノード１０１における２個以上の物理チャンク４３が関連付けられている。同一のプログラムペアについて、アクティブ制御プログラム２０Ａに関連付けられる論理チャンク３３と、パッシブ制御プログラム２０Ｐに関連付けられる論理チャンク３３は、それぞれ、同一の２個以上の物理チャンク４３に関連付けられている。図１では、プログラムペアβにおける制御プログラム２０に関連付けられた論理チャンクの参照符号と、当該論理チャンクに関連付けられている物理チャンクの参照符号は、それぞれ、βを含む。これにより、いずれの論理チャンク３３がいずれのプログラムペアにおける制御プログラム２０に関連付けられていて、いずれの物理チャンク４３がいずれの論理チャンク３３に関連付けられているかがわかる。
【００３０】
複数個の制御プログラム２０の配置は、分離配置である。分離配置は、下記を満たす配置である。
・２個以上のプログラムペアにおける全てのアクティブ制御プログラム２０Ａが、一部のストレージノード１０１ａ〜１０１ｃに配置。具体的には、例えば、負荷分散のために、全てのアクティブ制御プログラム２０Ａは、ストレージノード１０１ａ〜１０１ｃに均等に分散している。
・２個以上のプログラムペアにおける全てのパッシブ制御プログラム２０Ｐが、残りのストレージノード１０１ｄ（残りの全部又は一部のストレージノードの一例）に配置（集約）。
【００３１】
図１によれば、構成は例えば次の通りである。全てのプログラムペア１〜３における全てのパッシブ制御プログラム２０Ｐ−１〜２０Ｐ−３が、ストレージノード１０１ｄに集約される。パッシブ制御プログラム２０Ｐ−１とプログラムペア１を構成するアクティブ制御プログラム２０Ａ−１は、ノード１０１ａに配置される。冗長化部２２ａにより提供される論理チャンク３３ａ−１が、アクティブ制御プログラム２０Ａ−１に関連付けられる。アクティブ制御プログラム２０Ａ−１とプログラムペア１を構成するパッシブ制御プログラム２０Ｐ−１に、冗長化部２２ｄにより提供される論理チャンク３３ｄ−１が関連付けられている。論理チャンク３３ａ−１及び３３ｄ−１のいずれにも、物理チャンク４３ａ−１及び４３ｂ−１が関連付けられている。このため、論理チャンク３３ａ−１及び３３ｄ−１のどちらがライト対象のデータセットのライト先となっても、当該データセットが二重化される、すなわち、当該データセットが物理チャンク４３ａ−１及び４３ｂ−１の両方に書き込まれることになる。
【００３２】
少なくとも１つのノード１０１、例えば、各ノード１０１が、プログラムペアを管理するクラスタ制御部１５を有する。本実施例では、記憶システム１００は、マスタースレーブ構成が採用されていて、図１の例では、ノード１０１ｂが、マスターであり、残りのノード１０１ａ及び１０１ｃ〜１０１ｄが、スレーブであるとする。マスターノード１０１ｂにおけるクラスタ制御部１５ｂが他のクラスタ制御部１５（図示せず）を代表して動作するものとする。
【００３３】
また、いずれのアクティブ制御プログラム２０Ａも、当該アクティブ制御プログラム２０Ａの実行環境であるノード１０１のリソース量を最大限使用可能であるとする。一方、ノード１０１ｄでは、いずれのパッシブ制御プログラム２０Ｐにも、フェイルオーバー処理にかかる時間短縮のために、パッシブ状態（スタンバイ状態）維持に必要な最低限のリソース量が割り当てられているとする。
【００３４】
このような構成において、ノード１０１ａで障害が生じたとする（Ｓ１０１）。ノード１０１ａにはアクティブ制御プログラム２０Ａ−１が存在するため、アクティブ制御プログラム２０Ａ−１からパッシブ制御プログラム２０Ｐ−１へのフェイルオーバー処理が行われる（Ｓ１０２）。当該フェイルオーバー処理では、クラスタ制御部１５ｂは、フェイルオーバー先となるパッシブ制御プログラム２０Ｐ−１以外の少なくとも一部のパッシブ制御プログラム２０Ｐ、例えば全てのパッシブ制御プログラム２０Ｐ−２及び２０Ｐ−２を停止する（Ｓ１０２−１）。そして、クラスタ制御部１５ｂは、パッシブ制御プログラム２０Ｐ−２及び２０Ｐ−３の停止により解放された計算リソースを特定し、特定した計算リソースの少なくとも一部をパッシブ制御プログラム２０Ｐ−１に割り当てることをノード１０１ｄに指示する。その指示に応答して、パッシブ制御プログラム２０Ｐ−２及び２０Ｐ−３から解放された計算リソースがパッシブ制御プログラム２０Ｐ−１に割り当てられ、結果として、パッシブ制御プログラム２０Ｐ−１が使用可能なリソース量が増える（Ｓ１０２−２）。
【００３５】
本実施例によれば、各ノード１０１において、提供される各論理チャンク３３に、異なる２台以上のノード１０１における２個以上の物理チャンク４３が関連付けられていて、同一のプログラムペアについて、アクティブ制御プログラム２０Ａに関連付けられる論理チャンク３３と、パッシブ制御プログラム２０Ｐに関連付けられる論理チャンク３３は、それぞれ、同一の２個以上の物理チャンク４３に関連付けられている。このため、スケールアウト型の記憶システム１００において、アクティブ制御プログラム２０Ａとパッシブ制御プログラム２０Ｐをそれぞれ別個のノード１０１に配置することができる。例えば、フェイルオーバー元のノード１０１ａとフェイルオーバー先のノード１０１ｄのリソース量が同じであって、ノード１０１ａにおいてアクティブ制御プログラム２０Ａ−１が１００％のリソース量を使用していたとしても、ノード１０１ｄにはアクティブ制御プログラム２０Ａが存在しないため、代わってアクティブとなる制御プログラム２０Ｐ−１に、アクティブ制御プログラム２０Ａ−１が使用していたリソース量と同等のリソース量を確保することができる。つまり、ノード１０１間のローカルのＰＤＥＶ１２にデータが分散するスケールアウト型の記憶システム１００について高可用且つ高性能を実現することができる。
【００３６】
なお、パッシブ制御プログラム２０Ｐ−２及び２０Ｐ−３の停止は、パッシブ制御プログラム２０Ｐ−２及び２０Ｐ−３の稼働状況の変更の一例である。パッシブ制御プログラム２０Ｐ−２及び２０Ｐ−３の稼働状況の変更の他の例として、例えば、実施例２で説明するように、パッシブ制御プログラム２０Ｐ−２及び２０Ｐ−３の他ノード１０１への移動がある。
【００３７】
以下、本実施例を詳細に説明する。
【００３８】
図２は、記憶システム１００を含むシステム全体の構成を示す。
【００３９】
ネットワーク２０３に、ホストシステムの一例である１台以上のホスト計算機２０１と、記憶システム１００を構成する複数台のノード１０１と、管理システム２０２とが接続されている。ネットワーク２０３は、ファイバチャネル（Fibre Channel）、イーサネット（登録商標）、InfiniBand又はＬＡＮ（Local Area Network）などから構成される１以上のネットワークでよい。
【００４０】
ホスト計算機２０１は、記憶システム１００に対してリード要求又はライト要求（これらをまとめてＩ／Ｏ要求と呼ぶことができる）を送信する計算機（例えば汎用計算機）である。少なくとも１つの物理計算機で実行される仮想マシン（ＶＭ）がホスト計算機２０１として機能してもよい。
【００４１】
管理システム２０２は、システム管理者が記憶システム１００（又は、記憶システム１００とホストシステムとを含んだ計算機システム）を管理する計算機システムである。管理システム２０２は、例えば、記憶システム１００の性能を監視したり、種々の指示を送信したりできる。少なくとも１つの物理計算機で実行される仮想マシンが管理システム２０２として機能してもよい。
【００４２】
記憶システム１００は、それぞれ１個以上のＰＤＥＶ１２を有する複数台のノード１０１で構成されるが、当該記憶システム１００は、各汎用計算機（ノード１０１）がストレージ機能を有するソフトウェアを実行することにより構築されたＳＤＳ１８０の基である。ＳＤＳ１８０は、個々のノード１０１に構築されてもよいが、本実施例では、複数台のノード１０１に跨っている。
【００４３】
また、記憶システム１００は、ＳＤＳ１８０に加えて、ソフトウェアディファインドのホストシステムの基になってもよいし、或いは、ホスト計算機２０１としての１台以上の仮想マシンを実行してもよい。つまり、同一のシステム基盤上に、仮想的に、記憶システムとホストシステムとが存在してもよい。
【００４４】
図３は、ノード１０１の物理的な構成を示す。
【００４５】
ノード１０１は、汎用計算機でよい。ノード１０１は、ＮＩＣ（Network Interface Card）３０４、ＰＤＥＶ１２、メモリ３０２及びそれらに接続されたＣＰＵ３０１を有する。ＮＩＣ３０４、ＰＤＥＶ１２、メモリ３０２及びＣＰＵ３０１のいずれも、複数存在してよい。ＮＩＣ３０４は、インターフェース部の一例である。ＰＤＥＶ１２及びメモリ３０２は、記憶部の一例である。ＣＰＵ３０１は、プロセッサ部の一例である。
【００４６】
ＮＩＣ３０４は、ネットワーク２０３に接続され、ノード１０１の外部の装置と通信するためのインターフェースデバイスである。ＮＩＣ３０４は、ファイバチャネル（Fibre Channel）カードやイーサネット（登録商標）カード、InfiniBandカード、無線ＬＡＮカード、PCIeホストアダプタのいずれでもよい。
【００４７】
ＰＤＥＶ１２は、上述したように、ＨＤＤ及びＳＳＤのいずれでもよく、また、ＳＣＭ（Storage Class Memory）でもよい。ＰＤＥＶ１２は、ＮＶＭｅ（Non-Volatile Memory Express）、ＳＡＳ（Serial Attached SCSI（Small Computer System Interface））及びＳＡＴＡ（Serial ATA（Advanced Technology Attachment））のいずれのインターフェースで接続されてもよい。また、複数個のＰＤＥＶ１２として、異なる種類のＰＤＥＶが混在してもよい。
【００４８】
メモリ３０２は、ＳＲＡＭ（Static RAM(Random Access Memory)）やＤＲＡＭ（Dynamic RAM）などの揮発性の半導体メモリから構成されてよい。メモリ３０２は、各種プログラムや必要なデータを一時的に保持するために利用される。
【００４９】
ＣＰＵ３０１は、メモリ３０２内のプログラムを実行することでノード１０１全体の動作制御を司る。
【００５０】
ノード１０１において、ＮＩＣ３０４、メモリ３０２及びＣＰＵ３０１が、記憶デバイス以外の計算リソースの一例である。記憶デバイス以外の計算リソースとして、ＮＩＣ３０４、メモリ３０２及びＣＰＵ３０１があるが、リソース量は、例えば、通信帯域、メモリ量及びＣＰＵ負荷（例えば、使用率、使用ＣＰＵコア数（又は空きＣＰＵコア数））である。
【００５１】
図４は、アクティブ制御プログラム２０Ａが実行されるノード１０１内のメモリ３０２における代表的なプログラム及びテーブルを示す。
【００５２】
メモリ３０２は、アクティブ制御プログラム２０Ａ、冗長化プログラム４２０、クラスタ制御プログラム４３０、構成テーブル４０１Ａ、ノード管理テーブル４０２、制御プログラム管理テーブル４０３、及びリソース割当管理テーブル４０４を格納する。
【００５３】
アクティブ制御プログラム２０Ａが、ＳＤＳ１８０のコントローラとしての機能を実現するためのプログラムである。冗長化プログラム４２０がＣＰＵ３０１により実行されることで、冗長化部２２が実現する。クラスタ制御プログラム４３０がＣＰＵ３０１により実行されることで、クラスタ制御部１５が実現する。プログラム２０、４２０及び４３０が、ＳＤＳ１８０のコンポーネントとしての機能を実現するためのプログラムでよい。クラスタ制御部１５が、複数のノード１０１での制御プログラム２０への計算リソースの割り当てを管理する。クラスタ制御部１５が、パッシブ制御プログラム２０Ｐを、停止させるか移動させるか、または／及び、移動させる場合の移動先のノード１０１を、決定するようになっている。
【００５４】
構成テーブル４０１は、制御プログラム２０毎に存在する。アクティブ制御プログラム２０Ａに対応した構成テーブル４０１を「構成テーブル４０１Ａ」と言う。本実施形態では、一ノード１０１で実行されるアクティブ制御プログラム２０Ａは１つであり、故に、当該ノード１０１では、１つのアクティブ制御プログラム２０Ａに対応する１つの構成テーブル４０１Ａが存在する。テーブル４０１Ａ〜４０４の詳細は後述する。
【００５５】
図５は、パッシブ制御プログラム２０Ｐが実行されるノード１０１内のメモリ３０２における代表的なプログラム及びテーブルを示す。
【００５６】
メモリ３０２は、集約されたパッシブ制御プログラム２０Ｐを格納し、故に、パッシブ制御プログラム２０Ｐ毎に構成テーブル４０１Ｐを格納する。構成テーブル４０１Ｐは、パッシブ制御プログラム２０Ｐに対応する構成テーブル４０１である。メモリ３０２は、その他、図４と同様のプログラム４２０及び４３０と、図４と同様のテーブル４０２〜４０４を格納する。
【００５７】
図６は、制御プログラム配置の一例を示す。
【００５８】
３つのプログラムペア６０−１〜６０−３が存在する。プログラムペア６０−１は、アクティブ制御プログラム２０Ａ−１とパッシブ制御プログラム２０Ｐ−１のペアである。プログラムペア６０−２は、アクティブ制御プログラム２０Ａ−２とパッシブ制御プログラム２０Ｐ−２のペアである。プログラムペア６０−３は、アクティブ制御プログラム２０Ａ−３とパッシブ制御プログラム２０Ｐ−３のペアである。
【００５９】
アクティブ制御プログラム２０Ａ−１〜２０Ａ−３がそれぞれノード１０１ａ〜１０１ｃに配置されている。言い換えれば、アクティブ制御プログラム２０Ａとノード１０１は１：１であり、１つのノード１０１に２個以上のアクティブ制御プログラム２０Ａは存在しない。これにより、負荷の均等な分散が期待できる。
【００６０】
一方、パッシブ制御プログラム２０Ｐ−１〜２０Ｐ−３は、１つのノード１０１ｄに集約されている。ノード１０１ａ〜１０１ｃのいずれかで障害が発生した場合、当該ノード１０１におけるアクティブ制御プログラム２０Ａとプログラムペア６０を構成するパッシブ制御プログラム２０Ｐがフェイルオーバー先となり処理を引き継ぐ。このようなフェイルオーバーの実現のため、同一のプログラムペア６０を構成する制御プログラム２０は、同一内容の構成テーブル４０１を保持することができる。
【００６１】
図７は、論理チャンクと物理チャンクの関係の一例を示す。
【００６２】
各ノード１０１（例えば、ノード１０１ａ）において、冗長化部２２（例えば、冗長化部２２ａ）が、１個以上の論理チャンク３３（例えば、論理チャンクＡ及びＤ）を提供する。また、各ノード１０１（例えば、ノード１０１ａ）において、ＰＤＥＶ１２（例えば、ＰＤＥＶ１２ａ）が、複数個の物理チャンク４３（例えば、複数個の物理チャンク４３ａ）を有する。各論理チャンク３３（例えば、論理チャンクＡ）は、当該論理チャンク３３に関連付けられた制御プログラム２０（例えば、ノード１０１ａではアクティブ制御プログラム２０Ａ−１、ノード１０１ではパッシブ制御プログラム２０Ｐ−１）に提供される。各ノード１０１（例えば、ノード１０１ａ）において、冗長化部２２（例えば、冗長化部２２ａ）は、１個以上の論理チャンク３３の各々について（例えば、論理チャンクＡ）、２台以上のノード１０１（典型的には、当該ノードを含む２台以上のノード１０１）における２個以上の物理チャンク４３（例えば、ノード１０１ａ及び１０１ｂにおける２つの物理チャンクＡ）を関連付ける。論理チャンク３３と制御プログラム２０の関係、及び、論理チャンク３３と物理チャンク４３の関係は、構成テーブル４０１に記述されている。図７の例によれば、１つの論理チャンク３３に２つの物理チャンク４３が関連付けられているため、１つの論理チャンク３３に格納されるデータセットは二重化される。以下、便宜上、各論理チャンク３３について、関連付けられている２つの物理チャンク４３のうち、１つの物理チャンク４３を、「マスター物理チャンク４３」と言い、もう１つの物理チャンク４３を、「ミラー物理チャンク４３」と言うことがある。本実施例では、二重化が採用されるが、より高い冗長化が採用されてもよいし、Erasure Codingが採用されてもよい。
【００６３】
複数台のノード１０１におけるｐ個の論理チャンク３３の各々について（ｐは自然数）、ｐ個のマスター物理チャンク４３もｐ個のミラー物理チャンク４３も、複数台のノード１０１に均等に分散している。
【００６４】
例えば、ｐ個のマスター物理チャンク４３については、次の通りである。すなわち、アクティブ制御プログラム２０Ａ−１〜２０Ａ−３が均等にノード１０１ａ〜１０１ｃに分散している。結果として、ｐ個のマスター物理チャンク４３はノード１０１ａ〜１０１ｃに均等に分散している。各論理チャンク３３について、マスター物理チャンク４３（例えば、マスター物理チャンクＡ）は、当該論理チャンク３３（例えば、論理チャンクＡ）を有するノード１０１（例えばノード１０１ａ）に存在する。
【００６５】
一方、例えば、ｐ個のミラー物理チャンク４３については、次の通りである。すなわち、全てのパッシブ制御プログラム２０Ｐ−１〜２０Ｐ−３がノード１０１ｄに集約されているが、ｐ個のミラー物理チャンク４３は、ノード１０１ａ〜１０１ｄに均等に分散している。具体的には、例えば、ノード１０１ｄでは、論理チャンクＡ〜Ｆが提供されるが、論理チャンクＡ〜Ｆに対応するミラー物理チャンクＡ〜Ｆは、ノード１０１ａ〜１０１ｄに均等に分散している。これにより、ノード１０１ａ〜ノード１０１ｃに比してノード１０１ｄの消費記憶容量が極端に大きくなることを回避できる。なお、ｐ個のミラー物理チャンク４３がノード１０１ａ〜１０１ｃに均等に分散されていることでノード１０１ｄの少なくとも１つのＰＤＥＶ１２が未使用とされておき、ノード１０１ａ〜１０１ｃのいずれかで障害が生じることによりデータセットの冗長度が落ちたときに、ノード１０１ｄにおける未使用のＰＤＥＶ１２が、冗長度の回復用のＰＤＥＶ１２（つまり、冗長度が落ちたデータセットを格納するマスター物理チャンク４３からのコピー先とされる物理チャンクを持つことになるＰＤＥＶ１２）とされてもよい。
【００６６】
図８は、制御プログラム管理テーブル４０３の構成を示す。
【００６７】
制御プログラム管理テーブル４０３は、制御プログラム２０に関する情報を保持する。制御プログラム管理テーブル４０３は、例えば、全ノード１０１におけるクラスタ制御部１５が共有する（例えば、全ノード１０１において制御プログラム管理テーブル４０３が同期している）。制御プログラム管理テーブル４０３は、例えば、制御プログラム管理テーブル４０３は、制御プログラム２０毎にエントリを有する。各エントリは、制御プログラム＃８０１、状態８０２、ペア＃８０３、稼働ノード＃８０４、使用容量８０５、ＣＰＵ負荷８０６、使用メモリ量８０７及び使用通信帯域８０８といった情報を格納する。以下、１つの制御プログラム２０を例に取る（図８の説明において「対象制御プログラム２０」）。
【００６８】
制御プログラム＃８０１は、対象制御プログラム２０の番号を示す。状態８０２は、対象制御プログラム２０の状態（例えば“Active”又は“Passive”又は“Dead”）を示す（“Dead”は、停止したことを意味する）。ペア＃８０３は、対象制御プログラム２０を含むプログラムペア６０の番号を示す。稼働ノード＃８０４は、対象制御プログラム２０を有するノード１０１の番号を示す。使用容量８０５は、対象制御プログラム２０が使用する記憶容量（例えば、対象制御プログラム２０に関連付けられている全論理チャンクの容量）を示す。ＣＰＵ負荷８０６は、対象制御プログラム２０の実行のために割り当てられるＣＰＵ負荷（例えば、使用率、又は、ＣＰＵコア数）を示す。使用メモリ量８０７は、対象制御プログラム２０の実行のために割り当てられるメモリ容量を示す。使用通信帯域８０８は、対象制御プログラム２０の実行のために割り当てられる通信帯域を示す。
【００６９】
図９は、ノード管理テーブル４０２の構成を示す。
【００７０】
ノード管理テーブル４０２は、ノード１０１に関する情報を保持する。ノード管理テーブル４０２は、例えば、各ノード１０１におけるクラスタ制御部１５が保持する（例えば、全ノード１０１においてノード管理テーブル４０２が同期している）。例えば、ノード管理テーブル４０２は、ノード１０１毎にエントリを有する。各エントリは、ノード＃９０１、状態９０２、アクティブ制御プログラム数９０３、パッシブ制御プログラム数９０４、最大容量９０５、使用容量９０６、ＣＰＵ負荷９０７、最大メモリ量９０８、使用メモリ量９０９、最大通信帯域９１０及び使用通信帯域９１１といった情報を格納する。以下、１つのノード１０１を例に取る（図９の説明において「対象ノード１０１」）。
【００７１】
ノード＃９０１は、対象ノード１０１の番号を示す。状態９０２は、対象ノード１０１の状態（例えば“正常”又は“異常”）を示す。アクティブ制御プログラム数９０３は、対象ノード１０１に存在するアクティ制御プログラム２０Ａの数を示す。パッシブ制御プログラム数９０４は、対象ノード１０１に存在するパッシブ制御プログラム２０Ｐの数を示す。最大容量９０５は、対象ノード１０１が有する最大記憶容量を示す。使用容量９０６は、対象ノード１０１が有する最大記憶容量のうちの使用されている記憶容量を示す。ＣＰＵ負荷９０７は、対象ノード１０１におけるＣＰＵ負荷（例えば、使用率、使用ＣＰＵコア数、又は、空きＣＰＵコア数）を示す。最大メモリ量９０８は、対象ノード１０１が有する最大のメモリ量を示す。使用メモリ量９０９は、対象ノード１０１における最大メモリ量のうちの使用されているメモリ量を示す。最大通信帯域９１０は、対象ノード１０１が使用可能な最大の通信帯域を示す。使用通信帯域９１１は、対象ノード１０１の最大通信帯域のうちの使用されている通信帯域を示す。
【００７２】
なお、ネットワーク２０３において、ホスト計算機２０１に接続されたフロントエンドネットワークと、他のノード１０１に接続されたバックエンドネットワークとが異なっていれば、最大通信帯域９１０及び使用通信帯域９１１は、フロントエンドネットワーク用の通信帯域９１０及び９１１と、バックエンドネットワーク用の通信帯域９１０及び９１１とがあってもよい。
【００７３】
図１０は、リソース割当管理テーブル４０４の構成を示す。
【００７４】
リソース割当管理テーブル４０４は、計算リソース（典型的には、ＰＤＥＶ１２以外の計算リソース）の割当に関する情報を保持する。リソース割当管理テーブル４０４は、ノード１０１毎に異なり得る。例えば、リソース割当管理テーブル４０４は、制御プログラム２０毎にエントリを有する。各エントリは、制御プログラム＃１００１、ＣＰＵコア＃１００２及びメモリ領域１００３といった情報を格納する。以下、１つの制御プログラム２０を例に取る（図１０の説明において「対象制御プログラム２０」）。
【００７５】
制御プログラム＃１００１は、対象制御プログラム２０の番号を示す。ＣＰＵコア＃１００２は、対象制御プログラム２０に割り当てられているＣＰＵコアの番号を示す。メモリ領域１００３は、対象制御プログラム２０に割り当てられているメモリ領域のアドレスを示す。メモリ領域１００３は、更に、メモリ領域の容量であるメモリ量を示す情報を含んでもよい。
【００７６】
リソース割当管理テーブル４０４によれば、対象制御プログラム２０（例えば、いずれかのパッシブ制御プログラム２０Ｐ）が停止された場合に、解放されたリソース量に加えて、いずれのリソースが解放されたかまでもわかる。なお、リソース割当管理テーブル４０４は、例えば、当該テーブル４０４を有するノード１０１における全計算リソースについて、状態（例えば、空きか使用中か）を示す情報を保持してもよい。
【００７７】
図１１及び図１２は、構成テーブル４０１の構成を示す。具体的には、図１１は、構成テーブル４０１の一部である物理チャンク管理テーブル１１００の構成を示す。図１２は、構成テーブル４０１の残りである論理チャンク管理テーブル１２００の構成を示す。構成テーブル４０１は、例えば、各ノード１０１における冗長化部２２が保持する（例えば、全ノード１０１において構成テーブル４０１が同期している）。各ノード１０１において、冗長化部２２が、構成テーブル４０１を基に、論理チャンク３３の提供先の制御プログラム２０を特定したり、当該論理チャンク３３に関連付いている２つの物理チャンク４３を特定したり、特定した２つの物理チャンク４３にデータセットを書き込んだり（二重化）、特定した２つの物理チャンク４３のいずれか（典型的にはマスター物理チャンク４３）からデータセットを読み出したりすることができる。構成テーブル４０１は、プログラムペア毎に独立していてもよい。
【００７８】
図１１に示すように、物理チャンク管理テーブル１１００は、物理チャンク４３に関する情報を保持する。例えば、物理チャンク管理テーブル１１００は、物理チャンク４３毎に、エントリを有する。各エントリは、物理チャンク＃１１０１、所属ノード＃１１０２、ＰＤＥＶ＃１１０３及びＰＤＥＶ内オフセット１１０４といった情報を格納する。以下、１つの物理チャンク４３を例に取る（図１１の説明において「対象物理チャンク４３」）。
【００７９】
物理チャンク＃１１０１は、対象物理チャンク４３の番号を示す。所属ノード＃１１０２は、対象物理チャンク４３を有するノード１０１の番号を示す。ＰＤＥＶ＃１１０３は、対象物理チャンク４３を有するＰＤＥＶ１２の番号を示す。ＰＤＥＶ内オフセット１１０４は、対象物理チャンク４３を有するＰＤＥＶ１２の先頭アドレスからのオフセットを示す。
【００８０】
図１２に示すように、論理チャンク管理テーブル１２００は、論理チャンク３３に関する情報を保持する。例えば、論理チャンク管理テーブル１２００は、論理チャンク３３毎に、エントリを有する。各エントリは、論理チャンク＃１２０１、制御プログラム＃１２０２、マスター物理チャンク＃１２０３及びミラー物理チャンク＃１２０４といった情報を格納する。以下、１つの論理チャンク３３を例に取る（図１２の説明において「対象論理チャンク３３」）。
【００８１】
論理チャンク＃１２０１は、対象論理チャンク３３の番号を示す。制御プログラム＃１２０２は、対象論理チャンク３３が関連付けられている制御プログラム２０（別の言い方をすれば、対象論理チャンク３３の割当先（提供先）の制御プログラム２０）の番号を示す。マスター物理チャンク＃１２０３は、対象論理チャンク３３に関連付けられている（割り当てられている）マスター物理チャンク４３の番号を示す。ミラー物理チャンク＃１２０４は、対象論理チャンク３３に関連付けられているミラー物理チャンク４３の番号を示す。
【００８２】
以下、本実施例においてクラスタ制御部１５（例えば、マスターノード１０１におけるクラスタ制御部１５）が行う処理を説明する。
【００８３】
図１３は、クラスタ制御部１５が行う処理の流れを示す。なお、以下の流れにおいて、ノード１０１間の処理（例えば、Ｓ１３０４〜Ｓ１３０８）のうちの少なくとも一部は、異なるノード１０１におけるクラスタ制御部１５間での処理でよい。
【００８４】
クラスタ制御部１５は、当該クラスタ制御部１５を有するノード１０１とは別のいずれかのノード１０１で障害が発生した場合（Ｓ１３０１：Ｙｅｓ）、ノード管理テーブル４０２を基に、障害ノード１０１（当該障害が生じたノード１０１）に少なくとも１つのアクティブ制御プログラム２０Ａが存在するか否か（障害ノード１０１に対応したアクティブ制御プログラム数９０３の値が“１”以上か否か）を判断する（Ｓ１３０２）。
【００８５】
Ｓ１３０２の判断結果が真の場合（Ｓ１３０２：Ｙｅｓ）、フェイルオーバーが必要であるため、Ｓ１３０３〜Ｓ１３０８が行われる。以下、図１３の説明において、１つのアクティブ制御プログラム２０Ａを例に取る（図１３の説明において「対象アクティブ制御プログラム２０Ａ」）。
【００８６】
クラスタ制御部１５は、制御プログラム管理テーブル４０３を基に、アクティブ制御プログラム２０Ａと同一のプログラムペア６０を構成するパッシブ制御プログラム２０Ｐと、当該パッシブ制御プログラム２０Ｐを有するノード１０１とを特定する（Ｓ１３０３）。以下、図１３の説明において、Ｓ１３０３で特定されたパッシブ制御プログラム２０Ｐを、「フェイルオーバー先プログラム２０Ｐ」と言い、Ｓ１３０３で特定されたノード１０１を、「フェイルオーバー先ノード１０１」と言う。
【００８７】
クラスタ制御部１５は、フェイルオーバー先プログラム２０Ｐに、対象アクティブ制御プログラム２０Ａの処理を引き継ぐよう通知する（Ｓ１３０４）。なお、この通知先は、フェイルオーバー先ノード１０１におけるクラスタ制御部１５でもよく、当該クラスタ制御部１５により、処理の引継ぎが制御されてもよい。
【００８８】
クラスタ制御部１５は、フェイルオーバー先ノード１０１が有するパッシブ制御プログラム２０Ｐのうち、フェイルオーバー先プログラム２０Ｐ以外の全てのパッシブ制御プログラム２０Ｐを停止させる（Ｓ１３０５）。なお、フェイルオーバー先プログラム２０Ｐ以外の全てのパッシブ制御プログラム２０Ｐを停止は、フェイルオーバー先プログラム２０Ｐ以外の少なくとも１個のパッシブ制御プログラム２０Ｐの稼働状況の変更の一例である。
【００８９】
クラスタ制御部１５は、リソース割当管理テーブル４０４を基に、Ｓ１３０５の停止により解放された（空いた）計算リソースを特定し、特定された全ての計算リソースのうちの少なくとも一部の割当先を、フェイルオーバー先プログラム２０Ｐに変更する（Ｓ１３０６）。つまり、Ｓ１３０６では、当該クラスタ制御部１５を有するノード１０１内のリソース割当管理テーブル４０４が更新される。
【００９０】
クラスタ制御部１５は、制御プログラム管理テーブル４０３のうち、フェイルオーバー先プログラム２０Ｐに対応した状態８０２を、“Accitve”に変更する（Ｓ１３０７）。つまり、Ｓ１３０７では、制御プログラム管理テーブル４０３が更新される。更新後の制御プログラム管理テーブル４０３の同期が、ノード１０１間で行われる。
【００９１】
クラスタ制御部１５は、ノード管理テーブル４０２のうち、フェイルオーバー先ノード１０１に対応したアクティブ制御プログラム数９０３を、“１”インクリメントし、且つ、フェイルオーバー先ノード１０１に対応したパッシブ制御プログラム数９０４を、“０”に変更する（Ｓ１３０８）。つまり、Ｓ１３０８では、ノード管理テーブル４０２が更新される。更新後のノード管理テーブル４０２の同期が、ノード１０１間で行われる。
【００９２】
図１３によれば、フェイルオーバー先ノード１０１が有するパッシブ制御プログラム２０Ｐのうち、フェイルオーバー先プログラム２０Ｐ以外の全てのパッシブ制御プログラム２０Ｐが停止する。これにより、フェイルオーバー先プログラム２０Ｐに、対象アクティブ制御プログラム２０Ａに割り当てられていたリソース量と同等のリソース量を割り当てることの可能性を高めることができる。
【００９３】
また、本実施例では、制御プログラム２０の切り替え（フェイルオーバー）の制御も、制御プログラム２０へのリソース割当の管理も、クラスタ制御部１５により行われる（また、プログラムペア６０もクラスタ制御部１５が管理する）。このため、クラスタ制御部１５は、いずれのパッシブ制御プログラム２０を停止することでいずれの計算リソースが解放されるかを特定し、特定した計算リソースの割当先をフェイルオーバー先プログラム２０Ｐに変更できる。
【００９４】
なお、図１３において、クラスタ制御部１５は、フェイルオーバー先ノード１０１が有するパッシブ制御プログラム２０Ｐのうち、フェイルオーバー先プログラム２０Ｐ以外の全てのパッシブ制御プログラム２０Ｐが停止することに代えて、対象アクティブ制御プログラム２０Ａに割り当てられたリソース量に基づき決定されたパッシブ制御プログラムＰを停止してもよい。具体的には、例えば、クラスタ制御部１５は、リソース割当管理テーブル４０４を基に、対象アクティブ制御プログラム２０Ａに割り当てられた計算リソースを特定し、特定された計算リソースのリソース量のＸ％（Ｘは、０＜Ｘ≦１００を満たす所定値）以上のリソース量をフェイルオーバー先プログラム２０Ｐに割り当てるために停止すべきパッシブ制御プログラム２０Ｐを、リソース割当管理テーブル４０４を基に決定し、決定したパッシブ制御プログラム２０Ｐを停止してもよい。これにより、フェイルオーバー先プログラム２０Ｐに対するリソース量を確保しても、一部のパッシブ制御プログラムＰが停止されない可能性があるので、当該パッシブ制御プログラムＰに対応したアクティブ制御プログラム２０Ａを有するノード１０１にも障害が生じても、高速なフェイルオーバーが期待できる。
【００９５】
また、本実施例において、論理チャンク３３に対する物理チャンク４３の割り当てに関し、下記のうちの少なくとも１つが採用されてよい。
【００９６】
第１に、冗長化部２２が、論理チャンク３３に関連付ける２個以上の物理チャンク４３として、異なる２台以上のノード１０１が有する２個以上の物理チャンク４３を選択する。一比較例では、１つの論理チャンクに対して同じノード内の２個以上の物理チャンクが関連付けられるが、そうすると、当該ノードに障害が生じると、当該論理チャンクに格納されたデータセットがロストする。本実施例では、このようなデータロストを避けることができる。
【００９７】
第２に、冗長化部２２が、同一プログラムペア６０を構成する２つの制御プログラム２０Ａ及び２０Ｐにそれぞれ提供する２つの論理チャンク３３に関連付ける同一の２個以上の物理チャンク４３として、当該２つの制御プログラム２０Ａ及び２０Ｐをそれぞれ有する２つのノード１０１における２つの物理チャンク４３を優先的に選択する。これにより、論理チャンク３３に対するＩ／Ｏが発生した場合、フェイルオーバーの前でも後でも、少なくともマスター物理チャンクについては、ノード１０１間の通信が発生することを回避できる。
【００９８】
第３に、冗長化部２２が、いずれのノード１０１についても、１個以上の論理チャンク３３に関連付けられる物理チャンク４３の総量を制限する。これにより、特定のノード１０１についてのみ物理チャンク４３が枯渇するといったことを回避できる。
【実施例２】
【００９９】
実施例２を説明する。その際、実施例１との相違点を主に説明し、実施例１との共通点については説明を省略又は簡略する。
【０１００】
図１４は、実施例２の概要を模式的に示す。
【０１０１】
記憶システム１４００が、２個以上のノード群１４０１で構成される。各ノード群１４０１は、Ｎ個（Ｎは２個以上の整数）のアクティブ制御プログラム２０Ａがそれぞれ実行されるＮのノード１０１と、Ｎ台のアクティブ制御プログラム２０Ａをそれぞれ有するＮ個のプログラムペア６０におけるＮ個のパッシブ制御プログラム２０Ｐが集約されるｍ台（ｍは自然数且つｍ＜Ｎ）のノード１０１である。つまり、各ノード群１４０１は、（Ｎ＋ｍ）ノード群１４０１（（Ｎ＋ｍ）構成のノード群１４０１）である。ノード群１４０１によって、Ｎの値が異なっていてもよいし、ｍの値が異なっていてもよい。以下、Ｎのノードの各々を、「アクティブノード」と言い、ｍのノードの各々を、「パッシブノード」と言うことがある。図１４の例では、ノード群１４０１Ａ〜１４０１Ｃのいずれにおいても、Ｎ＝３且つｍ＝１である。具体的には、ノード１０１ａ〜１０１ｃ、ノード１０１ｅ〜１０１ｇ、及び、ノード１０１ｉ〜１０１ｋの各々が、アクティブノードである。ノード１０１ｄ、ノード１０１ｈ及びノード１０１ｌの各々が、パッシブノードである。
【０１０２】
実施例２では、停止されたパッシブ制御プログラム２０Ｐが、当該パッシブ制御プログラム２０Ｐを有するノード１０１から別のノード１０１（例えば、パッシブ制御プログラム２０Ｐが集約されている別のノード１０１、又は、リソース量に余裕のあるノード１０１）に移動する。クラスタ制御部２５が、移動先のストレージノードを、前記パッシブの制御プログラム以外が使用している移動先ストレージノードの計算リソースの使用状況に基づいて、決定する。例えば、クラスタ制御部２５が、移動先のノード１０１を、停止されたパッシブ制御プログラム２０Ｐの移動先のノード１０１を、当該パッシブ制御プログラム２０Ｐが存在するノード１０１以外の少なくとも１台のノード１０１の計算リソースの使用状況に基づいて、決定する。
【０１０３】
具体的には、例えば、図１４に例示の通り、ノード１０１ａで障害が生じたとする。この場合、当該ノード１０１ａを含んだノード群１４０１におけるいずれか別のノード１０１におけるクラスタ制御部２５、例えば、当該ノード群１４０１におけるマスターノードであるノード１０１ｂにおけるクラスタ制御部２５ｂが、次の処理を行う。すなわち、クラスタ制御部２５ｂが、ノード１０１ａにおけるアクティブ制御プログラム２０Ａ−１に対応したパッシブ制御プログラム２０Ｐ−１以外のパッシブ制御プログラム２０Ｐ−２及び２０Ｐ−３を停止する。クラスタ制御部２５ｂが、停止したパッシブ制御プログラム２０Ｐ−２及び２０Ｐ−３の各々について、当該プログラム２０Ｐを有するノード１０１ｄ以外のノード１０１に移動させ、且つ、当該プログラム２０Ｐに関連付いた論理チャンク３３も、移動先のノード１０１に移動させる。論理チャンク３３の移動は、クラスタ制御部２５ｂにより呼び出された冗長化部２２により実行可能である。移動先ノードは、典型的には、ノード１０１ｄを含むノード群１４０１Ａ以外のいずれかのノード群１４０１Ｂ又は１４０１Ｃにおけるパッシブノード１０１ｈ又は１０１ｌである。論理チャンク３３が移動しても、当該論理チャンク３３内のデータセットの移動は生じない。移動の前後において、論理チャンク３３に関連付けられている２つの物理チャンク４３に変更は無いためである。これらのクラスタ制御部２５による処理は、異なる順序や並列で実行されても良い。
【０１０４】
実施例２によれば、停止したパッシブ制御プログラム２０Ｐが別ノード１０１に移動するので、以後に、停止したパッシブ制御プログラム２０Ｐに対応したアクティブ制御プログラム２０Ａを有するノード１０１に障害が生じても（つまり、異なる２台以上のノード１０１に障害が時間差をおいて生じても）、当該障害についてのフェイルオーバーが可能でありシステムの可用性を維持することができるとともに、この際にフェイルオーバー先でリソースが不足するおそれを低減することができる。
【０１０５】
そして、停止したパッシブ制御プログラム２０Ｐの別ノード１０１への移動に伴い、当該パッシブ制御プログラム２０Ｐに関連付いた論理チャンク３３も同じノード１０１に移動される。このため、移動されたパッシブ制御プログラム２０Ｐが移動先のノード１０１においてフェイルオーバーによりアクティブになった場合、当該プログラムは、当該プログラムに関連付いている論理チャンク経由でデータセットを入出力できる、つまり、処理を引き継ぐことができる。このように、パッシブ制御プログラム２０Ｐがノード１０１間で移動しても、当該制御プログラム２０が、移動先のノード１０１から別のノード１０１（例えば移動元のノード１０１）にあるデータセットにアクセス可能になるのは、冗長化部２２の機能（及び、冗長化部２２が管理する上述の構成テーブル４０１）に依存する。
【０１０６】
なお、必ずしも、２個以上の（Ｎ＋ｍ）ノード群１４０１が存在する構成でなくてもよい。例えば、ｍ≧２の整数の場合、（Ｎ＋ｍ）ノード群１４０１は１つでもよい。
【０１０７】
以下、実施例２を詳細に説明する。
【０１０８】
図１５は、クラスタ制御部２５が行う処理の流れを示す。
【０１０９】
Ｓ１５０１〜Ｓ１５０４は、図１３のＳ１３０１〜Ｓ１３０４と同じである。以下、１５〜図１７の説明において、図１３と同様に、「対象アクティブ制御プログラム２０Ａ」、「フェイルオーバー先プログラム２０Ｐ」及び「フェイルオーバー先ノード１０１」と言う言葉を使用することがある。
【０１１０】
フェイルオーバー先ノード１０１における、フェイルオーバー先プログラム２０Ｐ以外の全パッシブ制御プログラム２０Ｐの各々について、Ｓ１５０５〜Ｓ１５０７が行われる。以下、１つのパッシブ制御プログラム２０Ｐを例に取る（図１５〜図１７の説明において、「対象パッシブ制御プログラム２０Ｐ」）。
【０１１１】
すなわち、クラスタ制御部２５は、対象パッシブ制御プログラム２０Ｐの再配置制御処理（図１６）を行う（Ｓ１５０５）。その後、クラスタ制御部２５は、対象パッシブ制御プログラム２０Ｐを停止し（Ｓ１５０６）、フェイルオーバー先ノード１０１に対応したパッシブ制御プログラム数９０４を１デクリメントする（Ｓ１５０７）。
【０１１２】
フェイルオーバー先プログラム２０Ｐ以外の全パッシブ制御プログラム２０Ｐの各々について、Ｓ１５０５〜Ｓ１５０７が行われた後、クラスタ制御部２５は、１個以上のパッシブ制御プログラム２０Ｐの停止により解放された（空いた）計算リソースを、リソース割当管理テーブル４０４を基に特定し、特定された全ての計算リソースのうちの少なくとも一部の割当先を、フェイルオーバー先プログラム２０Ｐに変更する（Ｓ１５０８）。クラスタ制御部２５は、フェイルオーバー先プログラム２０Ｐに対応した状態８０２を“Active”に変更し（Ｓ１５０９）、フェイルオーバー先ノード１０１に対応したアクティブ制御プログラム数９０３を１インクリメントする（Ｓ１５１０）。
【０１１３】
なお、図１５の例によれば、Ｓ１５０５〜Ｓ１５０７は、フェイルオーバー先プログラム２０Ｐ以外の全パッシブ制御プログラム２０Ｐの各々について行われるが、それに代えて、フェイルオーバー先プログラム２０Ｐ以外の全パッシブ制御プログラム２０Ｐの各々についてＳ１５０５〜Ｓ１５０７を行うことは、ループ終了条件の一例である。ループ終了条件として、対象アクティブ制御プログラム２０Ａが使用していたリソース量以上のリソース量が解放されたこと、といった他の条件が採用されてもよい。
【０１１４】
図１６は、再配置制御処理の流れを示す。以下、説明を簡単にするために、各ノード１０１について、使用容量９０６、ＣＰＵ負荷９０７、使用メモリ量９０９及び使用通信帯域９１１がそれぞれ表す値のいずれも「ノード使用リソース量」と総称し、最大容量９０５、図示しない最大ＣＰＵ負荷（例えば１００％）、最大メモリ量９０８及び最大通信帯域９１０がそれぞれ表す値のいずれも「ノード最大リソース量」と言うことがある。また、各制御プログラム２０について、当該制御プログラム２０に割り当てられている（例えば使用されている）計算リソースのリソース量を「プログラムリソース量」と言うことがある。プログラムリソース量としては、例えば、ＣＰＵ負荷としてのリソース量、メモリ量としてのリソース量、及び、通信帯域としてのリソース量のうちの少なくとも１つがある。本実施例では、パッシブ制御プログラム２０Ｐのノード間移動に伴い論理チャンク３３のノード間移動は発生するものの当該論理チャンク３３内のデータセットのノード間移動は生じないため、ノード使用リソース量及びノード最大リソース量から、使用容量９０６及び最大容量９０５は除外されてもよい。
【０１１５】
クラスタ制御部２５は、アクティブ制御プログラム数９０３“０”のノード１０１（ノード＃）がパッシブ制御プログラム数９０４の昇順（つまりパッシブ制御プログラム２０Ｐの少ない順）に並んだリストを作成する（Ｓ１６０１）。以下、Ｓ１６０１で作成されたノードリストを、「第１のノードリスト」と言う。第１のノードリストに他にノードリストとして後述の第２のノードリストが生成され得る。参照されるノードリストを「参照対象ノードリスト」と言う。
【０１１６】
Ｓ１６０１の時点で、第１のノードリストには少なくとも１つのノード１０１があるとする（Ｓ１６０２：Ｎｏ）。
【０１１７】
クラスタ制御部２５は、参照対象ノードリスト（ここでは第１のノードリスト）の先頭ノード１０１を「候補ノード１０１」とする（Ｓ１６０５）。
【０１１８】
クラスタ制御部２５は、制御プログラム管理テーブル４０３、ノード管理テーブル４０２及びリソース割当管理テーブル４０４を基に、候補ノード１０１に対象パッシブ制御プログラム２０Ｐを移動するとリソース量超過が生じるか否か（すなわち、候補ノード１０１のノード使用リソース量に対象パッシブ制御プログラム２０Ｐのプログラムリソース量が加算されると候補ノード１０１のノード最大リソース量を超えることになるか否か）を判断する（Ｓ１６０６）。なお、少なくともリソース割当管理テーブル４０４は、全ノード１０１間で同期していてもよいし、ノード１０１間通信で参照が可能となっていてもよい。
【０１１９】
Ｓ１６０６の判断結果が偽の場合（Ｓ１６０６：Ｎｏ）、候補ノード１０１は、停止後移動されるノード１０１となる。クラスタ制御部２５は、当該候補ノード１０１について、制御プログラム移動処理（図１７）を行う（Ｓ１６０９）。これにより、対象パッシブ制御プログラム２０Ｐについての再配置制御処理（図１６の処理）は終了する。なお、Ｓ１６０６：Ｎｏとなった候補ノード１０１を、後の図１７の説明において、「移動先ノード１０１」と言う。
【０１２０】
Ｓ１６０６の判断結果が真の場合（Ｓ１６０６：Ｙｅｓ）、候補ノード１０１を移動先とするとリソース超過が生じ得るため、クラスタ制御部２５は、候補ノード１０１を参照対象ノードリスト（第１のノードリスト）から除外する（Ｓ１６０７）。そして、クラスタ制御部２５は、参照対象ノードリストが空（１つもノード＃が無い）か否かを判断する（Ｓ１６０２）。Ｓ１６０２の判断結果が偽の場合（Ｓ１６０２：Ｎｏ）、現在の先頭ノード１０１を候補ノード１０１として、クラスタ制御部２５は、Ｓ１６０５以降を行う。
【０１２１】
Ｓ１６０２の判断結果が真（Ｓ１６０２：Ｙｅｓ）であるということは、アクティブ制御プログラム数９０３“０”のいずれのノード１０１も（つまり、いずれのパッシブノード１０１も）、対象パッシブ制御プログラム２０Ｐが移動されるとリソース超過が生じ得るということである。そこで、クラスタ制御部２５は、移動先の候補をアクティブ制御プログラム数９０３“０”のノード１０１に制限しないノードリスト、つまり、障害が生じたノード１０１以外の全てのノード１０１がノード使用リソース量の昇順（つまり、ノード使用リソース量の少ない順）で並んだノードリストを作成する（Ｓ１６０４）。Ｓ１６０４で作成されたノードリストが、「第２のノードリスト」である。
【０１２２】
以降、クラスタ制御部２５は、第２のノードリストを、参照対象ノードリストとして、Ｓ１６０５以降を行う。
【０１２３】
第２のノードリストも空になってしまった場合（Ｓ１６０２：Ｙｅｓ、Ｓ１６０３：Ｙｅｓ）、クラスタ制御部２５は、アラート（例えば、リソース量不足に伴うノード増設を示唆するメッセージ）を管理システム２０２に送信する（Ｓ１６０８）。
【０１２４】
図１６によれば、アクティブ制御プログラム数９０３“０”のノード１０１のうちパッシブ制御プログラム数９０４が最も小さいノード１０１が最も優先的に移動先ノード１０１となり得る。これにより、以後の障害に伴うフェイルオーバーの際にリソース不足が生じる可能性が最も低いことが期待される。
【０１２５】
また、図１６によれば、アクティブ制御プログラム数９０３“０”のいずれのノード１０１も移動先となるとリソース超過が生じ得る場合、アクティブ制御プログラム数９０３“０”のノード１０１以外のノード１０１からも移動先となり得るノード１０１が探される。これにより、リソース量超過が生じない範囲で、対象パッシブ制御プログラム２０Ｐが移動される可能性を高めることができる。
【０１２６】
図１７は、制御プログラム移動処理の流れを示す。
【０１２７】
クラスタ制御部２５は、移動先ノード１０１に、フェイルオーバー先ノード１０１から構成テーブル４０１をコピーする（Ｓ１７０１）。つまり、構成テーブル４０１の同期が行われる。
【０１２８】
コピーが完了した場合（Ｓ１７０２：Ｙｅｓ）、クラスタ制御部２５は、対象パッシブ制御プログラム２０Ｐに関連付けられている全論理チャンク３３の各々について、Ｓ１７０３及びＳ１７０４を行う。以下、１つの論理チャンク３３を例に取る（図１７の説明において「対象論理チャンク３３」）。
【０１２９】
すなわち、クラスタ制御部２５は、論理チャンクテーブル１２００を参照して論理チャンク３３を構成する物理チャンクを確認し、同一の物理チャンクに関連付けた論理チャンク３３の作成を、移動先ノード１０１における冗長化部２２（以下、移動先冗長化部２２）に指示する（Ｓ１７０３）。移動先冗長化部２２が、当該指示に応答して、対象論理チャンク３３を作成する。これにより、論理チャンク管理テーブル１２００に、新たなエントリが追加される。新たなエントリは、作成された対象論理チャンク３３（すなわち、フェイルオーバー先ノード１０１における対象論理チャンク３３に関連付いた２つの物理チャンク４３が関連付けられた論理チャンク３３）に対応する。なお、対象論理チャンク３３の作成は、コピー後（同期後）の構成テーブル４０１を基に行われてよい。
【０１３０】
クラスタ制御部２５は、フェイルオーバー先ノード１０１（移動元ノード１０１）から対象論理チャンク３３を削除する（Ｓ１７０４）。例えば、当該論理チャンク３３に対応したエントリが、論理チャンク管理テーブル１２００から削除される。
【０１３１】
対象パッシブ制御プログラム２０Ｐに関連付けられている全論理チャンク３３の各々について、Ｓ１７０３及びＳ１７０４が行われた後、クラスタ制御部２５は、対象パッシブ制御プログラム２０Ｐに対応した稼働ノード＃８０４を、移動先ノード１０１の番号に更新する（Ｓ１７０５）。制御プログラム２０のノード間移動は、Ｓ１７０５で行われる。クラスタ制御部２５は、移動先ノード１０１に移動された制御プログラム２０の状態を“Passive”にするための起動を行う（Ｓ１７０６）。クラスタ制御部２５は、移動先ノード１０１に対応したパッシブ制御プログラム数９０４を１インクリメントする（Ｓ１７０７）。
【実施例３】
【０１３２】
実施例３を説明する。その際、実施例１及び２との相違点を主に説明し、実施例１及び２との共通点については説明を省略又は簡略する。
【０１３３】
図１８は、実施例３に係る記憶システムの構成を示す。
【０１３４】
記憶システム１８００は、複数のフォールトセット１８０１で構成される。各フォールトセット１８０１は、単一障害点共有範囲の一例であり、単一障害点を同一とする１台以上のノード１０１である。単一障害点の一例として、電源を挙げることができる。すなわち、記憶システム１８００の複数の電源のうちの或る電源に障害が生じると、記憶システム１８００を構成する複数台のノード１０１のうちの一部のノード１０１全てに障害が生じるが、その一部のノード１０１に相当する１台以上のノード１０１が、同一のフォールトセット１８０１に属するノード１０１である。同一のフォールトセット１８０１に属するノード１０１は、例えば、同一のラックに搭載されていてよい。
【０１３５】
また、各フォールトセット１８０１において、少なくとも１つのノード１０１が、クラスタ制御部３５を有する。クラスタ制御部３５により、移動されるパッシブ制御プログラム２０Ｐは、対応するアクティブ制御プログラム２０Ａとは別のフォールトセット１８０１に属するように、移動先のノード１０１を選択される。
【０１３６】
各プログラムペア６０について、アクティブ制御プログラム２０Ａとパッシブ制御プログラム２０Ｐは、異なる２つのフォールトセット１８０１に配置される。これにより、或る単一障害によって同一のフォールトセット１８０１における全てのノード１０１に一斉に障害が生じても、障害が生じた全てのノード１０１における全てのアクティブ制御プログラム２０Ａの各々について、対応するパッシブ制御プログラム２０Ｐがいずれか別のフォールトセット１８０１に存在する。このため、高可用を維持することができる。
【０１３７】
図１９は、実施例３に係る制御プログラム配置の第１の例を示す。
【０１３８】
複数の（Ｎ＋ｍ）ノード群が、複数のフォールトセット１８０１Ａ〜１８０１Ｄに跨っている。具体的には、各（３＋１）ノード群について、３台のアクティブノード１０１ａ、１０１ｂ及び１０１ｃがそれぞれ３つのフォールトセット１８０１Ａ〜１８０１Ｃに存在し、１台のパッシブノード１０１ｄが１つのフォールトセット１８０１Ｄに存在する。このため、フォールトセット１８０１Ａ〜１８０１Ｃの各々は、１台以上のアクティブノード１０１の集合としてのフォールトセット（パッシブノード１０１を含まないフォールトセット）１８０１であり、フォールトセット１８０１Ｄは、１台以上のパッシブノード１０１の集合としてのフォールトセット（アクティブノード１０１を含まないフォールトセット）１８０１である。
【０１３９】
この例によれば、プログラムペア６０−１〜６０−６の各々について、アクティブ制御プログラム２０Ａとパッシブ制御プログラム２０Ｐは、（Ｎ＋ｍ）ノード群単位で、異なる２つのフォールトセット１８０１に配置される。
【０１４０】
この例によれば、フォールトセット１８０１Ａ〜１８０１Ｄに（Ｎ＋ｍ）ノード群の単位で増設又は減設ができる。
【０１４１】
図２０は、実施例３に係る制御プログラム配置の第２の例を示す。
【０１４２】
複数のフォールトセット１８０１Ｅ〜１８０１Ｈの各々が、１以上のアクティブノード１０１と、１以上のパッシブノード１０１とを含む。複数のフォールトセット１８０１Ｅ〜１８０１Ｈの各々において、パッシブノード１０１の数と、アクティブノード１０１の数は限定されないでよいが、好ましくは、パッシブノード１０１は、アクティブノード１０１より少ない。
【０１４３】
この例によれば、プログラムペア６０−７〜６０−１０の各々について、アクティブ制御プログラム２０Ａとパッシブ制御プログラム２０Ｐは、異なる２つのフォールトセット１８０１に配置される。例えば、プログラムペア６０−ｗ（ｗは自然数、図２０では、ｗは、７≦ｗ≦１０の整数）におけるパッシブ制御プログラム２０Ｐ−ｗは、パッシブ制御プログラム２０Ｐ−ｗが配置されるパッシブノード１０１を含んだフォールトセット１８０１と別のフォールトセット１８０１であって、プログラムペア６０−（ｗ＋１）におけるアクティブ制御プログラム２０Ａ−（ｗ＋１）が配置されるアクティブノード１０１を含んだフォールトセット１８０１に配置される（（ｗ＋１）が、ｗの最大値を超える場合、（ｗ＋１）＝ｗの最小値である）。
【０１４４】
この例によれば、フォールトセット単位で増設又は減設ができる。
【０１４５】
なお、図示しないが、実施例３に係る制御プログラム配置の第３の例として、次の配置が採用されてもよい。すなわち、パッシブノード１０１が、複数のフォールトセット１８０１に分散するように配置してもよい。この場合、或る単一障害によって、パッシブノードを持つフォールトセット１８０１における全てのノード１０１に一斉に障害が生じても、障害が生じるパッシブノードがシステム全体に存在するパッシブノードの一部のみとなるため、フェイルオーバー先のパッシブ制御プログラムを失うアクティブ制御プログラムの個数を抑制できる。
【０１４６】
図２１は、実施例３に係るノード管理テーブル２１００の構成を示す。
【０１４７】
図２１に例示のノード管理テーブル２１００によれば、各エントリが、上述した情報９０１〜９１１に加えて、フォールトセット＃２１０３といった情報を格納する。各ノード１０１について、フォールトセット＃２１０３は、当該ノード１０１が所属するフォールトセット１８０１の番号を示す。
【０１４８】
図２２は、クラスタ制御部３５が行う再配置制御処理の流れを示す。
【０１４９】
図２２において、Ｓ２２０１〜Ｓ２２０５は、それぞれ、図１６のＳ１６０１〜Ｓ１６０５と同じである。また、Ｓ２２０７〜Ｓ２２１０は、それぞれ、Ｓ１６０６〜Ｓ１６０９と同じである。
【０１５０】
すなわち、図２２が示す処理のうち、図１６が示す処理との相違点は、Ｓ２２０６が追加されていることである。
【０１５１】
クラスタ制御部３５は、ノード管理テーブル２１００を基に、候補ノード１０１を含んだフォールトセット１８０１が、対象パッシブ制御プログラム２０Ｐに対応したアクティブ制御プログラム２０Ａ（対象パッシブ制御プログラム２０Ｐを含むプログラムペア６０におけるアクティブ制御プログラム２０Ａ）が配置されているノード１０１を含んだフォールトセット１８０１と異なるフォールトセット１８０１であるか否かを判断する（Ｓ２２０６）。移動先が、対応したアクティブ制御プログラム２０Ａが配置されているフォールトセット１８０１になることによって、可用性が低下することを避けるためである。
【０１５２】
Ｓ２２０６の判断結果が真の場合（Ｓ２２０６：Ｙｅｓ）、Ｓ２２０７が行われる。Ｓ２２０６の判断結果が偽の場合（Ｓ２２０６：Ｎｏ）、Ｓ２２０８が行われる。
【実施例４】
【０１５３】
実施例４を説明する。その際、実施例３との相違点を主に説明し、実施例３との共通点については説明を省略又は簡略する。なお、実施例４における後述のコンバート処理は、フォールトセット１８０１の考慮の無い実施例１及び２のいずれに適用されてもよい。
【０１５４】
図２３は、実施例４の概要を模式的に示す。
【０１５５】
実施例１〜３のような制御プログラム配置、すなわち、いずれのアクティブ制御プログラム２０Ａも配置されないノード１０１に全てのパッシブ制御プログラム２０Ｐを配置することを、「分離配置」と呼ぶ。分離配置は、パッシブ制御プログラム２０Ｐ用のノード１０１が必要である。
【０１５６】
パッシブ制御プログラム２０Ｐ用のノード１０１が必要となると、ノード数が増えるため、そのようなノード１０１を必要としない記憶システムが望まれるケースもあり得る。
【０１５７】
そこで、本実施例では、分離配置に代えて、同一プログラムペア６０を構成するアクティブ制御プログラム２０Ａとパッシブ制御プログラム２０Ｐは別々のノード１０１に配置されるものの、同一ノード１０１にアクティブ制御プログラム２０Ａとパッシブ制御プログラム２０Ｐが共存することが許容される統合配置が採用され得る。統合配置によれば、例えば、プログラムペア６０−ｖ（ｖは自然数、図２３では、ｖは、１≦ｖ≦３の整数）におけるパッシブ制御プログラム２０Ｐ−ｖは、パッシブ制御プログラム２０Ｐ−ｖが配置されるノード１０１と別のノード１０１であって、プログラムペア６０−（ｖ＋１）におけるアクティブ制御プログラム２０Ａ−（ｖ＋１）が配置されるノード１０１に配置される（（ｖ＋１）が、ｖの最大値を超える場合、（ｖ＋１）＝ｖの最小値である）。統合配置によれば、各ノード１０１において、当該ノード１０１におけるパッシブ制御プログラム２０Ｐがフェイルオーバー先となったときのために、対応するアクティブ制御プログラム２０Ａと同等のリソース量を確保しておく必要があるため、分離配置に比して実効性能は低い。しかし、（Ｎ＋ｍ）ノード群単位に代えてノード単位で増設又は減設が可能である。
【０１５８】
少なくとも１つのノード１０１にクラスタ制御部４５が設けられる。クラスタ制御部４５が、例えばノード１０１の増設を契機に、統合配置から分離配置へのコンバート処理を行うことができる。
【０１５９】
図２４は、クラスタ制御部４５が行うコンバート処理の流れを示す。コンバート処理は、ノード１０１の増設のような所定のコンバート開始イベントが発生した場合に、開始される。また、本コンバート処理では、可用性と実行性能の両立を実現しつつリソース超過を避けるために、コンバート処理後、統合配置は完全な分離配置にならないことがあり得る（すなわず、一部のノード１０１でアクティブ制御プログラム２０Ａとパッシブ制御プログラム２０Ｐが共存し得る）。
【０１６０】
クラスタ制御部４５は、アクティブ制御プログラム２０Ａとパッシブ制御プログラム２０Ｐが同居する全ノード１０１のリストであるノードリストを作成する（Ｓ２４０１）。このため、当該ノードリストには、増設ノード１０１は含まれない。言い換えれば、増設ノード１０１が、各パッシブ制御プログラム２０Ｐの再配置先（移動先）になり得る。
【０１６１】
クラスタ制御部４５は、ノードリストが空か否かを判断する（Ｓ２４０２）。
【０１６２】
Ｓ２４０２の判断結果が偽の場合（Ｓ２４０２：Ｎｏ）、クラスタ制御部４５は、ノードリストの先頭ノードにおける各パッシブ制御プログラム２０Ｐについて、Ｓ２４０３〜Ｓ２４０７を行う。以下、１つの各パッシブ制御プログラム２０Ｐを例に取る（図２４の説明において「対象パッシブ制御プログラム２０Ｐ」と言う）。
【０１６３】
クラスタ制御部４５は、対象パッシブ制御プログラム２０Ｐを、候補プログラム２０Ｐとする（Ｓ２４０３）。
【０１６４】
クラスタ制御部４５は、下記（ｘ１）と（ｘ２）が異なるフォールトセット１８０１か否かを判断する（Ｓ２４０４）。同一の単一障害点が原因で或るフォールトセット１８０１内の全ノード１０１が停止した場合に、当該全ノード１０１における１以上のアクティブ制御プログラム２０Ａをフェイルオーバーすることになるが、フェイルオーバー先のパッシブ制御プログラム２０Ｐが同一のノードに集中しないようにするためである。なお、Ｓ２４０４の判断は、ノード管理テーブル２１００及び制御プログラム管理テーブル４０３を基に行うことができる。
（ｘ１）候補プログラム２０Ｐと同一のプログラムペア６０を構成するアクティブ制御プログラム２０Ａが存在するノード１０１を含んだフォールトセット１８０１。
（ｘ２）既に移動対象とされたパッシブ制御プログラム２０Ｐと同一のプログラムペア６０を構成するアクティブ制御プログラム２０Ａが存在するノード１０１を含んだフォールトセット１８０１。
【０１６５】
Ｓ２４０４の判断結果が偽の場合（Ｓ２４０４：Ｎｏ）、Ｓ２４０３に戻り、次のパッシブ制御プログラムへの処理へ移る。
【０１６６】
Ｓ２４０４の判断結果が真の場合（Ｓ２４０４：Ｙｅｓ）、クラスタ制御部４５は、下記（ｙ１）と（ｙ２）が異なるフォールトセット１８０１か否かを判断する（Ｓ２４０５）。同一プログラムペア６０を構成するアクティブ制御プログラム２０Ａとパッシブ制御プログラム２０Ｐが同一のフォールトセット１８０１に配置されることを避けるためである。なお、Ｓ２４０５の判断は、ノード管理テーブル２１００を基に行うことができる。
（ｙ１）増設ノード１０１を有するフォールトセット１８０１。
（ｙ２）候補プログラム２０Ｐと同一のプログラムペア６０を構成するアクティブ制御プログラム２０Ａが存在するノード１０１を含んだフォールトセット１８０１。
【０１６７】
Ｓ２４０５の判断結果が偽の場合（Ｓ２４０５：Ｎｏ）、Ｓ２４０３に戻り、次のパッシブ制御プログラムへの処理へ移る。
【０１６８】
Ｓ２４０５の判断結果が真の場合（Ｓ２４０５：Ｙｅｓ）、クラスタ制御部４５は、制御プログラム管理テーブル４０３及びノード管理テーブル４０２を基に、増設ノード１０１に候補プログラム２０Ｐを移動するとリソース量超過が生じるか否か（すなわち、増設ノード１０１のノード使用リソース量（例えば、移動対象とされたパッシブ制御プログラム２０Ｐのプログラムリソース量の合計）に候補プログラム２０Ｐのプログラムリソース量が加算されると増設ノード１０１のノード最大リソース量を超えることになるか否か）を判断する（Ｓ２４０６）。
【０１６９】
Ｓ２４０６の判断結果が偽の場合（Ｓ２４０６：Ｎｏ）、クラスタ制御部４５は、候補プログラム２０Ｐを、移動対象プログラム２０Ｐとする（Ｓ２４０７）。
【０１７０】
未処理のパッシブ制御プログラムが存在する場合にはＳ２４０３に戻り、次のパッシブ制御プログラムへの処理へ移る。すべてのパッシブ制御プログラムの処理を終えた場合、ノードリストから先頭ノードを削除し、Ｓ２４０２に戻る。
【０１７１】
Ｓ２４０６の判断結果が真の場合（Ｓ２４０６：Ｙｅｓ）、およびＳ２４０２の判断結果が真の場合（Ｓ２４０６：Ｙｅｓ）、ノードリストの全ノードにおける全パッシブ制御プログラム２０Ｐについて、Ｓ２４０３〜Ｓ２４０７が終わっていなくても、クラスタ制御部４５は、当該処理（ループ（Ａ））を終了し、現時点での各移動対象プログラム２０Ｐについて、Ｓ１５０５〜Ｓ１５０７と同じ処理（図２４のループ（Ｂ））を行うことで、各移動対象プログラム２０Ｐを増設ノード１０１に移動させる。すなわち、当該ループ（Ｂ）では、再配置制御処理（図１６）においてリソース量超過は生じないため、各移動対象プログラム２０Ｐについて制御プログラム移動処理（図１７）が行われる。
【０１７２】
実施例４を基に、例えば、下記のような表現が可能である。
【０１７３】
いずれかのノード１０１が、ノード１０１の増設を契機にプログラム配置のコンバート処理を実行する。コンバート処理前のプログラム配置は、２個以上のプログラムクラスタの各々について、下記、
・アクティブの制御プログラムが、前記複数台のストレージノードのいずれかのストレージノードに配置、
・パッシブの制御プログラムが、当該プログラムクラスタとは別のプログラムクラスタにおけるアクティブの制御プログラムが配置されているストレージノードに配置、
を満たす配置である。コンバート処理は、コンバート処理前のプログラム配置における複数のパッシブの制御プログラムの各々について、下記の（Ｃ１）乃至（Ｃ３）の判断、
（Ｃ１）当該パッシブの制御プログラムと同一のプログラムクラスタを構成するアクティブの制御プログラムが存在するストレージノードを含んだ障害波及範囲と、既に移動対象とされたパッシブの制御プログラムと同一のプログラムクラスタを構成するアクティブの制御プログラムが存在するストレージノードを含んだ障害波及範囲とが異なるか否か、
（Ｃ２）前記増設されたストレージノードを含んだ障害波及範囲と、当該パッシブの制御プログラムと同一のプログラムクラスタを構成するアクティブの制御プログラムが存在するストレージノードを含んだ障害波及範囲とが異なるか否か、及び、
（Ｃ３）当該パッシブの制御プログラムが前記増設されたストレージノードに移動されても、使用される計算リソースのリソース量が最大のリソース量を超えないか否か、
を含む。コンバート処理では、（Ｃ１）乃至（Ｃ３）のいずれの判断の結果も真であるパッシブの制御プログラムが、増設されたストレージノードに移動する移動対象である。
【０１７４】
以上、本発明の幾つかの実施例を説明したが、これらは本発明の説明のための例示であって、本発明の範囲をこれらの実施例にのみ限定する趣旨ではない。例えば、上述の説明を基に、下記の記載が可能である。なお、下記の記載は、上述の説明に無い事項を含んでいてもよい。
【０１７５】
例えば、複数のノード１０１は、各々がＰＤＥＶ１２（記憶デバイスの一例）を有している。アクティブ制御プログラム２０Ａは、自ノード（当該プログラム２０Ａを有するノード）１０１及び他ノード１０１のＰＤＥＶ１２の記憶領域について、Ｉ／Ｏが可能で、複数のノード１０１のＰＤＥＶ１２にデータセットを格納している。アクティブ制御プログラム２０Ａは、データセットを格納した複数のノード１０１のうちの１のノード１０１に格納したデータセットを、他ノード１０１に格納したデータセットから復元可能である。
【０１７６】
ここで、アクティブ制御プログラム２０Ａは、ミラーリングにより、複数のノードに復元可能にデータセットを格納していてよい。すなわち、ミラーデータセットからコピーすることが、「復元」の一例でよい。データセットに含まれる冗長コードを用いて復元してもよい。
【０１７７】
また、パッシブ制御プログラム２０Ｐは、対応するアクティブ制御プログラム２０Ａの障害または停止時にアクティブに変更になり、当該対応するアクティブ制御プログラム２０Ａが扱うデータセットの論理構成を用いて、そのデータセットのＩ／Ｏを行ってもよい。これにより、障害や停止の発生後もＩ／Ｏの継続が可能である。
【０１７８】
当該対応するアクティブ制御プログラム２０Ａと同じノード１０１に格納したデータセットを使用できない場合、アクティブに変更になった制御プログラム２０は、使用ができないデータセットにかかるノード１０１とは異なるノード１０１に格納されたデータセットを用い、そのデータセットまたはそのデータセットから復元したデータセットに対してＩ／Ｏを行ってよい。これにより、Ｉ／Ｏ要求に応答して、ミラーリングの場合は、アクティブに変更になった制御プログラム２０は、他ノード１０１に格納されたデータセットに対しＩ／Ｏを行う。ＲＡＩＤやＲＡＩＮの場合には、制御プログラム２０は、複数の他ノード１０１に分散して格納されたデータセットから復元する。
【０１７９】
更に、当該アクティブに変更された制御プログラム２０は、Ｉ／Ｏが不能になったデータセットを、他ノード１０１に格納しているデータセットから復元し、自ノード１０１に格納してよい。そして、当該制御プログラム２０は、復元前のデータセットについてＩ／Ｏ要求を受けた場合に上記異なるノード１０１に格納されたデータセットを用いてＩ／Ｏを行う。当該制御プログラム２０は、復元が完了したデータセットについてＩ／Ｏ要求を受けた場合に、自ノード１０１に格納されたデータセットを用いてＩ／Ｏを行う。具体的には、例えば、次の通りである。上述したように、フェイルオーバー処理によりアクティブになった制御プログラム２０は、冗長化部２２を経て、データセットにアクセスする。例えば、図２５の例によれば、障害が発生したノード１０１ａにおけるアクティブ制御プログラム２０Ａ−１に関して、ノード１０１ｄの制御プログラム２０Ｐ−１へのフェイルオーバー処理が行われる。このとき、制御プログラム２０Ａ−１が使用していたデータセットＡのミラー先がノード１０１ｂであった場合、アクティブになった制御プログラム２０（２０Ａ−１）は、冗長化部２２ｄを通じて、ノード１０１ｄからノード１０１ｂのデータセットＡにアクセスすることで、Ｉ／Ｏを継続する。しかし、これでは、ノード間通信を必要とするため性能が低下し、且つ、データセットの冗長度も低下したままである。そこで、図２６に示すように、フェイルオーバー元、フェイルオーバー先、及び、マスターのうちのいずれかのノード１０１における冗長化部２２（又はクラスタ制御部）が、フェイルオーバー元のノード１０１ａからミラー先のノード１０１ｂにミラー（バックアップの一例）されたデータセットＡを、当該ミラー先のノード１０１ｂからフェイルオーバー先のノード１０１ｄに復元（コピー）する。これにより、フェイルオーバー先のノード１０１ｄにおける制御プログラム２０（２０Ａ−１）から冗長化部２２ｄを通じてノード間通信無しでＩ／Ｏ可能であり、且つ、冗長度が回復する。これは、ミラー以外の冗長構成（例えばＲＡＩＤやＲＡＩＮ）でも、同様なことができる。
【０１８０】
いずれかの制御プログラム２０は、障害または停止になったアクティブ制御プログラム２０Ａと同じノード１０１に格納されたデータセットを、他のノード１０１に格納したデータセットを用いて復元し、アクティブに変更された制御プログラム２０と同じノード１０１に格納してよい。これにより、別の制御プログラム２０にかかるデータセットでも、障害が起きたノード１０１にデータセットを復元しておくと、冗長度（予備のデーセット）を回復することができる。なお、この段落で言う「いずれかの制御プログラム２０」は、アクティブに変更になる制御プログラム、復元対象のデータセットに紐づけられた制御プログラム、及び、指定された制御プログラム（例えば管理システム２０２又はクラスタ制御部から指定された制御プログラム）、のうちのいずれでもよい。
【符号の説明】
【０１８１】
１０１…ストレージノード
【図１】
2019174875.tif 000003
【図２】
2019174875.tif 000004
【図３】
2019174875.tif 000005
【図４】
2019174875.tif 000006
【図５】
2019174875.tif 000007
【図６】
2019174875.tif 000008
【図７】
2019174875.tif 000009
【図８】
2019174875.tif 000010
【図９】
2019174875.tif 000011
【図１０】
2019174875.tif 000012
【図１１】
2019174875.tif 000013
【図１２】
2019174875.tif 000014
【図１３】
2019174875.tif 000015
【図１４】
2019174875.tif 000016
【図１５】
2019174875.tif 000017
【図１６】
2019174875.tif 000018
【図１７】
2019174875.tif 000019
【図１８】
2019174875.tif 000020
【図１９】
2019174875.tif 000021
【図２０】
2019174875.tif 000022
【図２１】
2019174875.tif 000023
【図２２】
2019174875.tif 000024
【図２３】
2019174875.tif 000025
【図２４】
2019174875.tif 000026
【図２５】
2019174875.tif 000027
【図２６】
2019174875.tif 000028