説明

データ管理プログラム、データ管理方法およびストレージ装置

【課題】分散ストレージシステムにおいてPut処理を実行中にノード故障やノード間で一時的な通信障害が発生した場合にもデータの一貫性を保つこと。
【解決手段】ノード間Put要求部14が多重化チェーンの順序が次のノードに発行したPut要求に対するタイムアウトを検出してPut/Get実行部13に通知する。すると、Put/Get実行部13は、多重化チェーンの順序が前のノードまたはクライアントにエラーを返信するとともにPut失敗データ同期部17にPutに失敗したデータの同期を指示し、Put失敗データ同期部17が同期処理を行う。プライマリ1は、同期処理が完了するまでは他のPut要求を待たせる。また、エラーを受け取ったクライアント5は、多重化チェーンの最後尾に対してGet要求を発行する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、データ管理プログラム、データ管理方法およびストレージ装置に関する。
【背景技術】
【0002】
従来、分散KVS(Key Value Store)に代表されるNoSQLなど、複数のノード間でデータが多重化されている分散ストレージシステムにおいては、データをPutまたはGetする方式として複数の方式がある。ここで、ノードとは、CPU、メモリ、ディスク装置などを備えたコンピュータであり、ノード間はネットワークで相互に接続される。また、分散ストレージシステムにおいて、各ノードはデータを分散して記憶するストレージ装置である。また、データをPutするとはデータを分散ストレージシステムに書き込むことであり、データをGetするとはデータを分散ストレージシステムから読み出すことである。
【0003】
図12aはデータをGetする方式の一例を示す図であり、図12bはデータをPutする方式の一例を示す図である。図12aおよび図12bでは、データが三重化され、三重化されたデータをそれぞれ記憶するノードには、「プライマリ」→「セカンダリ」→「ターシャリ」という順序関係が存在する。ここで、「プライマリ」、「セカンダリ」、「ターシャリ」は分散ストレージシステムにおけるノードの役割である。プライマリ10は「プライマリ」の役割を有するノードであり、セカンダリ20は「セカンダリ」の役割を有するノードであり、ターシャリ30は「ターシャリ」の役割を有するノードである。また、クライアント5は、データのPutやGetを分散ストレージシステムに要求する装置である。
【0004】
図12aに示すように、クライアント5は、プライマリ10、セカンダリ20、ターシャリ30のいずれからもデータをGetすることができる。すなわち、クライアント5は、プライマリ10、セカンダリ20、ターシャリ30のいずれにGetを要求しても、OKを得ることができる。
【0005】
一方、図12bに示すように、クライアント5は、プライマリ10だけにPutを要求することができる。Put要求はクライアント5→プライマリ10→セカンダリ20→ターシャリ30の順に伝達され、「OK」は逆にターシャリ30→セカンダリ20→プライマリ10→クライアント5の順に伝達される。
【先行技術文献】
【非特許文献】
【0006】
【非特許文献1】Robbert van Renesse, Fred B. Schneider, “Chain Replication for Supporting High Throughput and Availability”, OSDI’04:6th Symposium on Operating Systems Design and Implementation,P.91.
【非特許文献2】Jeff Terrace and Michael J. Freedman, “Object Storage on CRAQ High-throughput chain replication for read-mostly workloads”, In Proc. USENIX Annual Technical Conference, San Diego, CA, June 2009.
【発明の概要】
【発明が解決しようとする課題】
【0007】
しかしながら、図12aおよび図12bに示した従来方式には、各ノードが保持するデータ間に矛盾が生じる可能性があるという問題がある。図13は、従来方式で問題が発生する3つのケースを示す図である。
【0008】
ケース(1)は、セカンダリ20がターシャリ30にPut要求を送信した後、ターシャリ30から返答を受け取る前、もしくは、ターシャリ30から返答を受け取ったがプライマリ10に返答を返す前に、セカンダリ20で故障が発生した場合である。この場合、プライマリ10がタイムアウトを検出し、タイムアウト時にはデータの書き込みが行われないとすると、プライマリ10には古いデータが記憶され、ターシャリ30には更新された新しいデータが記憶される。
【0009】
また、ケース(2)は、ターシャリ30がセカンダリ20に返答する際に、ネットワークに一時的な通信障害が起こり、セカンダリ20でタイムアウトが発生した場合である。この場合、タイムアウト時には、データの書き込みは行われないとすると、プライマリ10およびセカンダリ20には古いデータが記憶され、ターシャリ30には更新された新しいデータが記憶される。
【0010】
また、ケース(3)は、セカンダリ20がプライマリ10に返答する際に、ネットワークに一時的な通信障害が起こり、プライマリ10でタイムアウトが発生した場合である。この場合、タイムアウト時には、データの書き込みは行われないとすると、プライマリ10には古いデータが記憶され、セカンダリ20およびターシャリ30には更新された新しいデータが記憶される。
【0011】
本願に開示の技術は、1つの側面では、各ノードが保持するデータ間における矛盾の発生を抑制することを目的とする。
【課題を解決するための手段】
【0012】
第1の案では、データ管理プログラムは、他のストレージ装置と同一のデータを記憶するストレージ装置に以下の処理を実行させる。すなわち、データ管理プログラムは、前記データを記憶する他のストレージ装置である第1の装置またはクライアント装置のいずれか一方から前記データについて更新データの書き込み要求を受け付ける。そして、データ管理プログラムは、前記データを記憶する他のストレージ装置であって前記第1の装置とは異なる第2の装置に前記更新データの書き込みを要求する。そして、データ管理プログラムは、前記第2の装置から所定の時間内に応答がない場合に前記更新データの書き込み要求を行った第1の装置またはクライアント装置に障害発生による書き込み失敗を通知する。また、データ管理プログラムは、前記第2の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行った第1の装置またはクライアント装置に障害発生による書き込み失敗を通知する。そして、データ管理プログラムは、前記データを記憶する他のストレージ装置との間で前記データについて同期をとる。
【発明の効果】
【0013】
本願に開示の技術は、1つの側面では、各ノードが保持するデータ間における矛盾の発生を抑制することができる。
【図面の簡単な説明】
【0014】
【図1】図1は、実施例に係る分散ストレージシステムの構成を示す機能ブロック図である。
【図2】図2は、実施例に係る分散ストレージシステムによる正常時のPut処理の処理手順を示すフローチャートである。
【図3】図3は、実施例に係る分散ストレージシステムによる正常時のGet処理の処理手順を示すフローチャートである。
【図4】図4は、Put処理中にセカンダリにGet要求が来た場合の処理の流れを示す図である。
【図5】図5は、実施例に係る分散ストレージシステムによる異常時のPut処理の処理手順を示す第1のフローチャートである。
【図6】図6は、実施例に係る分散ストレージシステムによる異常時のPut処理の処理手順を示す第2のフローチャートである。
【図7】図7は、実施例に係る分散ストレージシステムによる異常時のPut処理の処理手順を示す第3のフローチャートである。
【図8】図8は、同期処理の処理手順を示すフローチャートである。
【図9】図9は、各ノードが複数の役割を有する場合に保持するデータの一例を示す図である。
【図10】図10は、各ノードが複数の役割を有する場合の同期処理の処理手順を示すフローチャートである。
【図11】図11は、実施例に係るデータ管理プログラムを実行するコンピュータの構成を示す機能ブロック図である。
【図12a】図12aは、データをGetする方式の一例を示す図である。
【図12b】図12bは、データをPutする方式の一例を示す図である。
【図13】図13は、従来方式で問題が発生する3つのケースを示す図である。
【発明を実施するための形態】
【0015】
以下に、本願の開示するデータ管理プログラム、データ管理方法およびストレージ装置の実施例を図面に基づいて詳細に説明する。
【実施例】
【0016】
まず、実施例に係る分散ストレージシステムの構成について説明する。図1は、実施例に係る分散ストレージシステムの構成を示す機能ブロック図である。図1に示すように、分散ストレージシステム100は、プライマリ1、セカンダリ2、ターシャリ3および制御ノード4を有する。
【0017】
プライマリ1は「プライマリ」の役割を有するノードであり、セカンダリ2は「セカンダリ」の役割を有するノードであり、ターシャリ3は「ターシャリ」の役割を有するノードである。プライマリ1、セカンダリ2、ターシャリ3および制御ノード4は、ネットワークに接続され、ネットワークを介して相互に通信することができる。また、プライマリ1、セカンダリ2、ターシャリ3はネットワークを介してクライアント5に接続される。
【0018】
プライマリ1、セカンダリ2、ターシャリ3は、同一のデータを記憶する。クライアント5は、分散ストレージシステム100へのデータのPut、分散ストレージシステム100からのデータのGetを行う装置である。クライアント5は、プライマリ1、セカンダリ2、ターシャリ3のいずれに対してもデータのGetを要求することができるが、データのPutはプライマリ1に対してだけ要求することができる。Put要求はクライアント5→プライマリ1→セカンダリ2→ターシャリ3の順に伝達され、Put要求に対する応答は、ターシャリ3→セカンダリ2→プライマリ1→クライアント5の順に伝達される。
【0019】
クライアント5は、Put/Get要求部51を有し、Put/Get要求部51が分散ストレージシステム100へデータのPutおよびGetを要求する。なお、ここでは説明の便宜上、1台のクライアント5のみを示したが、プライマリ1、セカンダリ2、ターシャリ3は、ネットワークを介して複数のクライアント5に接続される。また、Put要求には書き込みを要求するデータおよびデータ名が含まれ、Get要求には読み出しを要求するデータ名が含まれる。
【0020】
プライマリ1およびセカンダリ2は、データ記憶部11、多重化情報保持部12、Put/Get実行部13、ノード間Put要求部14、多重化情報変更実行部15、Put失敗データ名保持部16、Put失敗データ同期部17を有する。ターシャリ3は、データ記憶部11、多重化情報保持部12、Put/Get実行部13、多重化情報変更実行部15を有する。
【0021】
データ記憶部11は、クライアント5がプライマリ1に対してPutしたデータを記憶するディスク装置である。クライアント5がプライマリ1に対してPutしたデータは、プライマリ1、セカンダリ2およびターシャリ3のデータ記憶部11に多重化されて記憶される。
【0022】
多重化情報保持部12は、多重化情報を保持する。ここで、多重化情報とは、データの多重化に関する情報であり、多重化チェーン情報を含む。多重化チェーン情報は、Put要求およびPut要求に対する応答が伝達される多重化チェーンにおいてノードの順序を示す情報であり、例えば、プライマリ1が最初で、セカンダリ2が2番目で、ターシャリ3が最後という順序を示す情報である。
【0023】
Put/Get実行部13は、クライアント5が分散ストレージシステム100に送信するGet要求およびPut要求を実行する。Get要求については、Put/Get実行部13は、クライアント5から直接受信し、データ記憶部11に記憶されたデータをクライアント5に送信する。一方、Put要求については、プライマリ1のPut/Get実行部13だけがクライアント5から直接受信し、他のノードのPut/Get実行部13は、多重化チェーン情報で順序が1つ前のノードから受信する。例えば、セカンダリ2のPut/Get実行部13はプライマリ1からPut要求を受信し、ターシャリ3のPut/Get実行部13はセカンダリ2からPut要求を受信する。また、Put/Get実行部13は、Put要求されたデータをデータ記憶部11に書き込む。
【0024】
また、Put/Get実行部13は、自装置が多重化チェーン情報で最後のノードでない場合には、多重化情報保持部12を参照し、ノード間Put要求部14に対して多重化チェーン情報で順序が次のノードにPut要求を送信するように指示する。例えば、プライマリ1のPut/Get実行部13はセカンダリ2にPut要求を送信するようにノード間Put要求部14に指示し、セカンダリ2のPut/Get実行部13はターシャリ3にPut要求を送信するようにノード間Put要求部14に指示する。
【0025】
また、Put/Get実行部13は、多重化チェーン情報で順序が次のノードからノード間Put要求部14を介してPutの結果を受け取ると、データ記憶部11にデータを書き込む。そして、Put/Get実行部13は、多重化チェーン情報で順序が前のノードまたはクライアント5にPutの結果を通知する。
【0026】
ただし、Put/Get実行部13は、ノード間Put要求部14からPut要求に対するタイムアウトによるPut失敗を通知されると、Put失敗データ名保持部16にPutが失敗したデータ名を格納し、Put失敗データ同期部17にPutが失敗したデータの同期を指示する。なお、ターシャリ3のPut/Get実行部13は、ノード間Put要求部14を備えないため、Put要求の送信を指示することはなく、Put要求に対するタイムアウトによるPut失敗を通知されることもない。
【0027】
また、Put/Get実行部13は、多重化チェーン情報で順序が前のノードのPut失敗データ同期部17からタイムアウトによりPutが失敗したデータの同期のためのGet要求を受信し、自装置のPut失敗データ同期部17に渡す。ただし、ターシャリ3のPut/Get実行部13は、Put失敗データ同期部17を備えず、データ記憶部11に記憶したデータをセカンダリ2のPut失敗データ同期部17に送信する。
【0028】
また、Put/Get実行部13は、Put失敗データ同期部17から同期用のデータを受け取ると、受け取ったデータをデータ記憶部11に書き込むとともに多重化チェーン情報で順序が前のノードに同期用のデータを送信する。ただし、プライマリ1のPut/Get実行部13は、受け取ったデータをデータ記憶部11に書き込んで同期処理を終了する。
【0029】
ノード間Put要求部14は、Put/Get実行部13の指示に基づいて多重化チェーン情報で順序が次のノードにPut要求を送信する。そして、ノード間Put要求部14は、多重化チェーン情報で順序が次のノードからPut要求に対する応答を受信すると、Put/Get実行部13に通知する。
【0030】
また、ノード間Put要求部14は、多重化チェーン情報で順序が次のノードへ送信したPut要求に対する応答が所定の時間内に得られない場合に、タイムアウトによるPut失敗をPut/Get実行部13に通知する。このように、ノード間Put要求部14がタイムアウトによるPut失敗をPut/Get実行部13に通知することによって、分散ストレージシステム100はPut処理中に発生するネットワークおよびノードの障害に対応することができる。
【0031】
多重化情報変更実行部15は、制御ノード4から多重化情報の変更要求を受信し、多重化情報保持部12が保持する多重化情報を更新する。多重化情報の変更は、ノードの障害、ノードの障害からの回復、ノードの再配置などによりノード間でのデータの移動や各ノードの有する役割の変更があったときに行われる。
【0032】
Put失敗データ名保持部16は、Putに失敗し、非同期状態にあるデータのデータ名をPut失敗データ名として保持する。Put/Get実行部13は、Put失敗データ名保持部16がデータ名を保持するデータに対するクライアント5からのGet要求をロックし、クライアント5にエラーすなわち障害発生によるPut失敗を返信する。したがって、分散ストレージシステム100は、非同期状態にあるデータがクライアント5に送信されることを防ぐことができる。
【0033】
Put失敗データ同期部17は、Put失敗データ名保持部16を参照して、Putに失敗したデータを同期する処理を行う。すなわち、Put失敗データ同期部17は、多重化チェーン情報で順序が次のノードのPut/Get実行部13にデータ名を指定して同期用データの送信を要求し、送信された同期用データを自装置のPut/Get実行部13に渡す。また、Put失敗データ同期部17は、自装置のPut/Get実行部13により同期用データのデータ記憶部11への書き込みが完了するとPut失敗データ名からデータ名を削除する。
【0034】
なお、同期処理は、多重化チェーン情報で順序が先頭のノードのPut失敗データ同期部17により開始される。他のノードのPut失敗データ同期部17は、多重化チェーン情報で順序が前のノードのPut失敗データ同期部17による同期用データの取得要求を受けて同期処理を行う。
【0035】
制御ノード4は、分散ストレージシステム100を制御するノードであり、多重化情報変更要求部41を有する。多重化情報変更要求部41は、多重化チェーン情報などに変更があった場合に、保持する多重化情報の変更を各ノードに要求する。
【0036】
次に、実施例に係る分散ストレージシステム100の正常時の処理手順について図2〜図3を用いて説明する。図2は、実施例に係る分散ストレージシステム100による正常時のPut処理の処理手順を示すフローチャートである。図2に示すように、プライマリ1のPut/Get実行部13は、クライアント5からPut要求を受信する(ステップS1)と、多重化情報保持部12からセカンダリ情報を取得する(ステップS2)。そして、Put/Get実行部13は、受信したPut要求と同じPut要求をセカンダリ2に発行するようにノード間Put要求部14に指示し、ノード間Put要求部14は、セカンダリ2に対してPut要求を発行する(ステップS3)。
【0037】
すると、セカンダリ2のPut/Get時実行部13は、プライマリ1からPut要求を受信し(ステップS4)、多重化情報保持部12からターシャリ情報を取得する(ステップS5)。そして、Put/Get実行部13は受信したPut要求と同じPut要求をターシャリ3に発行するようにノード間Put要求部14に指示し、ノード間Put要求部14はターシャリ3に対してPut要求を発行する(ステップS6)。
【0038】
すると、ターシャリ3のPut/Get実行部13は、セカンダリ2からPut要求を受信し(ステップS7)、セカンダリ2に「OK」を返信する(ステップS8)とともに、データをデータ記憶部11に書き込む(ステップS9)。
【0039】
そして、セカンダリ2のノード間Put要求部14はターシャリ3から「OK」を受信し(ステップS10)、Put/Get実行部13に「成功」を通知する。すると、Put/Get実行部13は、プライマリ1に「OK」を返信する(ステップS11)とともに、データをデータ記憶部11に書き込む(ステップS12)。
【0040】
そして、プライマリ1のノード間Put要求部14はセカンダリ2から「OK」を受信し(ステップS13)、Put/Get実行部13に「成功」を通知する。すると、Put/Get実行部13は、クライアント5に「OK」を返信する(ステップS14)とともに、データをデータ記憶部11に書き込む(ステップS15)。
【0041】
このように、分散ストレージシステム100は、クライアント5→プライマリ1→セカンダリ2→ターシャリ3→セカンダリ2→プライマリ1→クライアント5、といったようなチェーン型の書き込みを行う。また、各ノードは、Put処理中、すなわち、Put処理を開始してから通信処理等を行ってデータ記憶部11への書き込みが完了するまでの間、同じデータに対する他のPut要求やGet要求はブロックする。
【0042】
図3は、実施例に係る分散ストレージシステム100による正常時のGet処理の処理手順を示すフローチャートである。図3に示すように、プライマリ1、セカンダリ2およびターシャリ3は、それぞれGet要求をクライアント5から受信する(ステップS21、S31、S41)と、データをデータ記憶部11から読み出す(ステップS22、S32、S42)。そして、クライアント5に読み出したデータを送信する(ステップS23、S33、S43)。
【0043】
このように、クライアント5は、プライマリ1、セカンダリ2、ターシャリ3のどこからでもデータを取得することができる。また、あるノードがGet処理中に他のノードが同一データに対するGet処理を行うことができる。
【0044】
なお、あるデータのPut処理中は、そのデータに対する他のPut要求およびGet要求はブロックされ、最初のPut処理が完了した後に、後から来たPut要求およびGet要求に対する処理が行われる。
【0045】
図4は、Put処理中にセカンダリ2にGet要求が来た場合の処理の流れを示す図である。図4において、○で囲まれたWは、データ記憶部11へのデータの書き込みを示し、○で囲まれたRはデータ記憶部11からのデータの読み出しを示す。また、長方形は、Put処理を示す。図4に示すように、Get要求は、セカンダリ2においてPut処理が完了するまでブロックされ、Put処理が完了した後、すなわち、セカンダリ2がプライマリ1に返答を返してデータ記憶部11に書き込みを行った後に、処理される。これにより、正常時におけるデータの一貫性を保持することができる。
【0046】
次に、実施例に係る分散ストレージシステム100の異常時の処理手順について図5〜図7を用いて説明する。図5は、実施例に係る分散ストレージシステム100による異常時のPut処理の処理手順を示す第1のフローチャートである。なお、図5は、図13に示したケース(1)の障害が発生した場合の処理手順を示す。また、図5において、ステップS1〜ステップS9の処理は図2の処理と同様であるので、ここでは説明を省略する。
【0047】
図5に示すように、ターシャリ3がセカンダリ2に「OK」を返信した時点でセカンダリ2に障害が発生している場合には、プライマリ1のノード間Put要求部14は、Put要求に対する応答がないので、タイムアウトを検出する(ステップS51)。
【0048】
すると、プライマリ1において、ノード間Put要求部14は、「失敗」をPut/Get実行部13に通知する。すると、Put/Get実行部13は、クライアント5にタイムアウトによるエラーを返信する(ステップS52)とともに、Putを要求されたデータの書き込みをデータ記憶部11に行う(ステップS53)。
【0049】
そして、プライマリ1において、Put/Get実行部13は、Putを要求されたデータのデータ名をPut失敗データ名保持部16に書き込み(ステップS54)、Put失敗データ同期部17にデータの同期を指示する。そして、プライマリ1において、Put失敗データ同期部17が、Put失敗データ名保持部16を参照し、ターシャリ3と連携してデータの同期処理を行う(ステップS55)。
【0050】
なお、プライマリ1による同期処理は、障害発生直後はセカンダリ2に障害が発生しているため失敗するが、しばらくするとセカンダリ2の故障が検出され、ターシャリ3がセカンダリ2に昇格する。すると、新たにセカンダリとなった旧ターシャリに対してプライマリ1が同期処理を開始する。
【0051】
また、同期処理が完了するまで、プライマリ1は、該当データに対する他のPut要求は待たせ、Get要求はリトライを要求するエラーを返す。エラーを受け取ったクライアント5は、多重化チェーンの最後尾に対してGet要求を発行する。多重化チェーンの最後尾へのGetはブロックされないため、最後尾のノードはGet処理を実行することができる。
【0052】
このように、セカンダリ2がPut要求をターシャリ3に発行した後でセカンダリ2に障害が発生すると、プライマリ1がタイムアウトを検出して同期処理を開始するので、分散ストレージシステム100はデータの一貫性を保持することができる。
【0053】
なお、ここでは、ターシャリ3がセカンダリ2に「OK」を返信した時点でセカンダリ2に障害が発生している場合について説明した。しかし、セカンダリ2がターシャリ3から「OK」を受信してプライマリ1に「OK」を送信する前にセカンダリ2に障害が発生した場合にも同様に、プライマリ1がタイムアウトを検出し、同期処理を行うことができる。
【0054】
図6は、実施例に係る分散ストレージシステム100による異常時のPut処理の処理手順を示す第2のフローチャートである。なお、図6は、図13に示したケース(2)の障害が発生した場合の処理手順を示す。また、図6において、ステップS1〜ステップS9の処理は図2の処理と同様であるので、ここでは説明を省略する。
【0055】
図6に示すように、ターシャリ3がセカンダリ2に返答する際に、ネットワークに一時的な通信障害が起こると、セカンダリ2のノード間Put要求部14は、Put要求に対する応答がないので、タイムアウトを検出する(ステップS61)。
【0056】
すると、セカンダリ2において、ノード間Put要求部14は、「失敗」をPut/Get実行部13に通知する。すると、セカンダリ2において、Put/Get実行部13は、プライマリ1にタイムアウトによるエラーを返信する(ステップS62)とともに、Putを要求されたデータの書き込みをデータ記憶部11に行う(ステップS63)。そして、セカンダリ2において、Put/Get実行部13は、Putを要求されたデータのデータ名をPut失敗データ名保持部16に書き込む(ステップS64)。
【0057】
そして、プライマリ1のノード間Put要求部14は、タイムアウトによるエラーを受信する(ステップS65)と、Put/Get実行部13に通知する。すると、プライマリ1において、Put/Get実行部13は、クライアント5にタイムアウトによるエラーを返信する(ステップS66)とともに、Putを要求されたデータの書き込みをデータ記憶部11に行う(ステップS67)。そして、プライマリ1において、Put/Get実行部13は、Putを要求されたデータのデータ名をPut失敗データ名保持部16に書き込み(ステップS68)、Put失敗データ同期部17にデータの同期を指示する。そして、Put失敗データ同期部17が、Put失敗データ名保持部16を参照し、セカンダリ2およびターシャリ3と連携してデータの同期処理を行う(ステップS69)。
【0058】
このように、ターシャリ3がセカンダリ2に返答する際にネットワークに一時的な通信障害が起きると、セカンダリ2がタイムアウトを検出してプライマリ1に返信する。そして、タイムアウトの通知を受信したプライマリ1が同期処理を開始するので、分散ストレージシステム100はデータの一貫性を保持することができる。
【0059】
図7は、実施例に係る分散ストレージシステム100による異常時のPut処理の処理手順を示す第3のフローチャートである。なお、図7は、図13に示したケース(3)の障害が発生した場合の処理手順を示す。また、図7において、ステップS1〜ステップS12の処理は図2の処理と同様であるので、ここでは説明を省略する。
【0060】
図7に示すように、セカンダリ2がプライマリ1に返答する際に、ネットワークに一時的な通信障害が起こると、プライマリ1のノード間Put要求部14は、Put要求に対する応答がないので、タイムアウトを検出する(ステップS71)。
【0061】
すると、プライマリ1において、ノード間Put要求部14は、「失敗」をPut/Get実行部13に通知する。すると、Put/Get実行部13は、クライアント5にタイムアウトによるエラーを返信する(ステップS72)とともに、Putを要求されたデータの書き込みをデータ記憶部11に行う(ステップS73)。そして、プライマリ1において、Put/Get実行部13は、Putを要求されたデータのデータ名をPut失敗データ名保持部16に書き込み(ステップS74)、Put失敗データ同期部17にデータの同期を指示する。そして、プライマリ1において、Put失敗データ同期部17が、Put失敗データ名保持部16を参照し、セカンダリ2およびターシャリ3と連携してデータの同期処理を行う(ステップS75)。
【0062】
このように、セカンダリ2がプライマリ1に返答する際にネットワークに一時的な通信障害が起きると、セカンダリ1がタイムアウトを検出して同期処理を開始するので、分散ストレージシステム100はデータの一貫性を保持することができる。
【0063】
次に、同期処理の処理手順について説明する。図8は、同期処理の処理手順を示すフローチャートである。なお、図8では、プライマリ1およびセカンダリ2がPut失敗データ名保持部16にPutが失敗したデータのデータ名として“a”を記憶し、プライマリ1、セカンダリ2およびターシャリ3がデータの同期を行う。
【0064】
図8に示すように、プライマリ1のPut失敗データ同期部17は、セカンダリ2に対してデータ名“a”のGet要求を発行する(ステップS81)。すると、セカンダリ2のPut/Get実行部13がセカンダリ2のPut失敗データ同期部17に対してターシャリ3へのGet要求の発行を指示し、セカンダリ2のPut失敗データ同期部17がターシャリ3に対してデータ名“a”のGet要求を発行する(ステップS82)。
【0065】
すると、ターシャリ3のPut/Get実行部13がデータ名“a”のデータをデータ記憶部11から読み出してセカンダリ2に対して返信する(ステップS83)。すると、セカンダリ2のPut失敗データ同期部17がデータを受け取ってセカンダリ2のPut/Get実行部13に渡し、セカンダリ2のPut/Get実行部13がデータ記憶部11へのデータ書き込み処理を実行する(ステップS84)。
【0066】
また、セカンダリ2のPut失敗データ同期部17は、Put失敗データ名保持部16が保持するPut失敗データ名からデータ名“a”を削除し(ステップS85)、データ名“a”に対するGetロックを解除する(ステップS86)。そして、セカンダリ2のPut/Get実行部13が、プライマリ1に対してデータ名“a”のデータを返信する(ステップS87)。
【0067】
すると、プライマリ1のPut失敗データ同期部17がデータを受け取ってプライマリ1のPut/Get実行部13に渡し、プライマリ1のPut/Get実行部13がデータ記憶部11へのデータ書き込み処理を実行する(ステップS88)。
【0068】
また、プライマリ1のPut失敗データ同期部17は、Put失敗データ名保持部16が保持するPut失敗データ名からデータ名“a”を削除し(ステップS89)、データ名“a”に対するGetロックを解除する(ステップS90)。
【0069】
このように、プライマリ1、セカンダリ2およびターシャリ3が同期処理を行うことによって、分散ストレージシステム100は、Putに失敗したデータの一貫性を保持することができる。
【0070】
上述してきたように、実施例では、ノード間Put要求部14が多重化チェーンの順序が次のノードに発行したPut要求に対するタイムアウトを検出してPut/Get実行部13に通知する。すると、Put/Get実行部13は、多重化チェーンの順序が前のノードまたはクライアント5にエラーを返信するとともにPut失敗データ同期部17にPutに失敗したデータの同期を指示し、Put失敗データ同期部17が同期処理を行う。したがって、分散ストレージシステム100は、Put処理中に一部のノードに障害やネットワークに一時的な通信障害が発生した場合にも、データの一貫性を保持することができる。
【0071】
なお、プライマリ1は、同期処理が完了するまでは他のPut要求を待たせ、Get要求はエラーを返す。また、Get要求でエラーを受け取ったクライアント5は、多重化チェーンの最後尾に対してGet要求を発行する。したがって、分散ストレージシステム100は、各ノードに余計なデータを保持させることなく、常に矛盾しないデータをクライアント5に返すことができる。
【0072】
なお、実施例では、各ノードが「プライマリ」、「セカンダリ」、「ターシャリ」のいずれかの役割を有する場合について説明した。しかしながら、各ノードは複数の役割を有することが可能であり、データごとに異なる役割を果たすことが可能である。そこで、各ノードが複数の役割を有する場合の同期処理について図9および図10を用いて説明する。
【0073】
図9は、各ノードが複数の役割を有する場合に保持するデータの一例を示す図である。図9で、スロットとは、データ名の名前空間を分割したものであり、データがどのスロットに属するかはデータ名から一意に決定される。図9では名前空間は3つのスロット−1、スロット−2およびスロット−3に分割されている。
【0074】
そして、ノードAはスロット−1に属するデータに対しては「プライマリ」の役割を果たし、スロット−2に属するデータに対しては「ターシャリ」の役割を果たし、スロット−3に属するデータに対しては「セカンダリ」の役割を果たす。また、ノードBはスロット−1に属するデータに対しては「セカンダリ」の役割を果たし、スロット−2に属するデータに対しては「プライマリ」の役割を果たし、スロット−3に属するデータに対しては「ターシャリ」の役割を果たす。また、ノードCはスロット−1に属するデータに対しては「ターシャリ」の役割を果たし、スロット−2に属するデータに対しては「セカンダリ」の役割を果たし、スロット−3に属するデータに対しては「プライマリ」の役割を果たす。
【0075】
また、ノードの障害、ノードの障害からの回復、ノードの再配置などによりノード間でのデータの移動や各ノードの有する役割の変更が発生した場合、データの移動や役割の変更はスロット単位で行われる。例えば、スロット−1に対する「プライマリ」の役割は、ノード再配置によりノードAの役割から新たなノードDの役割に変更されることがある。また、このような、ノードの障害、ノードの障害からの回復、ノードの再配置などによるノード間でのデータの移動や各ノードの有する役割の変更は、同期処理中にも発生する。したがって、Put失敗データ名の移動も同期処理中に発生する。
【0076】
そこで、各ノードのPut失敗データ名保持部16は、スロット単位でPut失敗データ名を保持する。例えば、図9に示すように、ノードAは、スロット−1に属するデータに関しては“a”、“b”、“c”、“y”、“z”をPut失敗データ名として保持し、スロット−3に属するデータに関しては“moge”をPut失敗データ名として保持する。ただし、ノードAは、スロット−2に属するデータに対しては「ターシャリ」すなわち多重化チェーンの最後尾の役割を果たすので、スロット−2に関してはPut失敗データ名を保持しない。ここで、スロット−1に対する「プライマリ」の役割が、ノード再配置によりノードAの役割から新たなノードDの役割に変更され、ノードAからノードDにスロット−1のデータがコピーされたとすると、ノードAのスロット−1に属するPut失敗データ名はノードDに移動され、ノードAから削除される。
【0077】
また、図9に示すスロット−2の状況において、「ターシャリ」であるノードAで障害が発生し、「セカンダリ」であるノードCが多重化チェーンの最後尾となると、データ名“aa”はPut失敗データ名から削除される。その理由は、多重化チェーンの最後尾にあるデータを正しいデータとみなすためである。このように、Put失敗データ名保持部16が、スロット単位でPut失敗データ名を保持することによって、分散ストレージシステム100は、ノード再配置時等に発生する同期対象データの変更を効率良く行うことができる。
【0078】
図10は、各ノードが複数の役割を有する場合の同期処理の処理手順を示すフローチャートである。なお、図10では、スロット−3に属するデータ名“xyz”に対してノードCがプライマリ1として動作し、ノードAがセカンダリ2として動作し、ノードBがターシャリ3として動作する。また、ノードCだけがPut失敗データ名保持部16にPutが失敗したデータ名として“xyz”を保持する。
【0079】
図10に示すように、プライマリ1であるノードCのPut失敗データ同期部17は、セカンダリ2であるノードAに対してデータ名“xyz”のGet要求を発行する(ステップS91)。すると、ノードAのPut/Get実行部13がノードAのPut失敗データ同期部17に対してターシャリ3であるノードBへのGet要求の発行を指示し、ノードAのPut失敗データ同期部17がノードBに対してデータ名“xyz”のGet要求を発行する(ステップS92)。
【0080】
すると、ノードBのPut/Get実行部13がデータ名“xyz”のデータをデータ記憶部11から読み出してノードAに対して返信する(ステップS93)。すると、ノードAのPut失敗データ同期部17がデータを受け取ってノードAのPut/Get実行部13に渡し、ノードAのPut/Get実行部13がノードCに対してデータ名“xyz”のデータを返信する(ステップS94)。
【0081】
すると、ノードCのPut失敗データ同期部17がデータを受け取ってノードCのPut/Get実行部13に渡し、ノードCのPut/Get実行部13がデータ記憶部11へのデータ書き込み処理を実行する(ステップS95)。
【0082】
また、ノードCのPut失敗データ同期部17はPut失敗データ名保持部16が保持するPut失敗データ名からスロット−3に含まれるデータ名“xyz”を削除し(ステップS96)、データ名“xyz”に対するGetロックを解除する(ステップS97)。
【0083】
このように、各ノードはスロットごとに異なる役割を果たすため、スロットごとに異なるノードが同期処理を開始する。
【0084】
また、実施例では、ストレージ装置としてのノードについて説明したが、ノードが有する構成をソフトウェアによって実現することで、同様の機能を有するデータ管理プログラムを得ることができる。そこで、データ管理プログラムを実行するコンピュータについて説明する。
【0085】
図11は、実施例に係るデータ管理プログラムを実行するコンピュータの構成を示す機能ブロック図である。図11に示すように、コンピュータ200は、RAM210と、CPU220と、HDD230と、LANインタフェース240と、入出力インタフェース250と、DVDドライブ260とを有する。
【0086】
RAM210は、プログラムやプログラムの実行途中結果などを記憶するメモリであり、CPU220は、RAM210からプログラムを読み出して実行する中央処理装置である。HDD230は、プログラムやデータを格納するディスク装置であり、クライアント5からPutされたデータを記憶する。LANインタフェース240は、コンピュータ200をLAN経由で他のコンピュータに接続するためのインタフェースである。入出力インタフェース250は、マウスやキーボードなどの入力装置および表示装置を接続するためのインタフェースであり、DVDドライブ260は、DVDの読み書きを行う装置である。
【0087】
そして、コンピュータ200において実行されるデータ管理プログラム211は、DVDに記憶され、DVDドライブ260によってDVDから読み出されてコンピュータ200にインストールされる。あるいは、データ管理プログラム211は、LANインタフェース240を介して接続された他のコンピュータシステムのデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータ200にインストールされる。そして、インストールされたデータ管理プログラム211は、HDD230に記憶され、RAM210に読み出されてCPU220によって実行される。
【0088】
また、実施例では、同期処理においてターシャリ3が記憶するデータをプライマリ1まで転送する場合について説明した。しかしながら、同期処理において他の方法を用いることもできる。例えば、各データにバージョン番号などを付与し、まずターシャリ3が記憶するバージョン番号をプライマリ1まで転送する。そして、バージョン番号で特定されるデータをプライマリ1が有しない場合にのみデータをターシャリ3からプライマリ1まで転送する。このように、同期処理を2段階にすることで、分散ストレージシステムは、同期処理時のデータ転送量を削減することができる。
【0089】
また、実施例では、Put/Get実行部13は、Putの要求元に返答を返してからデータ記憶部11への書き込みを実行している。しかしながら、Put/Get実行部13は、返答を返す前にデータ記憶部11への書き込みを実行することもできる。データ記憶部11への書き込みタイミングは、静的に決められこともあれば、ストレージ装置故障に伴う多重度の変化等に応じて動的に決められることもある。例えば、Put/Get実行部13は、正常時には返答を返してからデータ記憶部11への書き込みを実行し、多重度が1となってしまった場合のみ、返答を返す前にデータ記憶部11への書き込みを実行することもできる。
【0090】
また、実施例では、分散ストレージシステム100が3台のノードを有する場合について説明したが、本発明はこれに限定されるものではなく、分散ストレージシステムが4台以上のノードを有する場合にも同様に適用することができる。
【0091】
すなわち、プライマリ1とターシャリ3の間に複数のセカンダリ2がある場合にも本発明を同様に適用することができる。この場合、複数のセカンダリ2のいずれかに障害が発生したときには、多重化チェーンで順番が前のノードによってタイムアウトが検出され、多重化チェーンを逆にたどってプライマリ1にタイムアウトによるエラーが通知される。そして、プライマリ1は、障害が発生したノード以外のノードとの間で同期処理を行う。また、複数のセカンダリ2のうちの2つのセカンダリ間を接続するネットワークに一時的な通信障害が発生した場合には、Put要求を発行したセカンダリ2によってタイムアウトが検出される。そして、タイムアウトを検出したセカンダリ2から多重化チェーンを逆にたどってプライマリ1にタイムアウトによるエラーが通知される。そして、プライマリ1は、一時的な通信障害が復旧すると他のノードとの間で同期処理を行う。
【0092】
また、実施例では、分散ストレージシステム100が3台のノードを有する場合について説明したが、本発明はこれに限定されるものではなく、分散ストレージシステムが2台のノードを有する場合にも同様に適用することができる。すなわち、分散ストレージシステムがプライマリ1とターシャリ3を有し、プライマリ1とターシャリ3を接続するネットワークに一時的な通信障害が発生した場合には、Put要求を発行したプライマリ1によってタイムアウトが検出される。そして、タイムアウトを検出したプライマリ1は、一時的な通信障害が復旧するとターシャリ3との間で同期処理を行う。
【符号の説明】
【0093】
1,10 プライマリ
2,20 セカンダリ
3,30 ターシャリ
4 制御ノード
5 クライアント
11 データ記憶部
12 多重化情報保持部
13 Put/Get実行部
14 ノード間Put要求部
15 多重化情報変更実行部
16 Put失敗データ名保持部
17 Put失敗データ同期部
41 多重化情報変更要求部
51 Put/Get要求部
100 分散ストレージシステム
200 コンピュータ
210 RAM
211 データ管理プログラム
220 CPU
230 HDD
240 LANインタフェース
250 入出力インタフェース
260 DVDドライブ

【特許請求の範囲】
【請求項1】
他のストレージ装置と同一のデータを記憶するストレージ装置に、
前記データを記憶する他のストレージ装置である第1の装置またはクライアント装置のいずれか一方から前記データについて更新データの書き込み要求を受け付け、
前記データを記憶する他のストレージ装置であって前記第1の装置とは異なる第2の装置に前記更新データの書き込みを要求し、
前記第2の装置から所定の時間内に応答がない場合または前記第2の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行った第1の装置またはクライアント装置に障害発生による書き込み失敗を通知し、
前記データを記憶する他のストレージ装置との間で前記データについて同期をとる
処理を実行させることを特徴とするデータ管理プログラム。
【請求項2】
前記同期をとる処理が完了するまでは、クライアント装置からの前記データの読み出し要求に対して再要求を該クライアント装置に依頼する処理をさらに前記コンピュータに実行させることを特徴とする請求項1に記載のデータ管理プログラム。
【請求項3】
前記更新データの書き込み要求を前記クライアント装置から受け付け、
前記第2の装置から所定の時間内に応答がない場合または前記第2の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行ったクライアント装置に障害発生による書き込み失敗を通知し、
前記同期をとる処理が完了するまでは、前記データに関する他の書き込み要求を待たせる処理をさらに前記コンピュータに実行させることを特徴とする請求項1または2に記載のデータ管理プログラム。
【請求項4】
前記第2の装置から所定の時間内に応答がない場合または前記第2の装置から障害発生による書き込み失敗を通知された場合に、前記データを識別するデータ識別子をストレージ装置間でのデータ再配置の単位であるスロット単位で記憶し、スロット単位で記憶したデータ識別子を用いて他のストレージ装置との間で前記データについて同期をとる処理を前記コンピュータに実行させることを特徴とする請求項1、2または3に記載のデータ管理プログラム。
【請求項5】
他のストレージ装置と同一のデータを記憶するストレージ装置によって実行されるデータ管理方法において、
前記データを記憶する他のストレージ装置である第1の装置またはクライアント装置のいずれか一方から前記データについて更新データの書き込み要求を受け付け、
前記データを記憶する他のストレージ装置であって第1の装置とは異なる第2の装置に前記更新データの書き込みを要求し、
前記第2の装置から所定の時間内に応答がない場合または前記第2の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行った第1の装置またはクライアント装置に障害発生による書き込み失敗を通知し、
前記データを記憶する他のストレージ装置との間で前記データについて同期をとる
ことを特徴とするデータ管理方法。
【請求項6】
他のストレージ装置と同一のデータを記憶するストレージ装置において、
前記データを記憶する他のストレージ装置である第1の装置またはクライアント装置のいずれか一方から前記データについて更新データの書き込み要求を受け付ける受付部と、
前記データを記憶する他のストレージ装置であって前記第1の装置とは異なる第2の装置に前記更新データの書き込みを要求する要求部と、
前記第2の装置から所定の時間内に応答がない場合または前記第2の装置から障害発生による書き込み失敗を通知された場合に、前記更新データの書き込み要求を行った第1の装置またはクライアント装置に障害発生による書き込み失敗を通知する通知部と、
前記データを記憶する他のストレージ装置との間で前記データについて同期をとる同期部と
を有することを特徴とするストレージ装置。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12a】
image rotate

【図12b】
image rotate

【図13】
image rotate


【公開番号】特開2013−114628(P2013−114628A)
【公開日】平成25年6月10日(2013.6.10)
【国際特許分類】
【出願番号】特願2011−263062(P2011−263062)
【出願日】平成23年11月30日(2011.11.30)
【出願人】(000005223)富士通株式会社 (25,993)
【Fターム(参考)】