【実施例1】
【0021】
まず、第1実施例について説明する。
【0022】
図1は、第1実施例に係る計算機システムの全体構成図である。
【0023】
計算機システム10は、1以上のホストコンピュータ(以下、ホストという)400と、管理計算機410と、複数のノード(計算機)100(100a、100b、100c等)とを備える。なお、計算機システム10に含まれる複数のノード群をストレージクラスタという。
【0024】
各ノード100は、SAN(Storage Area Network)300や、LAN(Local Area Network)310、バックエンドSAN320等で接続されている。また、ホスト400、管理計算機410、及びノード100は、SAN300やLAN310によって接続されている。このような構成により、ノード100間や、ノード100とホスト400との間、ノード100と管理計算機410との間で、制御情報やデータ等が送信される。
【0025】
次に、ノード100について詳細に説明する。
【0026】
図2は、第1実施例に係る計算機システムにおけるノードを含む一部の構成図である。
【0027】
ノード100は、ネットワークインタフェース110、プロセッサ部の一例としてのCPU120、メモリコントローラ130、ディスクコントローラ140、ストレージデバイス150、外部ストレージインタフェース160、入出力インタフェース170、内部ネットワークバス180、及びメモリ200を備える。ノード100は、各構成110、120、130、140、150、160、170、180、200のいずれか1つ以上を複数備えるようにしてもよい。なお、以下の説明においては、説明容易にするために、各構成が1つずつ存在している場合を例にする。
【0028】
ネットワークインタフェース110は、ノード100を、ホスト400、管理計算機410等の他の計算機とネットワーク111を介して通信可能に接続するためのインタフェースである。ノード100は、ネットワークインタフェース110を用いて、データや制御情報を、他の計算機とやり取りする。ネットワーク111は、例えば、SAN300、LAN310、インターネットでもよく、専用線でも、公衆回線でもよい。
【0029】
CPU120は、1以上のコアから構成されるプロセッサである。CPU120は、ある決まったタスクを高速かつ効率よく処理するために、GPU(Graphics Processing Unit)やASIC(Application Specific Integrated Circuit)であってもよい。CPU120は、メモリ200に格納された各種プログラムを実行することにより、各種処理を実行する。
【0030】
メモリコントローラ130は、CPU120からの指示に従って、メモリ200からのデータ読み取り、または、メモリ200へのデータの書き込みを行う。
【0031】
ディスクコントローラ140は、CPU120からの指示に従って、ストレージデバイス150からのデータ読み取り、または、ストレージデバイス150へのデータの書き込みを行う。
【0032】
ストレージデバイス150は、HDD(Hard Disk Drive)やSSD(Solid State Drive)等のデータを記憶するためのデバイスである。ストレージデバイス150は、ユーザデータ、OS、アプリケーションプログラム、アプリケーションデータ、ディスク管理用メタデータ、ノード100を運用するために必要なデータ等を格納する。ストレージデバイス150は、例えば、複数の物理ディスクを使用して設定された論理デバイスでもよく、RAIDによりデータ保護されていてもよい。ストレージデバイス150には、例えば、ホスト400から参照可能なボリュームが格納される。
【0033】
外部ストレージインタフェース160は、ノード100に接続された、1以上の外部ストレージシステム191、ストレージデバイス192等の外部ストレージとの間でのデータ転送を行う。ストレージデバイス192は、ストレージデバイス150と同様な構成としてもよい。ストレージデバイス192は、接続されているノード100で管理するボリュームを格納するようにしてもよい。なお、ストレージデバイス192に格納されているボリュームについても、ノード100に格納されているボリュームということができる。
【0034】
入出力インタフェース170は、ノード100に接続された入出力デバイス194との間の通信を行う。
【0035】
内部ネットワークバス180は、ノード100の各要素(110,120,130,140,160,170,200)を通信可能に接続する。
【0036】
メモリ200は、例えば、1以上のDRAM(Dynamic Random Access Memory)等により構成される。メモリ200は、各種情報を記憶する。メモリ200は、CPU120による処理中のデータや将来的に使用する可能性のあるデータを一時的に格納するキャッシュメモリ210を含んでもよい。キャッシュメモリ210は、データブロック管理のためのメタデータを一時的に格納してもよいし、OSやアプリケーションプログラムの処理に必要になる情報、CPU間の通信に必要な制御情報を格納してもよい。
【0037】
本実施例では、メモリ200は、ノードのペア情報を管理する制御情報であるペア管理テーブル220を格納する。また、メモリ200は、CPU120が実行するプログラムを格納する。本実施例では、メモリ200は、データ書き込みプログラム740、回復ボリューム作成プログラム780、再同期プログラム800、その他の必要なプログラムを格納する。
【0038】
ノード100は、汎用的または専用的な目的で使用される計算機又はシステムであり、例えば、ブロックデータストレージシステム、ファイルデータストレージシステム、オブジェクトデータストレージシステム、ユニファイドストレージシステムなどになり得る。
【0039】
次に、ペア管理テーブル220について詳細に説明する。
【0040】
図3は、第1実施例に係るペア管理テーブルの一例の構成図である。
【0041】
ペア管理テーブル220は、ノード100によって管理されている各ボリュームについてのペアに関する設定情報と、そのペアの状態とを格納する。ペア管理テーブル220は、ボリューム毎に対応するエントリーを格納する。ペア管理テーブル220のエントリーは、ボリュームID221と、HA(High Availability)ペア状態222と、HAペアボリューム情報223と、回復ペア状態224と、回復ペアボリューム情報225とのフィールドを含む。
【0042】
ボリュームID221には、エントリーに対応するボリュームの識別情報(ボリュームID)が格納される。HAペア状態222には、エントリーに対応するボリュームのHAペアの状態(HAペア状態)が格納される。ここで、HAペアとは、一方のボリュームのノードが停止した場合に、他方のボリュームのノードが引き続きデータを提供できるようにする関係を確保する対象とするボリュームのペアのことをいう。また、HAペア状態としては、HAペアとなるボリューム間で引き続きデータを提供できる状態(すなわち、データが同期している状態)を示す「PAIR」(ペア)と、HAペアの一方が一時的にオフラインとなっている状態を示す「一時的にオフライン」等がある。HAペアボリューム情報222には、エントリーに対応するボリュームとHAペアを組むボリューム(HAペアボリューム)の識別情報(ID)が格納される。
【0043】
回復ペア状態224には、エントリーに対応するボリュームと、このボリュームとHAペアにあるボリュームを回復させるために利用される回復ボリュームとを含む回復ペアの状態(回復ペア状態)が格納される。ここで、回復ペアとは、エントリーに対応するボリュームと、回復ボリュームとのペアのことをいう。また、回復ペア状態としては、回復ペアとなるボリューム間でデータが同期している状態を示す「PAIR」等がある。回復ペアボリューム情報225には、エントリーに対応するボリュームと回復ペアを組む回復ボリュームの識別情報(ID)が格納される。
【0044】
次に、ボリュームを回復させるための回復ボリュームに対して格納させるジャーナルログ600について詳細に説明する。
【0045】
図4は、第1実施例に係るジャーナルログの一例の構成図である。
【0046】
ジャーナルログ600は、固定長のヘッダ610と、可変長のボディ620とを含む。ヘッダ610は、ジャーナルログサイズ611と、エントリー数612とのフィールドを有する。ジャーナルログサイズ611には、ジャーナルログ600の全体のサイズが格納される。エントリー数612には、ボディ620に含まれる後述するエントリー621の総数が格納される。
【0047】
ボディ620は、1以上のエントリー621(621a,621b・・・)を有する。エントリー621は、LBA622と、オフセット623と、サイズ624と、データ625とのフィールドを有する。LBA622には、更新データ(ライトデータ)を格納したボリューム内の論理ブロックアドレス(LBA)が格納される。オフセット623には、LBAにおける更新した場所を示す情報(例えば、先頭からのバイト数)が格納される。サイズ624には、更新データのサイズが格納される。データ625には、更新データが格納される。データ625は、可変長のフィールドである。
【0048】
次に、管理計算機410について詳細に説明する。
【0049】
図5は、第1実施例に係る管理計算機の構成図である。
【0050】
管理計算機410は、ネットワークインタフェース411、プロセッサ部の一例としてのCPU412、メモリコントローラ413、ディスクコントローラ414、ストレージデバイス415、メモリ416、入出力インタフェース417、及び内部ネットワークバス418を備える。
【0051】
ネットワークインタフェース411は、管理計算機410を、ホスト400、ノード100等の他の計算機と通信可能に接続するためのインタフェースである。
【0052】
CPU412は、1以上のコアから構成されるプロセッサである。CPU412は、メモリ416に格納された各種プログラムを実行することにより、各種処理を実行する。
【0053】
メモリコントローラ413は、CPU412からの指示に従って、メモリ413からのデータ読み取り、または、メモリ413へのデータの書き込みを行う。
【0054】
ディスクコントローラ414は、CPU412からの指示に従って、ストレージデバイス415からのデータ読み取り、または、ストレージデバイス415へのデータの書き込みを行う。
【0055】
ストレージデバイス415は、HDDやSSD等のデータを記憶するためのデバイスである。ストレージデバイス415は、OS、アプリケーションプログラム、アプリケーションデータ、その他のデータ等を格納する。
【0056】
入出力インタフェース417は、管理計算機410に接続された入出力デバイス419との間の通信を行う。
【0057】
内部ネットワークバス418は、管理計算機410の各要素(411,412,413,414,416,417)を通信可能に接続する。
【0058】
メモリ416は、例えば、1以上のDRAM等により構成される。メモリ416は、各種情報を記憶する。メモリ416は、計画停止プログラム700、データ再同期プログラム720、その他の必要なプログラムを格納する。
【0059】
次に、ホスト400について詳細に説明する。
【0060】
図6は、第1実施例に係るホストコンピュータによるHAペアのボリュームへのアクセスを説明する図である。
【0061】
ホスト400は、例えば、CPU、メモリ等を備えた一般的な計算機であり、Microsoft Windows(登録商標)や、Linux(登録商標)等のOS(Operating system)401や、マルチパスソフトウェア402をメモリに格納して実行する。
【0062】
ホスト400は、例えば、
図6(a)に示すように、ノード100aのボリューム155aに対して、SAN300を経由するパス301aにより接続されており、また、ノード100bのボリューム155bに対して、SAN300を経由するパス301bにより接続されている。
【0063】
ここで、ノード100aのボリューム155aと、ノード100bのボリューム155bとが、HAペアとして設定されている場合には、ノード100aと、ノード100bとは、ホスト400のマルチパスソフトウェア402に対して、ボリューム155aとボリューム155bとのそれぞれについて、同じボリュームIDを返す。この場合には、マルチパスソフトウェア402は、パス301aと、パス301bとに接続されているボリュームに対して同じボリュームIDを利用できること判定し、
図6(b)に示すように、パス301aと、パス301bとの2つのパスに仮想ノード100kが接続され、その仮想ノード100k内に仮想ボリューム155kがあると想定する。
【0064】
このようにHAペアが設定されている場合には、マルチパスソフトウェア402は、仮想ボリューム155kにアクセスする際に、パス301a又は、パス301bを利用する。なお、ノード100aのボリューム155aと、ノード100bのボリューム155bとをHAペアと設定している場合には、いずれのボリュームがPVOL(Primary Volume)であるかをノード間で統一できていない問題、所謂スプリットブレイン問題が発生する可能性がある。これに対しては、いずれのボリュームがPVOLであるか等を管理する所謂クォーラムディスクを、HAペアのボリュームを管理するノード100a、100bと異なるノード100に設けるようにしてもよい。
【0065】
次に、ノード停止に関わるデータ管理処理について説明する。
【0066】
図7は、第1実施例に係るノード停止に関わるデータ管理処理を説明する図である。
【0067】
ここで、計算機システム10は、
図7(a)に示すような初期状態にあるものとする。具体的には、計算機システム10には、ノード100a、ノード100b、及びノード100cがあり、ノード100aには、ボリューム155aが管理され、ノード100bには、ボリューム155bが管理され、ボリューム155aと、ボリューム155bとが、HAペアとして構成されているものとする。なお、ノード100cを、ボリューム155aと、ボリューム155bとのHAペアのクォーラムディスクを保持するノードとして使用してもよい。
【0068】
図7(a)に示す状態においては、ホスト400は、IO要求をボリューム155a又はボリューム155bに送ることができる。ホスト400からいずれかのボリュームに対するライト要求があった場合には、ライト要求の対象のライトデータは、ボリューム155aと155bとの間で同期され、結果として、ボリューム155aと155bとに冗長化(2重化)されて保持されることとなる。一方、ホスト400からいずれかのボリュームに対するリード要求があった場合には、リード要求を受信したノードが自身のボリュームからリード対象のデータを読み出して、ホスト400に送信することとなる。
【0069】
ここで、ノード100a(第1ノード)を計画停止するときには、
図7(b)に示すように、管理計算機410の計画停止プログラム700は、HAペアであるボリューム155aと155bとを格納しているノード100a及びノード100b(第2ノード)以外のノード100c(第3ノード)に、ノード100aの動作を再開した場合にボリューム155aを回復するための回復ボリューム156a(ここでは、ジャーナルログ600を格納するジャーナルボリューム)を作成し、ボリューム155bと、回復ボリューム156aとにより、回復ペアを作成する。この場合において、ノード100bのボリューム155bに対するホスト400からのライト要求(ホストライトIO)のライトデータは、ボリューム155bと回復ボリューム156aとにより、二重化される。
【0070】
図7(b)に示す状態において、ノード100bに障害が発生した場合には、
図7(c)に示すように、ホスト400からノード100bのボリューム155bに対してアクセスすることができなくなる。
【0071】
図7(c)に示す状態となった場合には、ノード100aの停止を解除した後に、
図7(d)に示すように、管理計算機410のデータ再同期プログラム720は、ノード100cの回復ボリューム156aに格納されたジャーナルログ600を用いて、ボリューム155aを最新のデータを保持した状態に回復させる。
【0072】
具体的には、管理計算機410のデータ再同期プログラム720は、ホスト400からのIOを一時的に止めた状態で、ノード100aのボリューム155aと回復ボリューム156aとを再同期ペアに設定する。これにより、ノード100cの再同期プログラム800が、回復ボリューム156aに格納された全てのジャーナルログ600を読み、各ジャーナルログ600の各エントリー621のデータを、ボリューム155aにおけるエントリー621のLBA622が示す論理ブロックに対して、オフセット623が示すアドレスをオフセットとして書き出す。これにより、ノード100aのボリューム155aは、最新のデータを保持した状態となる。
【0073】
この後、管理計算機410のデータ再同期プログラム720が、ノード100aのボリューム155aに対するホスト400からのIOを再開すると、
図7(e)に示すように、ホスト400は、最新のデータを保持しているボリューム155aに対してIOを行うことができるようになる。なお、ボリューム155aを最新のデータに回復させた後においては、回復ボリューム156aのジャーナルログ600の全てのエントリーを削除するようにしてもよい。
【0074】
次に、計算機システム10が3つのノード100(100a、100b、100c)を備え、これらノード100により管理されている複数のボリュームに対して、複数のHAペアを構成している場合における回復ボリュームの作成方法について説明する。
【0075】
図8は、第1実施例に係る複数のHAペアと、それらに関する回復ボリュームを説明する図である。
【0076】
ここで、計算機システム10は、
図8(a)に示すような初期状態にあるものとする。具体的には、計算機システム10には、ノード100a、ノード100b、及びノード100cがあり、ノード100aには、ボリューム155a,155cが保持され、ノード100bには、ボリューム155b,155eが保持され、ノード100cには、ボリューム155d,155fが保持されているものとする。また、ノード100aのボリューム155aと、ノード100bのボリューム155bとが、HAペア(第1HAペア)として構成され、ノード100aのボリューム155cと、ノード100cのボリューム155dとが、HAペア(第2HAペア)として構成され、ノード100bのボリューム155eと、ノード100cのボリューム155fとが、HAペア(第3HAペア)として構成されているものとする。
【0077】
図8(a)に示す状態において、ノード100aを停止させる場合には、計算機システム10は、
図8(b)に示すような構成とする。
【0078】
ノード100aを停止させると、第1HAペアと、第2HAペアについては、そのHAペアの一方のボリュームが使用できない状態となる。この場合においては、計算機システム10では、第1HAペアに対しては、ノード100cに回復ボリューム156aが作成され、ボリューム155bに対するライト要求のジャーナルログ600が、回復ボリューム156aに格納されることとなる。また、第2HAペアに対しては、ノード100bに回復ボリューム156bが作成され、ボリューム155dに対するライト要求のジャーナルログ600が、回復ボリューム156bに格納されることとなる。
【0079】
一方、第3HAペアについては、そのHAペアの両方のボリュームがノード100aに存在しないので、そのまま利用することができる。なお、第3HAペアに関するクォーラムディスクをノード100aに作成している場合においては、ノード100aが停止してしまうとクォーラムディスクを利用することができなくなる。この場合においては、スプリットブレイン問題を回避するために、管理計算機410の計画停止プログラム700は、HAペアのいずれか一方のボリュームへのホスト400からのIOを停止させて、ホストからのIOを受け付けるボリュームを1つとし、このボリュームを保持するノードが、このボリュームに対するライトデータを、他のボリュームへ同期コピーするようにしてもよい。
図8(b)に示す例では、管理計算機410は、ボリューム155fに対するホスト400からのIOを停止し、ノード100bがボリューム155eに対するホスト400からのライトデータをボリューム155fへも書き込むことにより、データを二重化する。
【0080】
次に、計算機システム10における処理動作について説明する。
【0081】
図9は、第1実施例に係るノード計画停止処理のフローチャートである。
【0082】
ノード計画停止処理は、管理計算機410において、CPU412がメモリ416の計画停止プログラム700を実行することにより実現される処理である。
【0083】
管理計算機410の計画停止プログラム700は、入力デバイス419を介して管理者から計画停止するノード(第1ノード)を指定した計画停止の要求(ノード計画停止要求)を受け付ける(ステップS701)。
【0084】
次いで、計画停止プログラム700は、計画停止の対象となるノードが保持するボリュームであって、データ冗長度の維持が必要なボリュームを決定する(ステップS702)。具体的には、計画停止プログラム700は、停止対象の対象となるノード100に対して、そのノードが保持するボリュームとHAペアを構成している全てのボリュームのボリューム情報の要求を送信する。これに対して、ボリューム情報の要求を受けたノード100は、ペア管理テーブル220を参照し、HAペア状態222がPAIRであるエントリーのボリュームID221のボリュームIDと、HAペアボリューム情報223に格納されているボリューム情報とを特定し、そのボリュームIDと、ボリューム情報とを管理計算機410の計画停止プログラム700に送信する。この後、計画停止プログラム700は、取得したボリュームIDと、ボリューム情報とに基づいて、データ冗長度の維持が必要なボリュームを決定する。
【0085】
なお、管理者がHAペアを構成するボリュームのボリュームIDを指定することにより、回復ボリュームを作成する対象のボリュームを決定するようにしてもよい。また、管理計算機410において、ストレージクラスタを構成する複数のノード100がそれぞれ保持する最新のペア管理テーブル220の情報を予め取得しておき、計画停止プログラム700は、予め取得している情報に基づいてデータ冗長度の維持が必要なボリュームを決定するようにしてもよい。このようにすると、ノード計画停止処理時において、計画停止対象のノード100に対して、ボリューム情報を問い合わせる処理を省略することができる。
【0086】
次いで、計画停止プログラム700は、予め記憶しているストレージクラスタを構成しているノード100の情報を参照して、計画停止の対象のノード100のボリュームを回復するための回復ボリューム155を作成するノード100(第3ノード)を選択する(ステップS703)。
【0087】
計画停止プログラム700は、以下の2つの条件を満たすノード100を、回復ボリュームを作成するノード(第3ノード)として選択する。
条件1:ノードは、すぐに停止されるノードであってはいけない。
条件2:ノードは、計画停止対象のノードがオフラインの間、データ冗長度の維持が必要なボリュームに関するジャーナルログを格納できるだけの十分な空き容量を持つノードでなくてはならない。
【0088】
計画停止プログラム700は、計画停止対象のノード100内のデータの冗長性が必要な各ボリュームに対して、回復ボリュームを作成するノード100を選択する。回復ボリュームを作成するノード100として、冗長性が必要な各ボリュームとHAペアを構成するボリュームを保持するノード(第2ノード)と異なるノードが選択される。
【0089】
次いで、計画停止プログラム700は、選択されたノード100へ回復ボリュームの作成を指示する要求(回復ボリューム作成要求)を送る(ステップS704)。回復ボリューム作成要求を受けたノード100は、回復ボリュームを作成する。
【0090】
次いで、計画停止プログラム700は、データ冗長度の維持が必要なボリュームとHAペアを構成するボリュームを保持するノード100と、回復ボリュームを作成させたノード100とに対して、これらボリューム間で回復ボリュームペアを組むように指示する要求(回復ボリュームペア要求)を送る(ステップS705)。回復ボリュームペア要求を受信したそれぞれのノード100は、回復ボリュームペア要求に対応するボリューム情報を、各ノード100が持つペア管理テーブル220の要求に対応するエントリーの回復ペアボリューム情報225に格納する。
【0091】
次いで、計画停止プログラム700は、計画停止対象のノード100と、計画停止対象のノード100のボリュームとHAペアを構成するボリュームを保持するノード100に対して、これらのボリュームのHAペアを停止する要求を送信し、計画停止対象のノード100には、HAペアを構成するボリュームをオフラインにする要求を送信する(ステップS706)。
【0092】
この結果、計画停止対象のノード100は、自身のキューに格納されている処理中のIO要求をすべて処理し、対象のボリュームをオフラインとし、ペア管理テーブル220のそのボリュームに対応するエントリーのHAペア状態222を一時的にオフラインに設定する。一方、計画停止対象のノード100のボリュームとHAペアを構成するボリュームを保持するノード100は、ペア管理テーブル220のそのボリュームに対応するエントリーのHAペア状態222を一時的にオフラインに設定する。
【0093】
次いで、計画停止プログラム700は、計画停止対象のノード100に対して、停止要求を送る(ステップS707)。停止要求を受けたノード100は、自身の動作を停止し、オフライン状態にする。
【0094】
以上説明したように、上記したノード計画停止処理によると、データの冗長性が必要な各ボリュームに対応する回復ボリュームを作成でき、その回復ボリュームに対して、データの冗長性が必要な各ボリュームに反映させるべきジャーナルログを格納できるようになる。また、データの冗長性が必要な各ボリュームの全体を他のノードにコピーする必要が無いので、処理時間を低減することができると共に、必要となるリソースを低減することができ、比較的容易にデータの冗長性を保持することができる。
【0095】
次に、一旦停止させたノード100のボリュームを最新のデータに回復させるためのボリューム回復処理について説明する。
【0096】
図10は、第1実施例に係るボリューム回復処理のフローチャートである。
【0097】
ボリューム回復処理は、管理計算機410において、CPU412がメモリ416のデータ再同期プログラム720を実行することにより実現される処理である。ボリューム回復処理は、例えば、或るノード100の計画停止中に、アクティブとなっているボリュームに障害が発生した場合や、ノード100の計画停止が終了した場合等に実行される。
【0098】
管理計算機410のデータ再同期プログラム720は、計画停止されているノード100に対して、データの冗長性が必要であり、回復対象となるボリューム(回復対象ボリューム)がホスト400からのIO要求を受け付けない状態でオンにする要求を送信する(ステップS721)。この要求を受け取ると、計画停止されているノード100は、IO要求を受け付けない状態でのオン状態となる。
【0099】
次いで、データ再同期プログラム720は、オン状態となったノード100(再開ノード)に対して、回復対象ボリュームと、回復対象ボリュームに対応する回復ボリュームとを再同期ペアとする要求(再同期ペア要求)を送る。再同期ペア要求を受け取った再開ノードは、回復ボリュームを保持するノード100へ再同期ペア要求を送るとともに、ペア管理テーブル220の回復対象ボリュームに対応するエントリーの回復ペア状態224に再同期を設定する(ステップS722)。
【0100】
次いで、データ再同期プログラム720は、再開ノードへ再同期プログラム800の実行を開始する要求(実行開始要求)を送る(ステップS723)。実行開始要求を受け取った再開ノードは、再同期プログラム800の実行を開始する。再同期プログラム800は、回復対象ボリュームを、回復ボリュームが保持する最新のデータで更新する。これにより、回復対象ボリュームを最新の状態に回復させることができる。
【0101】
次いで、データ再同期プログラム720は、回復対象ボリュームの再同期(最新の状態となること)が完了するまで待つ(ステップS724)。なお、再開ノードからの再同期に関する完了の応答を非同期で待ってもよく、その間、別の回復対象ボリュームに対する処理を実行してもよい。
【0102】
回復対象ボリュームの再同期が完了した後に、データ再同期プログラム720は、再開ノードへ回復対象ボリュームのホスト400からのIOの受付を許可するようにする要求(IO受付許可要求)を送る(ステップS725)。IO受付許可要求を受け取ると、再開ノードは、回復対象ボリュームを、ホスト400からのIOを受け付け可能な状態とする。この結果、ホスト400は、パス再スキャンを実行することにより、再開ノードの回復対象ボリュームが利用可能になったことを発見することができ、回復対象ボリュームに対するIO要求を発行できるようになる。
【0103】
次いで、データ再同期プログラム720は、回復ボリュームを保持するノード100に対して回復ボリュームを削除する要求(回復ボリューム削除要求)を送る。この結果、回復ボリュームを保持するノード100では、回復ボリュームを削除することができ、使用可能な記憶容量を増加させることができる。なお、回復ボリュームを削除せずに、この回復ボリュームを、他のノード100を計画停止させる際の回復ボリュームとして利用するようにしてもよい。
【0104】
以上説明したように、上記したボリューム回復処理によると、再開ノードのボリュームを最新のデータに回復させて、ホスト400から利用できるようにすることができる。
【0105】
次に、ノード100におけるホスト400からの書き込み要求(ライト要求)があった場合のホストライトIO処理について説明する。
【0106】
図11は、第1実施例に係るホストライトIO処理のフローチャートである。
【0107】
ホストライトIO処理は、ノード100において、CPU120がメモリ200のデータ書き込みプログラム740を実行することにより実現される処理である。
【0108】
データ書き込みプログラム740は、ホスト400からライト要求と、ライト要求の対象のデータ(ライトデータ)を受信すると(ステップS741)、ライト要求の要求先のボリュームがPVOLであるかSVOL(Secondary Volume)であるかを判定する(ステップS742)。
【0109】
この結果、要求先のボリュームがSVOLである場合(ステップS742:SVOL)には、データ書き込みプログラム740は、ライト要求先のボリュームとHAペアを構成するPVOLであるボリュームを保持するノード100に対して、受信したライト要求と、ライトデータとを転送し(ステップS743)、処理をステップS741に進める。
【0110】
一方、要求先のボリュームがPVOLである場合(ステップS742:PVOL)には、データ書き込みプログラム740は、ライトデータを、要求先のボリュームに書き込む(ステップS744)。
【0111】
次いで、データ書き込みプログラム740は、ペア管理テーブル220の要求先のボリュームに対応するエントリーを参照し、そのエントリーのHAペア状態222に設定されているHAペア状態を確認する(ステップS745)。
【0112】
この結果、HAペア状態がペアである場合(ステップS745:ペア)には、データ書き込みプログラム740は、そのエントリーにおけるHAペアボリューム情報223からHAペアとなっているボリューム(HAペアボリューム)を特定し、このボリュームを保持するノードに対して、当該ボリュームへの書き込み要求と、ライトデータを送信し(ステップS746)、この要求に対する確認応答(ACK)を受信した後(ステップS747)、処理をステップS748に進める。これにより、HAペアを構成するボリュームのペアに同一データを格納させることができる、すなわち、データを冗長化することができる。
【0113】
一方、HAペア状態がペア以外である場合(ステップS745:ペア以外)には、データ書き込みプログラム740は、処理をステップS748に進める。
【0114】
ステップS748では、データ書き込みプログラム740は、ペア管理テーブル220の要求先のボリュームに対応するエントリーの回復ペア状態224に格納されている回復ペア状態を確認する。
【0115】
この結果、回復ペア状態がペアである場合(ステップS748:ペア)には、データ書き込みプログラム740は、そのエントリーにおける回復ペアボリューム情報225から回復ペアとなっているボリューム(回復ボリューム)を特定し、この回復ボリュームを保持するノードに対して、当該回復ボリュームへの書き込み要求と、ライトデータを送信する(ステップS749)。この要求を受け取ったノードでは、そのノードのデータ書き込みプログラム740が、書き込み要求に対応する内容(書き込み先のLBA、オフセット、データサイズ、データ等)をジャーナルログ600に追加し、要求に対する確認応答(ACK)を返すこととなる。要求を送信したノード100では、確認応答を受信した後(ステップS750)、処理をステップS751に進める。これにより、回復ペアを構成する回復ボリュームにライトデータを格納させることができる、すなわち、ライトデータを冗長化することができる。
【0116】
一方、回復ペア状態がペア以外である場合(ステップS748:ペア以外)には、データ書き込みプログラム740は、処理をステップS751に進める。
【0117】
ステップS751では、データ書き込みプログラム740は、ホスト400からのライト要求が完了したことをホスト400へ応答する。
【0118】
次に、HAペアを構成するボリュームを保持するノード100との間でネットワーク障害が発生した場合におけるネットワーク障害発生時処理を説明する。なお、本例では、ネットワーク障害には、ノード100との間のネットワーク自体に障害が発生していて通信できない状態だけでなく、ノード100自体に障害が発生していて通信ができない状態を含んでいる。
【0119】
図12は、第1実施例に係るネットワーク障害発生時処理のフローチャートである。
【0120】
ネットワーク障害発生時処理は、ノード100において、CPU120がメモリ200の回復ボリューム作成プログラム780を実行することにより実現される処理である。
【0121】
回復ボリューム作成プログラム780は、ペア管理テーブル220を参照し、自身のノード100で保持するボリュームとHAペアを構成するボリュームを保持するノードの中で、通信不可となっているノード100を検出する(ステップS781)と、自身のボリュームに対するホスト400からのIO要求に基づくIO処理を停止する(ステップS782)。
【0122】
次いで、回復ボリューム作成プログラム780は、HAペアの状態を停止し、ペア管理テーブル220のこのボリュームに対応するエントリーのHAペア状態222に停止を設定する(ステップS783)。
【0123】
次いで、回復ボリューム作成プログラム780は、通信不可となっているノードのHAペアを構成するボリュームを回復するための回復ボリュームを作成するノードを選択する(ステップS784)。
【0124】
本実施形態では、この回復ボリュームを作成するノードは、以下のいずれか1つの処理によって決定している。
処理1 計算機システム10における全てのオンラインであるノードと通信し、最大の空き容量を持つノードを選択する。
処理2 計算機システム10における全てのオンラインであるノードと通信し、十分な空き容量を持ち、かつ、IOワークロードが最も低いノードを選択する。
処理3 管理計算機410と通信し、管理計算機410による処理1又は処理2の実行により得られた結果に対応するノードを選択する。
【0125】
以下、選択されたノード100を回復用ノードという。
【0126】
次いで、回復ボリューム作成プログラム780は、回復用ノードに対して、回復ボリュームを作成する要求(回復ボリューム作成要求)を送信する(ステップS785)。回復ボリューム作成要求を受信した回復用ノードでは、回復ボリュームを作成することとなる。
【0127】
次いで、回復ボリューム作成プログラム780は、自身のボリュームと、作成された回復ボリュームとにより回復ペアを作成し、この回復ペアの情報を、ペア管理テーブル220のボリュームに対応するエントリーの回復ペアボリューム情報225に格納する(ステップS786)。なお、回復用ノードも、ペア管理テーブル220の回復ボリュームに対応するエントリーの回復ペアボリューム情報225に、回復ペアの情報を格納する。これにより、これ以降において、HAペアのうちのアクティブなボリュームに対してライトデータが書き込まれた場合に、そのライトデータが適切に回復ボリュームに格納されるようになる。
【0128】
次いで、回復ボリューム作成プログラム780は、ホスト400からのIO処理を停止しているボリュームに対するIO処理を再開する(ステップS787)。これにより、このノード100では、
図11に示すホストライトIO処理が実行されることとなる。
【0129】
これにより、HAペアを構成するボリュームを保持するノード100との間でネットワーク障害が発生した場合において、その後においてボリュームに書き込まれるライトデータを適切に冗長化して格納することができる。