(57)【要約】クライアントからライト要求を受信する分散ストレージシステムが、複数の電源部から電力供給を受ける複数の計算機を有する。複数の計算機のうち、クライアントからライト要求を受信した計算機である第１計算機が、ライト要求に付随したデータの少なくとも一部である更新データをキャッシュし、当該更新データの転送先として、第１計算機の電源部と異なる電源部から電力供給を受ける計算機のうちのｎ個の計算機（ｎは自然数）であるｎ個の第２計算機を選択し、選択したｎ個の第２計算機に、更新データをそれぞれ転送する。ｎ個の第２計算機のうちの少なくとも１つが、第１計算機からの更新データをキャッシュした場合に結果を第１計算機に返す。
2019049224.tif 000002
【特許請求の範囲】
【請求項１】
クライアントからライト要求を受信する分散ストレージシステムであって、
複数の電源部から電力供給を受ける複数の計算機を有し、
前記複数の計算機のうち、前記クライアントからライト要求を受信した計算機である第１計算機が、
（Ａ）前記ライト要求に付随したデータの少なくとも一部である更新データをキャッシュし、
（Ｂ）前記更新データの転送先として、前記第１計算機の電源部と異なる電源部から電力供給を受ける計算機のうちのｎ個の計算機（ｎは自然数）であるｎ個の第２計算機を選択し、
（Ｃ）前記選択したｎ個の第２計算機に、前記更新データをそれぞれ転送し、
前記ｎ個の第２計算機の少なくとも１つが、
（Ｄ）前記第１計算機からの更新データをキャッシュした場合に結果を前記第１計算機に返す、
分散ストレージシステム。
【請求項２】
前記第１計算機が、
（Ｅ）前記キャッシュされた更新データの永続化に先行して、当該更新データの旧データを、前記ｎ個の第２計算機のうちの、当該更新データに対応したパリティを格納する第２計算機であるパリティ第２計算機に転送する、
請求項１記載の分散ストレージシステム。
【請求項３】
前記第１計算機が、
（Ｆ）（Ｅ）の後に、前記キャッシュされた更新データを永続化し、かつ、パリティ更新依頼を前記パリティ第計算機に送信し、
前記パリティ第２計算機が、前記第１計算機からのパリティ更新依頼に応答して、当該パリティ第２計算機においてキャッシュされている前記旧データおよび前記更新データと、当該更新データに対応する旧パリティとを用いて、当該旧パリティの更新後のパリティである更新後パリティを生成する、
請求項２記載の分散ストレージシステム。
【請求項４】
第１の方式であるライトバックが採用される場合、（Ｂ）乃至（Ｄ）が行われ、
第２の方式であるライトスルーが採用される場合、（Ｂ）乃至（Ｄ）に代えて、
前記第１計算機が、
（Ｇ）前記キャッシュされた更新データを永続化し、
（Ｈ）当該更新データと当該更新データに対応する旧データとを用いて中間パリティを生成し、
（Ｉ）前記中間パリティを、前記更新データに対応したパリティを格納する第２計算機であるパリティ第２計算機に転送し、
前記パリティ第２計算機は、
（Ｊ）前記第１計算機からの前記中間パリティと前記更新データに対応した旧パリティとを用いて更新パリティを生成し前記更新パリティを永続化した場合に、結果を前記第１計算機に返す、
請求項１記載の分散ストレージシステム。
【請求項５】
（Ａ）でキャッシュされた更新データが、１つのストライプに格納される全ての更新データの場合、当該全ての更新データの各々について、（Ｂ）乃至（Ｄ）が行われ、
前記第１計算機は、更に、
（Ｋ）前記全ての更新データを用いてパリティを生成し、
（Ｌ）前記パリティを、前記全ての更新データに対応したパリティを格納する第２計算機であるパリティ第２計算機に転送し、
前記パリティ第２計算機が、
（Ｍ）前記第１計算機からの前記パリティをキャッシュした場合に結果を前記第１計算機に返す、
請求項１記載の分散ストレージシステム。
【請求項６】
（Ａ）でキャッシュされた更新データが、１つのストライプに格納される全ての更新データであり、第１の方式であるライトバックが採用される場合、当該全ての更新データの各々について（Ｂ）乃至（Ｄ）が行われ、かつ、（Ｋ）乃至（Ｍ）が行われ、
（Ａ）でキャッシュされた更新データが、１つのストライプに格納される全ての更新データであり、第２の方式であるライトスルーが採用される場合、当該全ての更新データの各々について（Ｂ）乃至（Ｄ）が行われ、かつ、（Ｋ）乃至（Ｍ）が行われることに代えて、
前記第１計算機は、
（Ｎ）前記全ての更新データのうちの一の更新データを永続化し、
（Ｏ）前記全ての更新データのうちの前記一の更新データ以外の更新データの各々について、
（ｏ１）当該更新データの転送先として、前記第１計算機の電源部と異なる電源部から電力供給を受ける計算機のうちのｎ個の計算機（ｎは自然数）であるｎ個の第２計算機を選択し、
（ｏ２）前記選択したｎ個の第２計算機に、前記更新データをそれぞれ転送し、
前記ｎ個の第２計算機のうちの少なくとも１つが、
（ｏ３）前記第１計算機からの前記更新データを永続化した場合に結果を前記第１計算機に返し、
前記第１計算機が、
（Ｐ）前記全ての更新データを用いてパリティを生成し、
（Ｑ）前記パリティを、前記全ての更新データに対応したパリティを格納する第２計算機であるパリティ第２計算機に転送し、
前記パリティ第２計算機が、
（Ｒ）前記第１計算機からの前記パリティを永続化した場合に結果を前記第１計算機に返す、
請求項５記載の分散ストレージシステム。
【請求項７】
前記複数の電源部に属する計算機の数が均等である、
請求項１記載の分散ストレージシステム。
【請求項８】
前記複数の電源部は、１以上の電源と、複数のサブ電源である、
請求項１記載の分散ストレージシステム。
【請求項９】
（Ｂ）は、下記（ｂ１）乃至（ｂ３）である、
（ｂ１）前記第１計算機の電源と異なる電源から電力供給を受ける計算機のうち、前記更新データの転送先として選択可能な計算機が少なくとも１つあるか否かを判断すること、
（ｂ２）（ｂ１）の判断結果が真の場合、前記第１計算機の電源と異なる電源から電力供給を受けるノードから、転送先とするノードを選択すること、および、
（ｂ３）（ｂ１）の判断結果が偽の場合、または、（ｂ２）で選択されたノード数がｎに満たない場合、前記第１計算機の電源と同じ電源の計算機ではあるが、サブ電源が前記第１計算機と異なる計算機を、転送先として、転送先ノード数がｎとなるように、選択する、
請求項１記載の分散ストレージシステム。
【請求項１０】
前記永続化タイミングは、前記第１計算機におけるＩ／Ｏ負荷に基づいて前記第１計算機により推定されたタイミングである、
請求項２記載の分散ストレージシステム。
【請求項１１】
１つのストライプに対応した全ての更新データを異なる複数の第１計算機がキャッシュしている場合、前記複数の第１計算機の各々が、（Ｂ）乃至（Ｃ）を行い、
前記複数の第１計算機の各々について、前記ｎ個の第２計算機が、当該ストライプに対応したパリティを格納する第２計算機であり、前記複数の第１計算機のいずれとも電源部が異なる第２計算機であるパリティ第２計算機を含み、
前記パリティ第２計算機が、前記全ての更新データを用いてパリティを生成する、
請求項１記載の分散ストレージシステム。
【請求項１２】
ストライプによって異なる計算機がパリティ第２計算機である、
請求項１１記載の分散ストレージシステム。
【請求項１３】
クライアントからライト要求を受信する分散ストレージシステムを構成する複数の計算機のうちのいずれかの計算機である第１計算機で実行されるプログラムであって、
（Ａ）前記クライアントからのライト要求に付随したデータの少なくとも一部である更新データをそのメモリ部にキャッシュし、
（Ｂ）前記更新データの転送先として、前記第１計算機の電源部と異なる電源部から電力供給を受ける計算機のうちのｎ個の第２計算機（ｎは自然数）を選択し、
（Ｃ）前記選択したｎ個の第２計算機に、前記更新データをそれぞれ転送し、
（Ｄ）前記ｎ個の第２計算機の少なくとも１つに転送された更新データが当該第２計算機においてキャッシュされた場合に、当該第２計算機から結果を受信する、
ことを前記第１計算機に実行させるコンピュータプログラム。
【請求項１４】
クライアントからライト要求を受信する分散ストレージシステムで行われる分散記憶制御方法であって、
（Ａ）第１計算機が、前記クライアントからのライト要求に付随したデータの少なくとも一部である更新データをそのメモリ部にキャッシュし、
（Ｂ）前記第１計算機が、前記更新データの転送先として、前記第１計算機の電源部と異なる電源部から電力供給を受ける計算機のうちのｎ個の第２計算機（ｎは自然数）を選択し、
（Ｃ）前記第１計算機が、前記選択したｎ個の第２計算機に、前記更新データをそれぞれ転送し、
（Ｄ）前記ｎ個の第２計算機のうちの少なくとも１つが、前記第１計算機からの更新データをキャッシュした場合に結果を前記第１計算機に返す、
分散記憶制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、概して、分散ストレージシステムでの記憶制御に関する。
【背景技術】
【０００２】
複数の計算機（ノード）を、ストレージ機能を提供するソフトウェアを用いて連携することにより、分散ストレージシステムを構成するＳＤＳ（Software Defined Storage）が知られている。【０００３】
ＳＤＳに関する技術として、特許文献１には、複数のノード間でデータの複製を不揮発な記憶デバイスであるＳＳＤ（Solid State Drive）上に保持することで、データ書き込み処理におけるノード間のデータの冗長化を実現する手法が開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】米国特許第９３３６１３２号
【発明の概要】
【発明が解決しようとする課題】
【０００５】
分散ストレージシステムは、データを冗長化することで、データ保護を行う。この時、ノード間でデータ転送を実施し、かつノード毎にデータを永続化してから（つまり、データを不揮発記憶装置に書き込んでから）、クライアントへ応答する。そのため、クライアントへの書き込み応答性能の悪化が問題となる。【０００６】
また、例えば、特許文献１のようなストレージシステムの場合、データを冗長化するために、更新データとその複製を、ＳＳＤをキャッシュとして持つ複数のノードに二重化する。そのため、ライトスルー書き込み（ＳＳＤのような不揮発記憶デバイスにデータを書き込んでからライト完了を応答する書き込み）と同等の書き込み応答性能の悪化が問題となる。【０００７】
書き込み応答性能の悪化は、ＳＤＳを利用する分散ストレージシステム以外の分散ストレージシステムについてもあり得る。
【課題を解決するための手段】
【０００８】
クライアントからライト要求を受信する分散ストレージシステムが、複数の電源部から電力供給を受ける複数の計算機を有する。複数の計算機のうち、クライアントからライト要求を受信した計算機である第１計算機が、ライト要求に付随したデータの少なくとも一部である更新データをキャッシュし、当該更新データの転送先として、第１計算機の電源部と異なる電源部から電力供給を受ける計算機のうちのｎ個の計算機（ｎは自然数）であるｎ個の第２計算機を選択し、選択したｎ個の第２計算機に、更新データをそれぞれ転送する。ｎ個の第２計算機のうちの少なくとも１つが、第１計算機からの更新データをキャッシュした場合に結果を第１計算機に返す。すなわち、第１計算機は、ｎ個の第２計算機の全てにおいて更新データがキャッシュされたことを待たなくてよい。
【発明の効果】
【０００９】
電源部の障害等による電断が生じてもデータ消失を防ぐことと、クライアントに対する書き込み応答時間を短縮することとの両方を実現できる。
【図面の簡単な説明】
【００１０】
【図１】実施例１におけるデータ書き込み処理の概要を示す。
【図２】分散ストレージシステムの構成を示す。
【図３】ドメインの構成を示す。
【図４】ノードの構成を示す。
【図５】管理情報内のテーブルを示す。
【図６】ライトスルー書き込み処理の概要を示す。
【図７】フルストライプ書き込み処理の概要を示す。
【図８】データ書き込み処理の処理フローを示す。
【図９】ライトバック書き込みの処理フローを示す。
【図１０】旧データ転送処理の処理フローを示す。
【図１１】データノードのデステージ処理の処理フローを示す。
【図１２】パリティノードのデステージ処理の処理フローを示す。
【図１３】ライトスルー書き込み処理の処理フローを示す。
【図１４】フルストライプライトバック書き込み処理の処理フローを示す。
【図１５】フルストライプライトスルー書き込み処理の処理フローを示す。
【図１６】ノード追加処理の処理フローを示す。
【図１７】ノード削除処理の処理フローを示す。
【図１８】実施例２におけるドメインの構成を示す。
【図１９】実施例２における電源系統構成管理テーブルを示す。
【図２０】実施例３における旧データ転送処理の概要を示す。
【図２１】実施例４におけるデータ書き込み処理の概要を示す。
【発明を実施するための形態】
【００１１】
以下では、幾つかの実施例を、図面を参照して説明する。
【００１２】
なお、以下の説明では、「ａａａテーブル」の表現にて各種情報を説明することがあるが、各種情報は、テーブル以外のデータ構造で表現されていてもよい。データ構造に依存しないことを示すために「ａａａテーブル」を「ａａａ情報」と呼ぶこともできる。
【００１３】
また、以下の説明では、「インターフェース部」は、１以上の通信インターフェースデバイスを含んでよい。１以上の通信インターフェースデバイスは、１以上の同種の通信インターフェースデバイス（例えば１以上のＮＩＣ（Network Interface Card））であってもよいし２以上の異種の通信インターフェースデバイス（例えばＮＩＣとＨＢＡ（Host Bus Adapter））であってもよい。また、以下の説明において、各テーブルの構成は一例であり、１つのテーブルは、２以上のテーブルに分割されてもよいし、２以上のテーブルの全部または一部が１つのテーブルであってもよい。
【００１４】
また、以下の説明では、「ＰＤＥＶ」は、物理的な不揮発性の記憶デバイス（例えば補助記憶デバイス）、例えば、不揮発性メモリ、ＨＤＤ（Hard Disk Drive）またはＳＳＤ（Solid State Drive）である。
【００１５】
また、以下の説明では、「記憶部」は、メモリ部およびＰＤＥＶ部のうちの少なくともメモリ部を含む。「ＰＤＥＶ部」は、１以上のＰＤＥＶを含む。「メモリ部」は、１以上のメモリを含む。少なくとも１つのメモリは、揮発性メモリであってもよいし不揮発性メモリであってもよい。記憶部は、主に、プロセッサ部による処理の際に使用される。
【００１６】
また、以下の説明では、「プロセッサ部」は、１以上のプロセッサを含む。少なくとも１つのプロセッサは、ＣＰＵ（Central Processing Unit）でよい。プロセッサ部は、処理の一部または全部を行うハードウェア回路を含んでもよい。
【００１７】
また、以下の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサ部（例えばＣＰＵ（Central Processing Unit））によって実行されることで、定められた処理を、適宜に記憶部（例えばメモリ）及び／又はインターフェース部（例えばポート）を用いながら行うため、処理の主語がプログラムとされてもよい。プログラムを主語として説明された処理は、プロセッサ部或いはそのプロセッサ部を有する計算機（例えば、ノード）が行う処理としてもよい。また、コントローラ（ストレージコントローラ）は、プロセッサ部それ自体であってもよいし、コントローラが行う処理の一部又は全部を行うハードウェア回路を含んでもよい。プログラムは、プログラムソースから各コントローラにインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバ又はコンピュータ読取可能な（例えば非一時的な）記憶メディアであってもよい。また、以下の説明において、２以上のプログラムが１つのプログラムとして実現されてもよいし、１つのプログラムが２以上のプログラムとして実現されてもよい。
【００１８】
また、以下の説明では、要素の識別情報として、ＩＤが使用されるが、それに代えて又は加えて他種の識別情報が使用されてもよい。
【００１９】
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号における共通番号を使用し、同種の要素を区別して説明する場合は、その要素の参照符号を使用することがある。
【００２０】
また、以下の説明では、分散ストレージシステムは、１以上の物理的な計算機（ノード）を含む。１以上の物理的な計算機は、物理的なサーバと物理的なストレージとのうちの少なくとも１つを含んでよい。少なくとも１つの物理的な計算機が、仮想的な計算機（例えばＶＭ（Virtual Machine））を実行してもよいし、ＳＤｘ（Software-Defined anything）を実行してもよい。ＳＤｘとしては、例えば、ＳＤＳ（Software Defined Storage）（仮想的なストレージ装置の一例）またはＳＤＤＣ（Software-defined Datacenter）を採用することができる。
【００２１】
また、以下の説明では、複数のノードで冗長構成グループを形成することができる。冗長構成の例としては、Erasure Coding、ＲＡＩＮ（Redundant Array of Independent Nodes）、ノード間ミラーリング、ノードを１つのドライブとみなしたＲＡＩＤ（Redundant Array of Independent (or Inexpensive) Disks）などがあり、いずれでもよい。その他の方式（ノード間で冗長構成グループを構成する方式）が採用されてもよい。従って、以下の説明では、「冗長構成グループ」は、２以上のノードがそれぞれ提供する２以上の記憶領域で構成されデータを記憶するグループでよい。
【００２２】
また、以下の説明における複数種類の記憶領域の各々の定義は、下記の通りである。
・「冗長構成領域」とは、冗長構成グループが提供する論理記憶領域である。
・「ノード領域」とは、複数のノードの各々が提供する論理記憶領域である。複数のノードがそれぞれ提供する複数のノード領域が、冗長構成領域を構成する。
・「ストリップ」とは、ノード領域の一部である。ストリップは、ユーザデータセットまたはパリティを格納する。ユーザデータセットが格納されるストリップを「ユーザストリップ」と言うことができ、パリティが格納されるストリップを「パリティストリップ」と言うことができる。なお、「ユーザデータセット」は、ライト要求に付随するユーザデータ（ライト対象データ）の少なくとも一部としてのユーザデータユニットの一部である。「ユーザデータユニット」は、ストライプに対応した全ユーザデータセットの集合である。「データセット」とは、１つのストリップに格納されるデータであり、以下の説明では、ユーザデータセットまたはパリティである。つまり、データセットとは、ストリップ単位のデータである。
・「ストライプ」とは、冗長構成領域における２以上のノード領域にそれぞれ存在する２以上のストリップ（例えば同一論理アドレスの２以上のストリップ）で構成された記憶領域である。ストライプ毎に１以上のパリティが用意されてよい。
【００２３】
以下の説明において、「ユーザデータ」及び「パリティ」は、データセットの意味で使用するが、データセットよりも大きなサイズのデータ（例えばファイル）であってもよい。
【００２４】
また、以下の説明において、「キャッシュメモリ」は、典型的には揮発性であり、プログラムや管理情報が格納されるメモリ（典型的には揮発性メモリ）上に設けられた一部領域であるが、当該メモリとは別に設けられたメモリであってもよい。
【実施例１】
【００２５】
図１は、実施例１におけるデータ書き込み処理の概要を示すブロック図である。なお、本実施例において、「複製元」および「複製先」は、「転送元」および「転送先」の一例である。また、複製先は、更新データに対応したパリティの格納先とされているノードでよい。【００２６】
クライアント（１０１）は、ユーザがストレージ機能を利用するためのデバイス（計算機）である。クライアント（１０１）は、例えば、デスクトップ計算機でもよいし、サーバでもよいし、スマートフォンのような携帯端末でもよい。クライアント（１０１）は、ストレージクラスタを構成する全ノードとネットワーク経由で接続される。【００２７】
ノード（２０３）は、データ管理機能とパリティ管理機能を有する。データ管理機能は、クライアントのデータを格納する機能である。データ管理機能は、例えば、ノードのもつ記憶装置にデータを書き込みことでデータを永続化する処理や、データを他のノードに転送し複製することで冗長化する処理を行う。パリティ管理機能は、ＲＡＩＤやErasure Cordingのようなデータ保護を実現する機能である。パリティ管理機能は、例えば、クライアント（１０１）からのデータをもとにパリティを生成し、生成したパリティを格納する。また、パリティ管理機能は、例えば、そのノードのもつデータや他のノードから受信したデータをもとに、パリティを生成し、生成したパリティをノードのもつ記憶装置に書き込みことで、データ保護を実現する。本実施例では、あるノードがデータ管理機能を実行するとき、そのノードに対応するパリティ管理機能を実行するノードが存在する。また、全ノード（２０３）の各々は、データ管理機能とパリティ管理機能の両方を有してもよい。なお、ノード（２０３）は、ストレージクラスタ、およびドメインと呼ばれる複数のノードの集合に属する。ストレージクラスタと、ドメインとの詳細は後述する。【００２８】
また、ノード（２０３）は、電源（２４１）をもつ。電源（２４１）は、ノード（２０３）内の要素のうち少なくともキャッシュメモリ（１２１）に電力を供給する。従って、電源（２４１）が故障する等によって電断が生じると、キャッシュメモリ（１２１）内のデータが消失する。【００２９】
いずれの電源（２４１）がいずれのドメインに存在するかといったような電源配置構成は、ノード（２０３）が有する管理情報（２８４）により管理される。本実施例では、クライアント（１０１）からデータのライト要求を受信したノード（２０３Ａ）は、当該ノード（２０３Ａ）が有する管理情報（２８４Ａ）をもとに、当該データの複製先ノードとして、当該データを受信したノード（２０３Ａ）の電源（２４１Ａ）と異なる（別の）電源（２４１Ｂ）を持つノード（２０３Ｂ）を選択する。選択された複製先ノード（２０３Ｂ）は、転送されたデータを受信し当該データをキャッシュメモリ（１２１Ｂ）に書き込んだときに、完了応答を、複製元（転送元）のノード（２０３Ａ）に返す。ノード（１０１Ａ）は、完了応答を受信した場合、ライト要求に対する完了応答をクライアント１０１に返す。これにより、書き込み応答性能を向上できる。また、更新データ（Ｄ１´）の永続化の前にノード（２０３Ａ）および（２０３Ｂ）の一方で電断が生じても、当該更新データ（Ｄ１´）の消失を防ぐことができる。なぜなら、ノード（２０３Ａ）および（２０３Ｂ）の電源（２４１）は異なっているので、一方のノードで電断が生じても他方のノードで当該データが消失せず残っているためである。【００３０】
クライアント、データノード、およびパリティノードは、ＳＡＮ（Storage Area Network）やＬＡＮ（Local Area Network）等のネットワークを介して接続される。なお、「データノード」は、ユーザデータを格納するノードである。「パリティノード」は、パリティを格納するノードである。データノードとなるノードや、パリティノードとなるノードは、ストライプに関わらず同じであってもよいし（例えば、いずれのストライプについてもノード（２０３Ｂ）がパリティノードであってもよいし）、ストライプによって異なっていてもよい（例えば、あるストライプについてはノード（２０３Ｂ）がパリティノードであって、別のストライプについてはノード（２０３Ａ）がパリティノードであってもよい）。【００３１】
データ書き込み処理は、ライトバック書き込み処理、旧データ先行転送処理、およびデステージ処理の３つの処理からなる。図１を用いて、各処理の処理流れの一例を説明する。なお、図１のノード（２０３Ａ）はデータ管理機能の処理を、ノード（２０３Ｂ）はパリティ管理機能の処理を実行する。【００３２】
＜ライトバック書き込み処理＞【００３３】
ライトバック書き込み処理は、クライアント（１０１）からの更新データ（Ｄ１´）を、複製元ノード（２０３Ａ）内のキャッシュメモリ（１２１Ａ）と、複製先ノード（２０３Ｂ）内のキャッシュメモリ（１２１Ｂ）とに格納する処理、つまり、異なるノード（２０３）において二重化する処理である。ライトバック書き込み処理は、クライアント（１０１）が、更新データ（Ｄ１´）のライト要求を、ノード（２０３Ａ）に対しネットワーク経由で転送し（１５１）、ノード（２０３Ａ）がそのライト要求を受信したことを契機に開始する。なお、「更新データ」は、更新後のユーザデータである。ライト要求は、更新データを管理するノードを一意に識別するノードＩＤと、ノードＩＤのノードがもつ記憶装置（２０６）を一意に識別する記憶装置ＩＤと、更新データのサイズと、更新データの書き込み位置といった、データ書き込み処理に必要な情報を含んでいる。【００３４】
ライトバック書き込み処理は、以下の処理を含む。【００３５】
すなわち、ノード（２０３Ａ）は、クライアント（１０１）からのライト要求中の情報（データ書き込み処理に必要な情報）を元に、ノード（２０３Ａ）のもつキャッシュメモリ（１２１Ａ）へ更新データ（Ｄ１´）を登録（１３２）する。【００３６】
その後、ノード（２０３Ａ）は、管理情報（２８４Ａ）を参照し、その更新データ（Ｄ１´）の複製先ノードとして、電源（２４１Ａ）と異なる電源（２４１Ｂ）から電力供給を受けるノード（２０３Ｂ）を選択する。ノード（２０３Ａ）は、選択したノード（２０３Ｂ）へ更新データ（Ｄ１´）を転送（１５２）する。管理情報（２８４）は、ドメイン毎の全ノードのノードＩＤと、ストライプ毎のデータ配置（データ及びパリティの位置）といった情報を含む。本実施例では、ドメイン毎に電源（２４１）が存在するため、ドメインが異なれば、電源（２４１）も異なる。言い換えれば、本実施例では、ドメインが電源（２４１）の電力供給範囲に相当する。【００３７】
次に、ノード（２０３Ｂ）は、ノード（２０３Ａ）から転送された更新データ（Ｄ１´）を受信し、キャッシュメモリ（１２１Ｂ）へ更新データ（Ｄ１´）を登録（１３３）する。更新データ（Ｄ１´）をキャッシュメモリ（１２１Ｂ）に登録した場合に、ノード（２０３Ｂ）は、結果（完了応答）をノード（２０３Ａ）へ返却（１５３）する。【００３８】
最後に、ノード（２０３Ａ）は、ノード（２０３）からの結果を受信する。その結果を受信した場合に、ノード（２０３Ａ）は、クライアント（１０１）へ、受信したライト要求の結果（完了応答）を返却（１５４）する。【００３９】
以上により、クライアント（１０１）からの更新データ（Ｄ１´）が、データノード（２０３Ａ）内のキャッシュメモリ（１２１Ａ）と、パリティノード（２０３Ｂ）内のキャッシュメモリ（１２１Ｂ）とに二重化されるが、キャッシュメモリ（１２１Ｂ）に更新データ（Ｄ１´）が書かれた場合に結果が返るので、クライアント（１０１）への書き込み応答時間を短縮できる。また、データノード（２０３Ａ）の電源（２４１Ａ）と、パリティノード（２０３Ｂ）の電源（２４１Ｂ）は、分離された異なる電源であるため、更新データ（Ｄ１´）の永続化の前に一方のノードで電断が生じても他方のノードに更新データ（Ｄ１´）が存在する。【００４０】
＜旧データ先行転送処理＞【００４１】
旧データ先行転送処理は、更新データの複製先ノードに更新データに対応した旧データをデステージ処理の前に転送する処理である【００４２】
旧データ先行転送処理は、以下の処理を含む。【００４３】
すなわち、ノード（２０３Ａ）が、適切なタイミングで、ノード（２０３Ａ）のもつ更新データ（Ｄ´）の旧データ（更新前のデータ）（Ｄ１）を、記憶装置（２０６Ａ）から読み込み（１５５）、読み込んだ旧データ（Ｄ１）をキャッシュメモリ（１２１Ａ）に登録（１３５）する。ノード（２０３Ａ）は、当該旧データ（Ｄ１）を、更新データ（Ｄ１´）の複製先ノード（２０３Ｂ）へ転送（１５６）する。旧データ（Ｄ１）を転送する適切なタイミングの例として、更新データ（Ｄ１´）の複製元ノード（２０３Ａ）のもつキャッシュメモリ（１２１Ａ）の使用領域が閾値を超過するなどが原因でメモリ解放行う必要がある場合や、キャッシュメモリ（１２１Ａ）の更新データ（Ｄ１´）を記憶装置（２０６Ａ）にデステージする場合などがある。【００４４】
次に、ノード（２０３Ｂ）は、ノード（２０３Ａ）から旧データ（Ｄ１）を受信し、キャッシュメモリ（１２１Ｂ）に旧データ（Ｄ１）を登録（１３６）する。【００４５】
以上により、複製元ノード（２０３Ａ）のキャッシュメモリ（１２１Ａ）に登録されている更新データ（Ｄ１´）を記憶装置（２０６Ａ）にデステージ（格納）する処理において、更新データ（Ｄ１´）に対応する旧パリティ（Ｐ）の更新処理に必要な旧データ（Ｄ１）の転送が不要となるため、そのデステージ処理の処理時間を短縮でき、パリティノード（２０３Ｂ）のキャッシュメモリ（１２１Ｂ）に登録されている更新データ（Ｄ１´）のメモリ解放時間を短縮できる。なお、「旧パリティ」とは、旧データに対応した更新前のパリティである。【００４６】
＜デステージ処理＞【００４７】
デステージ処理は、クライアント（１０１）からのライト要求に応答して行うデータ書き込み処理とは非同期に行われる処理でよく、キャッシュメモリ（１２１）内のダーティデータ（記憶装置（２０６）に格納されていないデータ）を記憶装置（２０６）に格納する処理である。ノード（２０３Ａ）が、適切なタイミングでデステージ処理を開始する。【００４８】
デステージ処理は、以下の処理を含む。【００４９】
ノード（２０３Ａ）が、キャッシュメモリ（１２１Ａ）内の更新データ（Ｄ１´）を、記憶装置（２０６Ａ）に書き込み（１５７）、キャッシュメモリ（１２１Ａ）から更新データ（Ｄ１´）の使用領域を解放する。【００５０】
次に、ノード（２０３Ａ）は、管理情報（２８４Ａ）を参照し、その更新データ（Ｄ１´）の格納先ストライプに対応する旧パリティ（Ｐ）をもつノード（２０３Ｂ）を特定し、特定したノード（２０３Ｂ）へパリティ更新依頼を転送する（５０）。パリティ更新依頼は、更新データ（Ｄ１´）の格納先ストライプのＩＤと、旧パリティ（Ｐ）の位置とのうちの少なくとも１つを含む。【００５１】
次に、ノード（２０３Ｂ）は、ノード（２０３Ａ）からのパリティ更新依頼を受信する。ノード（２０３Ｂ）は、そのパリティ更新依頼に応答して、更新データ（Ｄ１´）に対応する旧パリティ（Ｐ）を、記憶装置（２０６Ｂ）から読み込み（１５８）、その旧パリティ（Ｐ）をキャッシュに登録（１３９）する。ノード（２０３Ｂ）は、キャッシュメモリ（１２１Ｂ）上の更新データ（Ｄ１´）、旧データ（Ｄ１）、および、旧パリティ（Ｐ）の３つのデータから、旧パリティ（Ｐ）の更新後のパリティである更新パリティ（Ｐ´）を生成（１５９）し、更新パリティ（Ｐ´）を、記憶装置（２０６Ｂ）に格納する（１４１）。その後、ノード（２０３Ｂ）は、パリティ更新依頼の結果（完了応答）を、ノード（２０３Ａ）に返却する（５１）。【００５２】
以上が、データ書き込み処理の概要である。以下、本実施例を詳細に説明する。【００５３】
図２は、本実施例における分散ストレージシステムの概略構成を示すブロック図である。【００５４】
分散ストレージシステムは、少なくとも１つのストレージクラスタ（２０１）を有する。少なくとも１つのクライアント（１０１）が、ネットワーク（２１１）経由で、ストレージクラスタ（２０１）に接続される。２以上のストレージクラスタがある場合は、複数のストレージクラスタ間でシステムの冗長化を実現できる。【００５５】
クライアント（１０１）は、ストレージクラスタ（２０１）が提供するストレージサービスを利用するために、ユーザが使用する計算機である。クライアント（１０１）は、ストレージサービスをネットワーク（２１１）経由で利用するために必要なソフトウェアとハードウェアとを含む。【００５６】
ネットワーク（２１１）は、クライアント（１０１）と、ストレージクラスタ（２０１）とを相互に接続する通信網である。例えば、ネットワーク（２１１）は、ＬＡＮ、ＳＡＮ、Ethernet（登録商標）、InfiniBand（登録商標）、Fibre Channel、などなんでもよい。【００５７】
ストレージクラスタ（２０１）は、クライアント（１０１）に対してストレージサービスを提供するシステムである。ストレージクラスタ（２０１）は、少なくとも１つのドメイン（２０２）と、少なくとも１つの管理用サーバ（２２１）を含む。【００５８】
ドメイン（２０２）は、少なくとも１つのネットワークにより相互接続される。図示の例では、フロントエンドネットワーク（２１２）とバックエンドネットワーク（２１３）の２つのネットワークにより相互接続されている。ドメインの構成は、後述する。【００５９】
フロントエンドネットワーク（２１２）は、クライアント（１０１）とストレージクラスタ（２０１）を接続するネットワーク（２１１）と接続される通信網である。これにより、クライアント（１０１）は、ストレージクラスタ（２０１）内の全ドメイン（２０２）とネットワーク接続される。フロントエンドネットワーク（２１２）は、ネットワーク（２１１）と同じ種類の通信網でよい。【００６０】
バックエンドネットワーク（２１３）は、ドメイン間のみで接続される通信網である。バックエンドネットワーク（２１３）は、ネットワーク（２１１）と同じ種類の通信網でよい。【００６１】
管理用サーバ（２２１）は、ストレージクラスタ（２０１）を管理するための計算機である。管理用サーバ（２２１）は、ストレージクラスタ（２０１）に存在するすべてのドメイン（２０２）とフロントエンドネットワーク（２１２）を介し接続される。管理用サーバ（２２１）とドメイン（２０２）を接続するネットワークは、フロントエンドネットワーク（２１２）に代えてまたは加えて、バックエンドネットワーク（２１３）、専用回線、または他の通信回線や通信デバイスでもよい。管理用サーバ（２２１）は、管理システムの一例でよい。「管理システム」は、１以上の計算機で構成されてよい。具体的には、例えば、管理計算機が表示デバイスを有していて管理計算機が自分の表示デバイスに情報を表示する場合、管理計算機が管理システムでよい。また、例えば、管理計算機（例えばサーバ）が表示用情報を遠隔の表示用計算機（例えばクライアント）に送信し表示用計算機がその情報を表示する場合（管理計算機が表示用計算機に情報を表示する場合）、管理計算機と表示用計算機とのうちの少なくとも管理計算機を含んだシステムが管理システムでよい。管理用サーバ（２２１）は、インターフェース部と、記憶部と、それらに接続されたプロセッサ部とを有してよい。記憶部が、ノード管理プログラム（２０）を記憶し、プロセッサ部が、ノード管理プログラム（２０）を実行してよい。管理用サーバ（２２１）（管理システムの一例）は、ストレージクラスタ（２０１）のドメイン（２０２）に属してもよいし、ドメイン（２０２）に属するノード（２０３）であってもよい。これにより、ストレージクラスタ（２０１）に、管理用の専用サーバを設置する必要がなく、ストレージクラスタ（２０２）内の全ノード（２０３）について、専用機能を意識せずに透過的に構成できるようになる。【００６２】
上述したノード（２０３Ａ）は、ドメイン（２０２Ａ）内のノードであり、上述したノード（２０３Ｂ）は、ドメイン（２０２Ｂ）内のノードである。以下の説明では、いずれのノードやノード内要素が、いずれのドメインやいずれのノードに存在するかを分かり易くするために、ドメイン（２０２α）（αは、Ａ、Ｂ、Ｃ、…）内のノードの参照符号の末尾を、“α”とし、ノード（２０３α）内の要素の参照符号の末尾も、“α”とすることがある。【００６３】
図３は、ドメインの構成を示すブロック図である。【００６４】
ドメイン（２０２）は、少なくとも１つの電源（２４１）と、少なくとも１つのノード（２０３）と、を含む。【００６５】
電源（２４１）は、同ドメイン（２０２）内のノード（２０３）に電力を供給する。電源（２４１）は、ドメイン（２０２）毎に少なくとも１つ用意される。ドメイン（２０２）内のすべてのノード（２０３）は、そのノード（２０３）の属するドメイン（２０２）のもつ電源（２４１）に接続される。このため、ドメイン（２０２）の使用する電源（２４１）が障害等を理由に機能不能となった場合でも、他のドメイン（２０２）の使用する電源はその影響を受けない。これにより、異なるドメイン（２０２）に属するノード間のキャッシュメモリ上にデータを二重化することで、データを冗長化できる。【００６６】
ノード（２０３）は、ストレージサービスを実現する計算機である。本実施例では、ノード（２０３）は、物理計算機であるが、ノードは、ＶＭなどの仮想計算機であってもよい。ノードは、そのノードが属するドメイン（２０２）の電源（２４１）と接続される。ノード（２０３）は、ネットワークを介して、クライアント（１０１）と、ストレージクラスタ（２０１）内の全ドメイン内の全ノードと、相互接続される。本実施例では、ノード（２０３）は、フロントエンドネットワーク（２１２）と、バックエンドネットワーク（２１３）とを介して相互接続されている。ノードは、データ管理機能を有するノードと、パリティ管理機能を有するノードの二種類がある。なお、ノード（２０３）としては、データ管理機能のみを有するノード、パリティ管理機能のみを有するノード、または、データ管理機能とパリティ管理機能の両方の機能を有するノードがあってもよい。少なくとも１つのノード（２０３）が管理用サーバ（２２１）としての機能を有してもよい。【００６７】
図４は、ノードの構成を示すブロック図である。【００６８】
ノード（２０３）は、ストレージコントローラ（２０５）と、記憶装置（２０６）と、電源系統ＩＦ（２０７）から構成される。ストレージコントローラ（２０５）、記憶装置（２０６）および電源系統ＩＦ（２０７）の少なくとも１つは、２つ以上の冗長化構成でもよい。【００６９】
ストレージコントローラ（２０５）は、フロントエンドＮＷ−ＩＦ（２５１）と、バックエンドＮＷ−ＩＦ（２５２）と、メモリ（２５４）と、記憶装置ＩＦ（２５５）と、それらに接続されたＣＰＵ（２５３）とを含む。【００７０】
フロントエンドＮＷ−ＩＦ（２５１）は、ノード（２０３）とフロントエンドネットワーク（２１２）との接続に利用される通信インターフェースデバイスである。バックエンドＮＷ−ＩＦ（２５２）は、ノード（２０３）とバックエンドネットワーク（２１３）との接続に利用される通信インターフェースデバイスである。【００７１】
メモリ（２５４）は、ノードがストレージクラスタの提供するストレージサービスを実現するために必要なプログラムおよび管理情報（２８４）を記憶する。プログラムとしては、例えば、ノード間で協調して処理を実行するために必要な機能を有するノード間連携プログラム（２８１）、データ管理機能に必要な処理を実行するデータ管理プログラム（２８２）、および、パリティ管理機能に必要な処理を実行するパリティ管理プログラム（２８３）といったプログラムがある。これらのプログラム（２８１）、（２８２）および（２８３）を含んだプログラムが、ＳＤＳ（Software Defined Storage）でよい。管理情報（２８４）は、上記プログラムが処理を実行するために必要なテーブルを含む。【００７２】
また、メモリ（２５４）は、キャッシュメモリ（１２１）を含む。本実施例において、キャッシュメモリ（１２１）は、メモリ（２５４）上に設けられた一部領域である。【００７３】
ＣＰＵ（２５３）は、メモリ（２５４）内のプログラムを実行する。【００７４】
記憶装置ＩＦ（２５５）は、ストレージコントローラ（２０５）と記憶装置（２０６）との接続に利用される通信インターフェースデバイスである。【００７５】
記憶装置（２０６）は、記憶装置ＩＦ（２６５）と、メモリ（２６２）と、スイッチ（２６３）と、複数（又は１）の記憶デバイス（２６４）と、それらに接続されたＣＰＵ（２６１）とを含む。記憶装置ＩＦ（２６５）は、記憶装置ＩＦ（２５５）に接続される通信インターフェースデバイスである。メモリ（２６２）は、記憶装置２０６に入出力されるデータや、ＣＰＵ（２６１）に実行されるプログラムを格納する。スイッチ（２６３）は、ＣＰＵ（２６１）またはメモリ（２６２）に対する接続先記憶デバイス（２６４）を切り替える。記憶デバイス（２６４）と、ＰＤＥＶであり、例えば、ＨＤＤまたはＳＳＤである。【００７６】
電源系統ＩＦ（２０７）は、ノード（２０３）と、そのノードの属するドメインの電源（２４１）とを接続するために利用されるインターフェースデバイスである。【００７７】
ＩＦ（２５１）および（２５２）のうちの少なくとも１つが、インターフェース部の一例である。メモリ（２５４）が、メモリ部の一例である。記憶装置（２０６）が、ＰＤＥＶ部の一例である。ＣＰＵ（２５３）が、プロセッサ部の一例である。キャッシュメモリ（１２１）にデータを格納することを「キャッシュする」と言い、記憶装置（２０６）にデータを格納することを「永続化する」と言うことができる。【００７８】
図５は、管理情報（２８４）内のテーブルを示す。【００７９】
管理情報（２８４）は、構成管理テーブル（Ｔ１０１）と、ストライプ管理テーブル（Ｔ２０１）とを含む。【００８０】
構成管理テーブル（Ｔ１０１）は、ドメインとノードの関係を示す。構成管理テーブル（Ｔ１０１）は、ドメイン（２０２）毎にエントリを有する。各エントリは、ドメインＩＤ（Ｃ１０１）と、ノードＩＤ（Ｃ１０２）といった情報を格納する。ドメインＩＤ（Ｃ１０１）は、ドメイン（２０２）を一意に特定できるドメインＩＤを示す。ノードＩＤ（Ｃ１１２）は、ノードを一意に特定できるノードＩＤを示す。【００８１】
ストライプ管理テーブル（Ｔ２０１）は、ストライプ毎にデータとパリティの位置を示す。具体的には、例えば、ストライプ管理テーブル（Ｔ２０１）は、ストライプ毎にエントリを有する。各エントリは、ストライプＩＤ（Ｃ２０１）、データ位置（Ｃ２０２）、およびパリティ位置（Ｃ２０３）といった情報を格納する。図５の例によれば、各ストライプについて、データストリップとパリティストリップは３対１で構成されている。【００８２】
ストライプＩＤ（Ｃ２０１）は、ストライプを一意に特定できるストライプＩＤを示す。【００８３】
データ位置（Ｃ２０２）は、当該ストライプ内の全データの各々の位置情報である。例えば、各データに対して、位置情報は、（ノードＩＤ、ノード内の記憶装置位置）で表現される。「ノード内の記憶装置位置」は、ＬＢＡ（Logical Block Address）のような論理アドレス（例えば、ノード領域における論理アドレス）と、当該論理アドレスに対応する物理アドレス（例えば、記憶デバイス（２６４）のＩＤと、当該記憶デバイス（２６４）が提供する論理アドレス空間における論理アドレス）とのうちの少なくとも１つを含んでもよい。【００８４】
パリティ位置（Ｃ２０３）は、当該ストライプ内の全パリティの各々の位置情報である。その位置情報も、（ノードＩＤ、ノード内の記憶装置位置）で表現される。【００８５】
図６は、ライトスルー書き込み処理の概要を示すブロック図である。ライトスルー書き込み処理は、図１を参照して説明したライトバック書き込み処理といくつかの共通（例えば、転送先として、電源（２４１）が異なるノードを選択すること）がある。ここでは、ライトバック書き込み処理との差分を主に説明する。【００８６】
ライトスルー書き込み処理は、例えばノード（２０３Ａ）がクライアント（１０１）から更新データ（Ｄ１´）のライト要求をネットワーク経由で受信（３５１）した場合に開始する。【００８７】
ノード（２０３Ａ）は、クライアント（１０１）からの更新データ（Ｄ１´）を、キャッシュメモリ（１２１Ａ）へ更新データを登録（３３２）する。その後、ノード（２０３Ａ）は、記憶装置（２０６Ａ）に更新データ（Ｄ１´）を格納（３５２）する。【００８８】
次に、ノード（２０３Ａ）は、更新データ（Ｄ１´）に対応した旧データ（Ｄ１）を、記憶装置（２０６Ａ）から読み込み（３５３）、当該旧データ（Ｄ１）をキャッシュメモリ（１２１Ａ）に登録（３３５）する。ノード（２０３Ａ）は、更新データ（Ｄ１´）と旧データ（Ｄ１）から、中間パリティ（Ｑ）を生成（３５４）し、中間パリティ（Ｑ）を、キャッシュメモリ（１２１Ａ）に登録（３３６）する。その後、ノード（２０３Ａ）は、管理情報（２８４Ａ）を参照し、更新データ（Ｄ１´）に対応するパリティノード（２０３Ｂ）を特定し、特定したノード（２０３Ｂ）へ中間パリティ（Ｑ）を転送（３５６）する。【００８９】
次に、ノード（２０３Ｂ）は、ノード（２０３Ａ）から転送された中間パリティ（Ｑ）を受信し、キャッシュメモリ（１２１Ｂ）へ当該中間パリティ（Ｑ）を登録（３３７）する。その後、ノード（２０３Ｂ）は、中間パリティ（Ｑ）に対応する旧パリティ（Ｐ）を、記憶装置（２０６Ｂ）から読み込み（３５７）、当該旧パリティ（Ｐ）をキャッシュメモリ（１２１Ｂ）に登録（３３９）する。ノード（２０３Ｂ）は、キャッシュメモリ（１２１Ｂ）上の中間パリティ（Ｑ）と旧パリティ（Ｐ）から更新パリティ（Ｐ´）を生成（３５８）し、当該更新パリティ（Ｐ´）をキャッシュメモリ（１２１Ｂ）に登録（３４０）する。その後、ノード（２０３Ｂ）は、当該更新パリティ（Ｐ´）を、記憶装置（１２４）に格納（３５９）し、ノード（２０３Ａ）に結果を返却（３６０）する。【００９０】
最後に、ノード（２０３Ａ）は、ノード（１０３）からの結果を受信し、クライアント（１０１）へ結果を返却（３６１）する。【００９１】
以上のように、ライトスルー書き込み処理において、中間パリティ（Ｑ）の転送先は、更新データ（Ｄ１´）をクライアント（１０１）から受信したノード（２０３Ａ）の電源（２４１Ａ）と異なる電源（２４１Ｂ）から電力供給を受けるノード（２０３Ｂ）である。【００９２】
図７は、フルストライプ書き込み処理の概要を示すブロック図である。図７は、３つのユーザストリップと１つのパリティストリップで１つのストライプが構成されている場合の例を示す。【００９３】
フルストライプ書き込み処理は、１つのストライプにユーザデータユニット（１つのストライプに書き込まれる全ての更新データ）を書き込む処理である。フルストライプ書き込み処理は、１つのストライプに書き込まれる全ての更新データ（Ｄ１´）、（Ｄ２´）および（Ｄ３´）のライト要求を、例えばノード（２０３Ａ）がネットワーク経由で受信（４５１）したことを契機とし、開始する。【００９４】
ノード（２０３Ａ）は、クライアント（１０１）からの更新データ（Ｄ１´）、（Ｄ２´）および（Ｄ３´）を、キャッシュメモリ（１２１Ａ）へ登録（４３２）する。その後、ノード（２０３Ａ）は、更新データ（Ｄ１´）、（Ｄ２´）および（Ｄ３´）から更新パリティ（Ｐ´）を生成（４５６）し、更新パリティ（Ｐ´）をキャッシュメモリ（１２１Ａ）に登録（４３３）する。【００９５】
以降の処理は、ライトバック（キャッシュメモリにデータを書き込んだ場合に結果を返す方式）とライトスルー（記憶装置にデータを書き込んだ場合に結果を返す方式）によって、その処理内容が異なる。【００９６】
まずは、フルストライプ書き込み処理をライトバックで実施した場合の処理を説明する。【００９７】
ノード（２０３Ａ）は、管理情報（２８４Ａ）を参照し、その更新データ（Ｄ１´）、（Ｄ２´）および（Ｄ３´）の格納先ストライプを特定し、特定したストライプについて、データ位置およびパリティ位置（つまり、転送先ノード）を特定する。図７の例によれば、転送先ノードとして、データ管理機能を行うノード（２０３Ｃ）および（２０３Ｄ）と、パリティ管理機能を行うノード（２０３Ｂ）とが特定される。ノード（２０３Ａ）は、転送先ノード（２０３Ｃ）および（２０３Ｄ）に対し、更新データ（Ｄ２´）および（Ｄ３´）をそれぞれ転送（（４５２）および（４５４））し、転送先ノード（２０３Ｂ）に対し、更新パリティ（Ｐ´）を転送（４５７）する。ノード（２０３Ｃ）および（２０３Ｄ）は、キャッシュメモリ（１２１Ｃ）および（１２１Ｄ）にそれぞれ受信した更新データ（Ｄ２´）および（Ｄ３´）を登録（（４３４）および（４３５））し、ノード（２０３Ａ）に結果をそれぞれ返却（（４５３）および（４５５））する。ノード（２０３Ｂ）は、キャッシュメモリ（１２１Ｂ）に受信した更新パリティ（Ｐ´）を登録（４３６）し、ノード（２０３Ａ）に結果を返却（４８６）する。最後に、ノード（２０３Ａ）は、３つのノード（２０３Ｂ）、（２０３Ｃ）および（２０３Ｄ）からそれぞれ結果を受信した場合、クライアント（１０１）へ結果を返却（４５９）する。以降、ノード（２０３Ａ）〜（２０３Ｄ）の各々は、適切なタイミングで、キャッシュメモリ内の更新データ（または更新パリティ）のデステージ処理を実行する。【００９８】
次に、フルストライプ書き込み処理をライトスルーで実施した場合の処理を説明する。【００９９】
ライトスルーの場合、ノード（２０３Ａ）は、更新データ（Ｄ１´）、（Ｄ２´）および（Ｄ３´）のうち、ノード（２０３Ａ）が管理する更新データ（Ｄ１´）を記憶装置（２０６Ａ）に格納（４６０）する。その後、ノード（２０３Ａ）は、転送先ノード（２０３Ｃ）および（２０３Ｄ）に対し、更新データ（Ｄ２´）および（Ｄ３´）をそれぞれ転送（（４５２）および（４５４））し、転送先ノード（２０３Ｂ）に対し、更新パリティ（Ｐ´）を転送（４５７）する。【０１００】
ノード（２０３Ｃ）および（２０３Ｄ）は、それぞれ、キャッシュメモリ（１２１Ｃ）および（１２１Ｄ）に受信した更新データ（Ｄ２´）および（Ｄ３´）を登録（（４３４）および（４３５））し、記憶装置（２０６Ｃ）および（２０６Ｄ）に更新データ（Ｄ２´）および（Ｄ３´）を格納（（４６１）および（４６２））し、ノード（２０３Ａ）に結果を返却（（４５３）および（４５５））する。また、ノード（２０３Ｂは、キャッシュメモリ（１２１Ｂ）に受信した更新パリティ（Ｐ´）を登録（４３６）し、記憶装置（２０６Ｂ）に更新パリティ（Ｐ´）を格納（４６３）し、ノード（２０３Ａ）に結果を返却（４８６）する。最後に、ノード（２０３Ａ）は、３つのノード（２０３Ｂ）、（２０３Ｃ）および（２０３Ｄ）からそれぞれ結果を受信した場合、クライアント（１０１）へ結果を返却（４５９）する。【０１０１】
ライトバックおよびライトスルーのいずれでも、更新データ（Ｄ１´）、（Ｄ２´）および（Ｄ３´）のうち、ノード（２０３Ａ）に永続化される更新データ（Ｄ１´）以外の更新データ（Ｄ２´）および（Ｄ３´）の各々について、ノード（２０３Ａ）は、当該更新データの複製先として、ノード（２０３Ａ）の電源（２４１Ａ）と異なる電源から電力供給を受けるｎ個のノード（ｎは自然数）のを選択し、選択したｎ個のノードの各々に更新データを転送してよい。【０１０２】
図８は、データ書き込み処理のフローチャートの一例である。データ書き込み処理は、例えば、クライアント（１０１）からのライト要求を契機として、データ管理機能を実行するノードのもつストレージコントローラ（２０５）のＣＰＵ（２５３）により実行される。【０１０３】
データ管理プログラム（２８２）は、受信したライト要求を参照する（Ｓ１０１）。例えば、データ管理プログラム（２８２）は、ライト要求から、データ書き込み処理に必要な情報（ノードＩＤと、記憶装置ＩＤと、更新データのサイズと、更新データの書き込み位置とを含んだ情報）を特定する。【０１０４】
データ管理プログラム（２８２）は、特定した情報をもとに、書き込み処理の種類がフルストライプ書き込み処理か否かを判定する（Ｓ１０２）。【０１０５】
Ｓ１０２の判定結果が偽の場合、データ管理プログラム（２８２）は、書き込み処理の種類がライトバック書き込み処理か否かを判定する（Ｓ１０３）。例えば、ライト要求に、ライトバックとライトスルーのうち採用する方式が指定されていて、その指定を基に、Ｓ１０３の判定が行われてよい。ライトバックとライトスルーの切り替えは、手動、または、自動（例えば、管理用サーバ（２２１）またはデータ管理プログラム（２８２）による判断）により実行されてよい。例えば、下記のように、ライトバックとライトスルーとを切り替えることが可能である。
・ストレージクラスタ（２０１）内に一定量以上のドメイン（つまり、多くの電源）が存在する場合（例えば通常運用時に）、ライトバックが採用される。ライトバックによる冗長化でも、データ保護に問題ないと考えられるためである。
・ストレージクラスタ（２０１）内に一定量以上のドメインが存在しない場合（例えば障害発生時に）、ライトスルーが採用される。データ消失を防止するためである。
・ユーザ（ストレージを使用するソフトウェアなど）の要件が、レイテンシ性能重視の場合は、ライトバックが採用される。
・ユーザの要件が、データ保護重視（例えば、アーカイブ目的など）の場合は、ライトスルーが採用される。【０１０６】
Ｓ１０３の判定結果が真の場合、ライトバック書き込み処理（図９）が実行される（Ｓ１０４）。Ｓ１０３の判定結果が偽の場合、ライトスルー書き込み処理（図１３）が実行される（Ｓ１０５）。【０１０７】
Ｓ１０２の判定結果が真の場合、データ管理プログラム（２８２）は、フルストライプ書き込みの種類がライトバックか否かを判定する（Ｓ１０６）。Ｓ１０６の判定方法は、Ｓ１０３の判定方法と同じでよい。【０１０８】
Ｓ１０６の判定結果が真の場合、フルストライプライトバック書き込み処理（図１４）が実行される（Ｓ１０７）。Ｓ１０６の判定結果が偽の場合、フルストライプライトスルー書き込み処理（図１５）が実行される（Ｓ１０８）。【０１０９】
最後に、データ管理プログラム（２８２）は、クライアント（１０１）へ結果を返却し（Ｓ１０９）、データ書き込み処理を終了する。【０１１０】
図９は、ライトバック書き込み処理（図８のＳ１０４）のフローチャートの一例である。【０１１１】
まず、データノードのノード間連携プログラム（２８１）は、クライアント（１０１）からのライト要求中の情報と、管理情報（２８４）とをもとに、更新データの複製先ノードを選択する（Ｓ２０１）。更新データの複製先ノードとして、例えば、更新データの格納先ストライプに対応したパリティの格納先のパリティノードが選択される。その後、データノードのノード間連携プログラム（２８１）は、複製先のパリティノードへネットワーク経由で、更新データの複製を転送する（Ｓ２０２）。この転送処理は、同期処理（ライト要求に応答して行われる処理中の処理）でもよいし非同期処理（ライト要求に応答して行われる処理とは別の処理）のどちらでもよい。【０１１２】
次に、パリティノードのノード間連携プログラム（２８１）は、データノードよりネットワーク経由で更新データの複製を受信する（Ｓ２０３）。その後、パリティノードのパリティ管理プログラム（２８３）は、更新データの複製をキャッシュメモリ（１２１）に登録する（Ｓ２０４）。最後に、パリティノードのノード間連携プログラム（２８１）は、データノードへネットワーク経由で処理の結果を返却する（Ｓ２０５）。【０１１３】
データノードのノード間連携プログラム（２８１）は、複製先のパリティノードからネットワーク経由で処理の結果を受信し（Ｓ２０６）、ライトバック書き込み処理を終了する。【０１１４】
図１０は、旧データ転送処理のフローチャートの一例である。【０１１５】
まず、データノードのデータ管理プログラム（２８２）は、データノードの記憶装置（２０６）から旧データを読み込む（Ｓ３０１）。次に、データノードのノード間連携プログラム（２８１）は、データノードの保持する管理情報（２８４）をもとに、旧データの転送先ノードを特定する（Ｓ３０２）。データノードのノード間連携プログラム（２８１）は、旧データを、Ｓ３０２で特定した転送先ノードへ転送する（Ｓ３０３）。【０１１６】
パリティノードのノード間連携プログラム（２８１）は、データノードより旧データを受信する（Ｓ３０４）。次に、パリティノードのパリティ管理プログラム（２８３）は、受信した旧データをキャッシュメモリ（１２１）に登録する（Ｓ３０５）。その後、パリティノードのノード間連携プログラム（２８１）は、データノードに結果を返却する（Ｓ３０６）。【０１１７】
データノードのノード間連携プログラム（２８１）は、パリティノードから結果を受信し（Ｓ３０７）、旧データ転送処理を終了する。【０１１８】
図１１は、データノードのデステージ処理のフローチャートの一例である。【０１１９】
まず、データノードのデータ管理プログラム（２８２）は、管理情報（２８４）をもとに、デステージ対象データを選択する（Ｓ４０１）。次に、データ管理プログラム（２８２）は、デステージ対象データを、データノードの記憶装置（２０６）に格納する（Ｓ４０２）。その後、データ管理プログラム（２８２）は、デステージ対象データの使用領域をキャッシュメモリ（１２１）から解放する（Ｓ４０３）。最後に、ノード間連携プログラム（２８１）は、デステージ対象データを示す情報（例えば、デステージ対象データの位置と格納先ストリップのＩＤ）を含んだパリティ更新依頼をパリティノードへ転送し（Ｓ４０４）、データノードのデステージ処理を終了する。【０１２０】
図１２は、パリティノードのデステージ処理のフローチャートの一例である。【０１２１】
まず、パリティノードのノード間連携プログラム（２８１）は、データノードからデステージ対象データの情報を含んだパリティ更新依頼を受信する（Ｓ５０１）。次に、パリティ管理プログラム（２８３）は、受信した依頼に応答して、デステージ対象データの旧パリティを特定し、特定した旧パリティを記憶装置（２０６）から読み込む（Ｓ５０２）。次に、パリティ管理プログラム（２８３）は、キャッシュメモリ（１２１）にあるデステージ対象データと、デステージ対象データの旧データと、旧パリティとを用いて、更新パリティの生成（パリティの更新）を行う（Ｓ５０３）。その後、パリティ管理プログラム（２８３）は、作成した更新パリティを、パリティノードの記憶装置（２０６）に書き込む（Ｓ５０４）。最後に、パリティ管理プログラム（２８３）は、デステージ対象データと、デステージ対象データの旧データとの使用領域をキャッシュメモリ（１２１）から解放し（Ｓ５０５）、パリティノードのデステージ処理を終了する。Ｓ５０５では、依頼に対する結果が返却されてよい。【０１２２】
図１３は、ライトスルー書き込み処理（図８のＳ１０５）のフローチャートの一例である。【０１２３】
データノードのデータ管理プログラム（２８２）は、更新データをデータノードの記憶装置（２０６）へ格納する（Ｓ６０１）。次に、データノードのパリティ管理プログラム（２８３）は、更新データの旧データをデータノードの記憶装置（２０６）からキャッシュメモリ（１２１）に読み込む（Ｓ６０２）。次に、データノードのパリティ管理プログラム（２８３）は、更新データとＳ６０２で読み込んだ旧データとを用いて、中間パリティを生成する（Ｓ６０３）。次に、データノードのノード間連携プログラム（２８１）は、Ｓ６０３で生成した中間パリティの送信先ノード（パリティノード）を選択する（Ｓ６０４）。その後、データノードのノード間連携プログラム（２８１）は、Ｓ６０４で選択したパリティノードへ、中間パリティを転送する（Ｓ６０５）。【０１２４】
パリティノードのノード間連携プログラム（２８１）は、データノードから中間パリティを受信し（Ｓ６０６）、その中間パリティをキャッシュメモリ（１２１）に登録する。パリティノードのパリティ管理プログラム（２８３）は、中間パリティに対応する旧パリティをパリティノードの記憶装置（２０６）からキャッシュメモリ（１２１）に読み込む（Ｓ６０７）。パリティノードのパリティ管理プログラム（２８３）は、中間パリティと旧パリティとを用いて、更新パリティを生成する（Ｓ６０８）。パリティノードは、更新パリティをパリティノードの記憶装置（２０６）に格納する（Ｓ６０９）。パリティノードのノード間連携プログラム（２８１）は、データノードに結果を返却する（Ｓ６１０）。【０１２５】
データノードのノード間連携プログラム（２８１）は、パリティノードから結果を受信（Ｓ６１１）し、ライトスルー書き込み処理を終了する。【０１２６】
図１４は、フルストライプライトバック書き込み処理（図８のＳ１０７）のフローチャートの一例である。当該処理では、ストライプを構成するユーザストリップの数と同数のデータノードが必要である。【０１２７】
データノードのパリティ管理プログラム（２８３）は、ストライプ分の更新データを用いて更新パリティを生成する（Ｓ７００）。データノードのノード間連携プログラム（２８１）は、管理情報（２８４）をもとに、複製先のデータノードおよびパリティノードを特定する（Ｓ７０１）。その後、データノードのノード間連携プログラム（２８１）は、複製先のデータノードとパリティノードに対して、更新データおよび更新パリティを転送する（Ｓ７０２）。【０１２８】
複製先データノードのノード間連携プログラム（２８１）と複製先パリティノードのノード間連携プログラム（２８１）は、データノードから更新データおよび更新パリティを受信する（Ｓ７０３）。複製先データノードのデータ管理プログラム（２８２）と、複製先パリティノードのパリティ管理プログラム（２８３）は、キャッシュメモリ（１２１）に受信した更新データおよび更新パリティを登録する（Ｓ７０４）。複製先データノードのノード間連携プログラム（２８１）と複製先パリティノードのノード間連携プログラム（２８１）は、データノードに結果を返却する（Ｓ７０５）。【０１２９】
データノードのノード間連携プログラム（２８１）は、全複製先ノードから結果を受信し（Ｓ７０６）、フルストライプライトバック書き込み処理を終了する。【０１３０】
図１５は、フルストライプライトスルー書き込み処理（図８のＳ１０８）のフローチャートの一例である。当該処理でも、ストライプを構成するユーザストリップの数と同数のデータノードが必要である。【０１３１】
データノードのパリティ管理プログラム（２８３）は、ストライプ分の更新データを用いて更新パリティを生成し、データノードのデータ管理プログラム（２８２）は、更新データをデータノードの記憶装置（２０６）へ格納する（Ｓ８００）。データノードのノード間連携プログラム（２８１）は、管理情報（２８４）をもとに、複製先のデータノードおよびパリティノードを特定する（Ｓ８０１）。その後、データノードのノード間連携プログラム（２８１）は、複製先のデータノードとパリティノードに対して、更新データおよび更新パリティを転送する（Ｓ８０２）。【０１３２】
複製先データノードのノード間連携プログラム（２８１）と複製先パリティノードのノード間連携プログラム（２８１）は、データノードから更新データおよび更新パリティを受信する（Ｓ８０３）。複製先データノードのデータ管理プログラム（２８２）と、複製先パリティノードのパリティ管理プログラム（２８３）は、キャッシュメモリ（１２１）に受信した更新データおよび更新パリティを登録し、かつ、更新データおよび更新パリティを記憶装置（２０６）に格納する（Ｓ８０４）。複製先データノードのノード間連携プログラム（２８１）と複製先パリティノードのノード間連携プログラム（２８１）は、データノードに結果を返却する（Ｓ８０５）。【０１３３】
データノードのノード間連携プログラム（２８１）は、全複製先ノードから結果を受信し（Ｓ８０６）、フルストライプライトスルー書き込み処理を終了する。【０１３４】
図１６は、ノード追加処理のフローチャートの一例である。【０１３５】
ノード追加処理は、分散ストレージシステムにノードを追加する処理である。管理者が新しいノードをストレージクラスタ（２０１）に物理的に接続し、その後、管理者が、全追加対象ノードのＩＤを引数として、そのストレージクラスタ（２０１）の管理用サーバ（２２１）のノード追加プログラム（２０）にノード追加処理の実行命令を入力する。当該実行命令に応答して、管理用サーバ（２２１）のノード管理プログラム（２０）が、ノード追加処理を開始する。【０１３６】
ノード管理プログラム（２０）は、実行命令内の引数から追加先のドメインを決定する（Ｓ９０１）。ノード管理プログラム（２０）は、追加するノードをストレージクラスタ（２０１）のネットワーク（２１２）および（２１３）に接続し、通信可能な状態にする（Ｓ９０２）。ノード管理プログラム（２０）は、少なくとも１つのノード（２０３）の構成管理テーブル（Ｔ１０１）（追加先ドメインに対応したノードＩＤ（Ｃ１０２））に、追加対象ノードのＩＤを追加する（Ｓ９０３）。ノード管理プログラム（２０）は、同クラスタ（２０１）内の全ノード（２０３）に対して、構成管理テーブル（Ｔ１０１）の同期を依頼する（Ｓ９０５）。当該依頼に応答して、同クラスタ（２０１）内の全ノード（２０３）は、構成管理テーブル（Ｔ１０１）の同期を取る（内容を同一とする）。ノード管理プログラム（２０）は、同クラスタ（２０１）内の全ノード（２０３）に対して、データ再配置処理を依頼する（Ｓ９０４）。当該依頼に応答して、同クラスタ（２０１）内の全ノード（２０３）は、ノード間連携プログラム（２８１）を実行することによって、データ再配置処理を実行し、当該処理に応じてストライプ管理テーブル（Ｔ２０１）を更新する。この再配置処理により、追加対象ノード以外の少なくとも一部のノードから追加対象ノードにデータまたはパリティが移動する。【０１３７】
ノード管理プログラム（２０）は、新たに追加するすべてのノードについて処理を完了したかを判断する（Ｓ９０６）。Ｓ９０６の判断結果が真の場合に、ノード追加処理が終了する。Ｓ９０６の判断結果が偽の場合、未処理のノードについてＳ９０１が行われる。【０１３８】
Ｓ９０５は、ノード間での同期に代えて、ノード管理プログラム（２０）が、全ノードに、更新後の構成管理テーブル（Ｔ１０１）を配信することであってもよい。【０１３９】
図１７は、ノード削除処理のフローチャートの一例である。【０１４０】
ノード削除処理は、分散ストレージシステムからノードを削除する処理である。管理者が、全削除対象ノードのＩＤを引数として、ノード管理プログラム（２０）にノード削除処理の実行命令を入力する。当該実行命令に応答して、ノード管理プログラム（２０）が、ノード削除処理を開始する。【０１４１】
ノード管理プログラム（２０）は、少なくとも１つのノード（２０３）の構成管理テーブル（Ｔ１０１）（削除対象ノードが属するドメイン（２０２）に対応したノードＩＤ（Ｃ１０２））から、削除対象ノードのＩＤを削除する（Ｓ１００１）。ノード管理プログラム（２０）は、同クラスタ（２０１）内の全ノード（２０３）に対して、構成管理テーブル（Ｔ１０１）の同期を依頼する（Ｓ１００２）。当該依頼に応答して、同クラスタ（２０１）内の全ノード（２０３）は、構成管理テーブル（Ｔ１０１）の同期を取る。ノード管理プログラム（２０）は、同クラスタ（２０１）内の全ノード（２０３）に対して、データ再配置処理を依頼する（Ｓ１００３）。当該依頼に応答して、同クラスタ（２０１）内の全ノード（２０３）は、ノード間連携プログラム（２８１）を実行することによって、データ再配置処理を実行し、当該処理に応じてストライプ管理テーブル（Ｔ２０１）を更新する。この再配置処理により、削除対象ノード内の全てのデータ（およびパリティ）が、削除対象ノード以外の少なくとも一部のノードに移動する。【０１４２】
ノード管理プログラム（２０）は、削除対象ノードに停止要求を送信する（Ｓ１００４）。この要求に応答して、削除対象ノードは、当該クラスタ（２０１）から切断される。【０１４３】
ノード管理プログラム（２０）は、全ての削除対象ノードについて処理を完了したか否かを判断する（Ｓ１００５）。Ｓ１００５の判断結果が真の場合は、ノード削除処理が終了する。Ｓ１００５の判断結果が偽の場合は、未処理の削除対象ノードについてＳ１００１が行われる。【０１４４】
Ｓ１００２は、ノード間での同期に代えて、ノード管理プログラム（２０）が、全ノードに、更新後の構成管理テーブル（Ｔ１０１）を配信することであってもよい。【０１４５】
ノード追加処理およびノード削減処理の少なくとも１つは、例えば次のように行われてよい。ドメイン（２０２）は、ノード（例えばブレードサーバ）２０３が搭載されるラックでよい。ドメイン（２０２）の追加および削除は、既存のドメイン（２０２）に対するノード（２０３）の追加および削除に比べて、処理コスト（例えば、コンピューティングリソースの負荷）が大きい。そこで、クラスタ（２０１）に搭載可能な最大数のドメイン（２０２）が予めクラスタ（２０１）に用意されている。複製元ノードと複製先ノードの電源が異なるため、ノード（２０３）は、全ドメイン（２０２）になるべく均等に分散するように追加または削除される。具体的には、例えば、管理者が追加対象または削除対象のノードを決定することに代えて、ノード管理プログラム（２０）が、全ドメイン（２０２）になるべく均等に分散するように、下記を決定してよい。
・追加先または削除元のドメイン（２０２）。
・追加先または削除元のドメイン（２０２）毎に、追加されるまたは削除されるノード（２０３）の数。（追加先または削除元のドメイン（２０２）毎に、追加されるまたは削除されるノードは、決定されたノード数分、ランダムで決定されてよい。）【０１４６】
また、実施例１では、ストライプ毎に、データノードとなるべきノードとパリティノードとなるべきノードが予め決められていてもよいし、全ストライプについて、パリティノードが同一ノードであってもよい。また、更新データの転送先は、パリティノードを含むｎ個のノード（ｎは自然数）であってもよい。これにより、更新データのｎ重化が可能である。なお、「更新データ」は、ＲＡＩＤやErasure Cordingのようなデータ保護技術に従うデータであって、ライト要求に従うデータの少なくとも一部のデータでよい。
【実施例２】
【０１４７】
次に、本発明の実施例２について説明する。以下、実施例１との相違点を主に説明し、実施例１との共通点については、説明を省略又は簡略する。【０１４８】
図１８は、実施例２におけるドメインの構成を示したブロック図である。【０１４９】
実施例２では、少なくとも１つのドメイン（２０２）が、電源（２４１）に対して複数のサブドメイン（５０１）を有する。【０１５０】
各サブドメイン（５０１）は、少なくとも１つのノード（２０３）と、少なくとも１つのＵＰＳ（Uninterruptible Power Supply）（５０２）とを含む。ＵＰＳ（５０２）は、サブ電源の一例である。サブドメイン（５０１）内の全ノード（２０３）は、同サブドメイン（５０１）が有するＵＰＳ（５０２）に接続される。【０１５１】
実施例２では、ＵＰＳ（５０２）を有するサブドメイン（５０１）があるため、ドメインの電源（２４１）が障害等でその機能が利用できなくなった場合においても、サブドメイン（５０１）内の全ノード（２０３）内のデータは保護できる。このため、電源（２４１）の障害耐性の向上が期待できる。例えば、異なるドメイン（２０２）に属するノード（２０３）間でのデータ冗長化に加え、異なるサブドメイン（５０１）に属するノード（２０３）間でもデータを冗長化することが可能となる。【０１５２】
図１９は、実施例２における構成管理テーブルの構成を示す。【０１５３】
構成管理テーブル（Ｔ１０１）は、サブドメイン（５０１）毎にエントリを有する。各エントリは、ドメインＩＤ（Ｃ１０１）、サブドメインＩＤ（Ｃ３０１）およびノードＩＤ（Ｃ１０２）を有する。ドメインＩＤ（Ｃ１０１）は、サブドメインが属するドメインのＩＤを示す。サブドメインＩＤ（Ｃ３０１）は、サブドメインのＩＤを示す。ノードＩＤ（Ｃ３０２）は、サブドメインに属する全ノードのＩＤを示す。【０１５４】
実施例２では、例えば、複製元（転送元）のノードのノード間連携プログラム（２８１）は、複製先（転送先）のノードを、下記のようにして決定してよい。下記のように、電源（２４１）が異なるノードを優先的に複製先として選択することで、データ保護の維持の確実性を向上することが期待できる。下記（ｘ１）乃至（ｘ３）は、例えば図９のＳ２０１で行われてよい。
（ｘ１）複製元ノードの電源（２４１）（ドメイン（２０２））と異なる電源（２４１）のノードのうち、複製先として選択可能なノード（例えば、空き容量が所定条件を満たすノード）が少なくとも１つあるか否かを判断する。
（ｘ２）（ｘ１）の判断結果が真の場合、複製元ノードの電源（２４１）と異なる電源（２４１）のノードから、複製先とするノードを選択する。
（ｘ３）（ｘ１）の判断結果が偽の場合、または、（ｘ２）で選択されたノード数が、複製先のノード数として必要なノード数ｎ（ｎは自然数）に満たない場合、複製元ノードの電源（２４１）と同じ電源（２４１）のノードではあるが、ＵＰＳ（５０２）（サブドメイン（５０１））が複製元ノードと異なるノードを、複製先として、複製先ノード数がｎとなるように、選択する。【０１５５】
また、実施例２では、ノード追加処理およびノード削減処理の少なくとも１つは、例えば次のように行われてよい。すなわち、ノード（２０３）は、全ドメイン（２０２）になるべく均等に分散するように追加または削除されることに加えて、同一ドメイン（２０２）内については、全サブドメイン（５０１）になるべく均等に分散するように追加または削除される。サブドメイン（５０１）の追加および削除は、既存のサブドメイン（５０１）に対するノード（２０３）の追加および削除に比べて、処理コストが大きいためである。具体的には、例えば、管理者が追加対象または削除対象のノードを決定することに代えて、ノード管理プログラム（２０）が、追加先または削除元のドメイン（２０２）内の全サブドメイン（５０１）になるべくノード（２０３）が均等に分散するように、下記を決定してよい。
・追加先または削除元のサブドメイン（５０１）。
・追加先または削除元のサブドメイン（５０１）毎に、追加されるまたは削除されるノード（２０３）の数。（追加先または削除元のサブドメイン（５０１）毎に、追加されるまたは削除されるノードは、決定されたノード数分、ランダムで決定されてよい。）【０１５６】
電源（２４１）とＵＰＳ（５０２）とを「電源部」と総称することができる。言い換えれば、「電源部」は、電源（２４１）とＵＰＳ（５０２）とのいずれであってもよい。
【実施例３】
【０１５７】
本発明の実施例３について説明する。以下、実施例１と、実施例２との相違点を主に説明し、実施例１と、実施例２との共通点については、説明を省略又は簡略する。【０１５８】
実施例３では、旧データの送信タイミングは、データノードのＩ／Ｏ（Input/Output）負荷をもとに推定された、データノードでの更新データのデステージのタイミング、よりも前のタイミングである。すなわち、データノードは、推定されたデステージタイミングよりも先行して、更新データの旧データを、当該旧データに対応した旧パリティをもつパリティノードへ転送する。【０１５９】
図２０は、実施例３における旧データ転送処理の概要を示すブロック図である。【０１６０】
図２０の例によれば、データノード（２０３Ａ）とパリティノード（２０３Ｂ）において、いくつか更新データ転送が実施されている状態にある。具体的には、更新データ（Ｄ１´）および（Ｅ１´）がデータノード（２０３Ａ）のキャッシュメモリ（１２１Ａ）に格納されており、これらの更新前データの旧データ（Ｄ１）および（Ｅ１）と、旧データ（Ｆ１）とが、データノード（２０３Ａ）の記憶装置（２０６Ａ）に格納されている。また、更新データの複製としての更新データ（Ｄ１´）および（Ｅ１´）がパリティノード（２０３Ｂ）のキャッシュメモリ（１２１Ｂ）に格納されており、旧データ（Ｄ１）、（Ｅ１）および（Ｆ１）にそれぞれ対応するパリティ（Ｐ）、（Ｒ）および（Ｓ）が、パリティノードの記憶装置（２０６Ｂ）に格納されている。【０１６１】
この状態で、データノード（２０３Ａ）が、クライアント（１０１）から、旧データ（Ｆ１）の更新データ（Ｆ１´）のライト要求を受信（５５１）したとする。【０１６２】
データノード（２０３Ａ）は、更新データ（Ｆ１´）をキャッシュメモリ（１２１Ａ）に登録する（５３２）。その後、データノード（２０３Ａ）は、更新データ（Ｆ１´）をパリティノード（２０３Ｂ）へ転送する（５５２）。パリティノード（２０３Ｂ）は、受信した更新データ（Ｆ１´）をキャッシュメモリ（１２１Ｂ）に登録（５３３）し、結果を返却（５５３）する。データノード（２０３Ａ）は、結果を受けたら、クライアント（１０１）へ結果を返却する（５５４）。【０１６３】
データノード（２０３Ａ）（例えばデータ管理プログラム（２８２））は、クライアント（１０１）から受信したデータの量であるデータ転送量と、キャッシュメモリ（１２１Ａ）の登録状況となどを元に、Ｉ／Ｏ負荷を監視する（５８１）。このＩ／Ｏ負荷を元に、データノード（２０３Ａ）（例えばデータ管理プログラム（２８２））は、次のデステージ処理のタイミングを推定し、当該推定されたタイミングよりも先行して旧データを転送する。例えば、データノード（２０３Ａ）は、キャッシュメモリ（１２１Ａ）のメモリ使用量の増加量から、デステージ処理開始を決定する閾値までの到達時刻を推定する。図２０では、キャッシュメモリ（１２１Ａ）に登録された更新データ（Ｄ１´）、（Ｅ１´）および（Ｆ１´）のうち、次のデステージ対象が、更新データ（Ｄ１´）であるとする。この時、Ｉ／Ｏ負荷の監視結果を基に推定された次のデステージタイミングに先行して、データノード（２０３Ａ）は、次のデステージ対象の更新データ（Ｄ１´）の旧データ（Ｄ１）を転送する。すなわち、データノード（２０３Ａ）は、記憶装置（２０６Ａ）から旧データ（Ｄ１）を読み込み（５５５）、当該旧データ（Ｄ１）をキャッシュメモリ（１２１Ａ）に登録し（５３９）、当該旧データ（Ｄ１）を、パリティノード（２０３Ｂ）へ転送する（５５６）。パリティノード（２０３Ｂ）は、キャッシュメモリ（１２１Ｂ）に旧データ（Ｄ１）を登録する（５４０）。これにより、パリティノード（２０３Ｂ）において、次のデステージ対象の更新データ（Ｄ１´）とその旧データ（Ｄ１）の組（５８２）をもつことができる。【０１６４】
以上の処理により、デステージ処理において、デステージ対象の更新データに対応する旧データの転送処理を削減することができ、デステージ処理の処理時間を短縮できる。
【実施例４】
【０１６５】
本発明の実施例４について説明する。以下、実施例１と、実施例２と、および実施例３と、の相違点を主に説明し、実施例１と、実施例２と、および実施例３との共通点については、説明を省略又は簡略する。【０１６６】
実施例４は、本発明におけるノード間を跨いだストライプ生成処理の一例を説明する。【０１６７】
図２１は、実施例４におけるデータ書き込み処理の一例を示したブロック図である。図２１の例では、１つのストライプは、３つのデータストリップと１つのパリティストリップとから構成されている。このため、１つのストライプについて、３つのデータノード（２０３Ａ）、（２０３Ｃ）および（２０３Ｄ）と、１つのパリティノード（２０３Ｂ）とが存在する。３つのデータノード（２０３Ａ）、（２０３Ｃ）および（２０３Ｄ）には、１以上のクライアント（１０１）が接続される。本実施例では、３つのデータノード（２０３Ａ）、（２０３Ｃ）および（２０３Ｄ）に、それぞれ、３つのクライアント（１０１Ａ）、（１０１Ｃ）および（１０１Ｄ）が接続されている。【０１６８】
まず、クライアント（１０１）とデータノード（２０３）との組毎に、データノードからパリティノードへデータが複製される。例えば、クライアント（１０１Ａ）とデータノード（２０３Ａ）の組において、以下の処理が行われる。
（ｖ１）クライアント（１０１Ａ）は、更新データ（Ｄ１）のライト要求をデータノード（２０３Ａ）に転送する（６５１）。
（ｖ２）データノード（２０３Ａ）は、更新データ（Ｄ１）をキャッシュメモリ（１２１Ａ）に登録する（６３４）。
（ｖ３）データノード（２０３Ａ）は、更新データ（Ｄ１）を、パリティノード（２０３Ｂ）へ転送する（６５２）。
（ｖ４）パリティノード（２０３Ｂ）から、受信した更新データ（Ｄ１）をキャッシュメモリ（１２１Ｂ）に登録する（６４１）。
（ｖ５）パリティノード（２０３Ｂ）が、データノード（２０３Ａ）へ結果を返却する（６５３）。
（ｖ６）データノード（２０３Ａ）は、パリティノード（２０３Ｂ）から結果を受信した場合に、クライアント（１０１Ａ）へ結果を返却する（６５４）。【０１６９】
（ｖ１）〜（ｖ６）のような処理が、クライアント（１０１Ｃ）とデータノード（２０３Ｃ）との組、および、クライアント（１０１Ｄ）とデータノード（２０３Ｄ）との組の各々においても、行われる。その後、データノード（２０３Ａ）、（２０３Ｃ）および（２０３Ｄ）の各々は、適切なタイミングで、更新データを、当該データノードの記憶装置へデステージする。【０１７０】
次に、パリティノード（２０３Ｂ）は、適切なタイミングで、クライアント（１０１Ａ）の更新データ（Ｄ１）、クライアント（１０１Ｃ）の更新データ（Ｅ１）、および、クライアント（１０１Ｄ）の更新データ（Ｆ１）から、パリティ（Ｐ）を生成し（６６６）、パリティ（Ｐ）を、記憶装置（２０６Ｂ）に格納する（６６７）。【０１７１】
実施例４によれば、ストライプ毎に、動的に、パリティノードを決定することができる。例えば、ノード間通信により、ある１つのストライプについて、全ユーザデータが異なるノードに存在することがわかった場合、当該異なるノード以外のうちのいずれかのノード（例えばノード（２０３Ｂ）が、当該異なるノードのうちのいずれか（例えばノード（２０１Ａ））によって、パリティノードとして決定されてよい。【０１７２】
実施例４では、ノード（２０３Ａ）、（２０３Ｃ）および（２０３Ｄ）の各々が、転送元ノードとして、例えば図１を参照して説明したノード（２０３Ａ）と同様の処理を実行してよい。ノード（２０３Ｂ）が、旧パリティをキャッシュメモリ（１２１Ｂ）に読み込み旧パリティを用いることに代えて、１つのストライプ分の更新データ（Ｄ１）、（Ｅ１）および（Ｆ１）を用いてパリティを生成してよい。【０１７３】
以上、本発明の幾つかの実施例を説明したが、以上の実施例は、本発明を分かりやすく説明するために詳細に説明したものであり、本発明は、必ずしも説明した全ての構成を備えるものに限定されるものではない。ある例の構成の一部を他の例の構成に置き換えることが可能であり、ある例の構成に他の例の構成を加えることも可能である。また、各実施例の構成の一部について、他の構成の追加・削除・置換をすることが可能である。図の構成は説明上必要と考えられるものを示しており、製品上必ずしも全ての構成を示しているとは限らない。
【符号の説明】
【０１７４】
２０３：ノード
【図１】
2019049224.tif 000003
【図２】
2019049224.tif 000004
【図３】
2019049224.tif 000005
【図４】
2019049224.tif 000006
【図５】
2019049224.tif 000007
【図６】
2019049224.tif 000008
【図７】
2019049224.tif 000009
【図８】
2019049224.tif 000010
【図９】
2019049224.tif 000011
【図１０】
2019049224.tif 000012
【図１１】
2019049224.tif 000013
【図１２】
2019049224.tif 000014
【図１３】
2019049224.tif 000015
【図１４】
2019049224.tif 000016
【図１５】
2019049224.tif 000017
【図１６】
2019049224.tif 000018
【図１７】
2019049224.tif 000019
【図１８】
2019049224.tif 000020
【図１９】
2019049224.tif 000021
【図２０】
2019049224.tif 000022
【図２１】
2019049224.tif 000023
【国際調査報告】
2019049224.tif 000024
2019049224.tif 000025
2019049224.tif 000026