(57)【要約】  本発明は、１つまたは複数の物理ディスクの所有権を確立するために永続的な予約技法を実装するための方法、システム、およびコンピュータープログラム製品に及ぶ。これらの永続的な予約技法は、ストレージプール内、ならびに任意の他のストレージ構成内で物理ディスクの所有権を決定するために使用することができる。本発明の永続的な予約技法を使用すると、ネットワークパーティションが発生したとき、物理ディスクのディフェンダーは、チャレンジャーがもはやディフェンダーのパーティション内にないという通知をディフェンダーが受け取るまでチャレンジャーの登録鍵を除去しない。このようにして、チャレンジャー上で実行するアプリケーションからの保留中のＩ／Ｏは、物理ディスクの適正な所有権を解決することができるまで、チャレンジャーの鍵が除去されることにより失敗することはない。
2015508213.tif 000002
【特許請求の範囲】
【請求項１】
クラスタの第１のノードにおいて、前記第１のノードが、前記クラスタ内のノードによって共有される記憶デバイスに対する永続的な(persistent)予約(reservation)を所有しており、前記第１のノードの永続的な予約をプリエンプト(preempt)しようとする別のノードの試み(attempt)に対して前記第１のノードが防御するための方法であって、
前記第１のノードが前記クラスタ内の別のノードと通信するのを妨げる(prevents)ネットワークパーティションの後、および前記第１のノードが前記ネットワークパーティションについて通知される前に、前記第１のノードが、前記クラスタ内のノードによって共有される前記記憶デバイスを前記クラスタ内の別のノードが予約(reserve)しようと試みた(attempted)ことを検出するステップであって、前記検出は、前記別のノードが、登録データ構造内の前記別のノードの登録鍵(registration key)を変更したことを識別する(identifying)ことを含む、ステップと、
前記第１のノードが前記第１のノードの登録鍵を変更し、前記変更された登録鍵を前記登録データ構造内で登録し(registering)、前記変更された登録鍵を予約データ構造(reservation data structure)内で予約するステップと
を含む方法。
【請求項２】
前記第１のノードが前記ネットワークパーティションの通知を受け取るステップと、
前記第１のノードが、前記別のノードが前記記憶デバイスにアクセスするのを防止するために前記別のノードの登録鍵を前記登録データ構造から除去するステップと
をさらに含む、請求項１に記載の方法。
【請求項３】
前記別のノードの登録鍵を除去する前に、前記第１のノードがクォーラム(quorum)を有するパーティションの一部であると前記第１のノードが決定するステップをさらに含む、請求項２に記載の方法。
【請求項４】
前記第１のノードが前記ネットワークパーティションの通知を受け取るステップと、
前記第１のノードがクォーラムを有していないパーティションの一部であると前記第１のノードが決定するステップと、
前記第１のノードの永続的な予約をプリエンプトしようとする別のノードの試みに対して防御する(defend)のに前記第１のノードが失敗する(failing)ステップと
をさらに含む、請求項１に記載の方法。
【請求項５】
前記第１のノードおよび別のノードの変更された登録鍵が、それぞれ前記第１のノードおよび別のノードの登録鍵の増分された(incremented)バージョンを含む、請求項１に記載の方法。
【請求項６】
前記登録データ構造および前記予約データ構造が、同じデータ構造または別々のデータ構造である、請求項１に記載の方法。
【請求項７】
クラスタの第２のノードにおいて、前記クラスタが、前記クラスタ内の第１のノードが永続的な予約を有する記憶デバイスを共有しており(sharing)、前記第２のノードが前記第１のノードの永続的な予約を除去し、前記第２のノードのための永続的な予約を得ようと試みるための方法であって、
前記第２のノードが前記第１のノードと通信するのを妨げるネットワークパーティションが発生したという通知を前記第２のノードが受け取るステップと、
前記第２のノードが、前記記憶デバイスに対する永続的な予約を得るように前記第２のノードの登録鍵を予約しようと試みるステップとを含み、前記予約しようと試みるステップが、
前記第２のノードが、予約データ構造内に記憶されている前記第１のノードの前記登録鍵を読み取り、前記第１のノードの鍵を記憶するステップ、
前記第２のノードが、前記第２のノードの登録鍵を変更し、前記変更された登録鍵を登録するステップ、および
前記第２のノードが、指定された期間の間スリープ(sleeping)してから、プリエンプトコマンドを発行し、前記第１のノードの永続的な予約を除去するステップを含む、方法。
【請求項８】
前記第２のノードが、前記指定された期間の後で起動状態(awaking)になるステップと、
前記第２のノードがプリエンプトコマンドを発行し、前記第１のノードの永続的な予約を除去しようと試みるステップであって、前記プリエンプトコマンドが、前記第２のノードの変更された登録鍵と、前記予約データ構造から読み取られた前記第１のノードの登録鍵とを含む、ステップと、
前記第１のノードが前記第１のノードの登録鍵を変更し、その結果、前記プリエンプトコマンド内の前記第１のノードの登録鍵が前記予約データ構造内に予約されている前記第１のノードの登録鍵の現在の変更されているバージョンと一致しないので、前記プリエンプトコマンドが失敗したという通知を前記第２のノードが受け取るステップと
をさらに含む、請求項７に記載の方法。
【請求項９】
記第２のノードが、前記指定された期間の後で起動状態になるステップと、
前記第２のノードがプリエンプトコマンドを発行し、前記第１のノードの永続的な予約を除去しようと試みるステップであって、前記プリエンプトコマンドが、前記第２のノードの変更された登録鍵と、前記予約データ構造から読み取られた前記第１のノードの登録鍵とを含む、ステップと、
前記第２のノードの変更された登録鍵が前記登録データ構造内に含まれており、前記プリエンプトコマンド内の前記第１のノードの登録鍵が前記予約データ構造内の前記第１のノードの登録鍵と一致するので、前記プリエンプトコマンドが成功したという通知を前記第２のノードが受け取るステップと
をさらに含む、請求項７に記載の方法。
【請求項１０】
前記記憶デバイスが、複数の記憶デバイスを含むストレージプール(storage pool)の一部である、請求項７に記載の方法。
【請求項１１】
記第２のノードが、前記指定された期間の後で起動状態になるステップと、
前記第２のノードが、アクセス可能である前記プール内の記憶デバイスすべてを列挙する(enumerating)ステップと、
アクセス可能な記憶デバイスの数が前記プール内の前記記憶デバイスの過半数未満(less than a majority)である場合、前記第２のノードがプリエンプトコマンドを発行するのに失敗するステップと
をさらに含む、請求項１０に記載の方法。
【請求項１２】
記第２のノードが、前記指定された期間の後で起動状態になるステップと、
前記第２のノードが、前記プール内の各記憶デバイスに対して指定された順序でプリエンプトコマンドを発行するステップと
をさらに含む、請求項１０に記載の方法。
【請求項１３】
プリエンプトコマンドが失敗した場合、前記第２のノードが、前記プール内のそれ以上他の記憶デバイスに対してプリエンプトコマンドを発行するのを止める(ceasing)ステップをさらに含む、請求項１２に記載の方法。
【請求項１４】
前記第２のノードが前記第２のノードの登録鍵を予約しようと試みる前に、前記第２のノードがクォーラムを有するパーティション内にある、または前記第２のノードが前記記憶デバイスに対する永続的な予約を得た場合クォーラムを有することになると前記第２のノードが決定するステップをさらに含む、請求項７に記載の方法。
【請求項１５】
ノードのクラスタであって、
前記クラスタのノードによって共有された記憶デバイスのプール内の複数の記憶デバイスのそれぞれに対して永続的な予約を所有する第１のノードを備え、前記第１のノードが、前記プール内の各記憶デバイスに対するその永続的な予約を防御するために、
前記第１のノードが前記クラスタ内の第２のノードと通信するのを妨げるネットワークパーティションの後、および前記第１のノードが前記ネットワークパーティションについて通知される前に、前記クラスタの前記第２のノードが前記プール内の各記憶デバイスの所有権(ownership)を取ろうとしていることを検出し、前記検出は、前記第２のノードが、第２のノードの登録鍵の増分されたバージョンを各記憶デバイスについて登録データ構造に追加した(added)ことを識別することを含むこと、および
各記憶デバイスについて、前記第１のノードの登録鍵を増分し、前記増分された登録鍵を前記登録データ構造内で登録し、前記増分された登録鍵を予約データ構造内で予約することを実施し、
前記第２のノードが、前記ネットワークパーティションについて通知されたとき前記プール内の各記憶デバイスに対する永続的な予約を得ようと試みて、
各記憶デバイスについて、前記予約データ構造内に記憶されている前記第１のノードの前記登録鍵を読み取り、前記第１のノードの鍵を記憶すること、
各記憶デバイスについて、前記第２のノードの登録鍵を増分し、前記増分された登録鍵(registration key)を登録すること、および
指定された期間の間スリープしてから、前記記憶デバイスのそれぞれに対してプリエンプトコマンドを発行し、各記憶デバイスに対する前記第１のノードの永続的な予約をプリエンプトしようと試みることを実施する、クラスタ。
【発明の詳細な説明】
【技術分野】
【０００１】
本願発明の一実施例は、例えば、ストレージプール内のディスク所有権の調停に関する。
【背景技術】
【０００２】
[0001]
[0002]コンピューターシステム、および関連技術は、社会の多くの側面に影響を及ぼす。実際、情報を処理するためのコンピューターシステムの能力は、我々の暮らし方や働き方を一変した。今や、コンピューターシステムは一般に、コンピューターシステムの出現前には手作業で実施されていた多数のタスク（たとえば、ワードプロセッシング、スケジューリング、会計など）を実施する。ごく最近では、コンピューターシステムは、互いに、また他の電子デバイスに結合され、有線および無線のコンピューターネットワークを形成しており、このコンピューターネットワーク上でコンピューターシステムおよび他の電子デバイスが電子データを転送することができる。したがって、多数のコンピューティングタスクの実施が、いくつかの異なるコンピューターシステムおよび／またはいくつかの異なるコンピューティング環境にわたって分散される。
【０００３】
[0003]クラスタ化は、本明細書ではノードと呼ばれる複数のコンピューターシステムをグループ化することを指す。クラスタは、しばしば、共有ストレージを使用し、ノードのいずれかで実行されるアプリケーションが同じデータにアクセスすることを可能にする。共有ストレージは、クラスタ内のノード間でのアプリケーションのフェイルオーバーを可能にする。たとえば、ノードが故障した場合、その故障したノード上で実行されるアプリケーションを、それらが引き続き実行される別のノードに入れ替えることができる。フェイルオーバーされたアプリケーションによって使用されるデータは任意のノードからアクセス可能な共有ストレージ上に記憶されているので、アプリケーションは、別のノードに切り替えられた後で引き続き実行する（たとえば、同じデータにアクセスする）ことができる。このようにして、フェイルオーバーは、ユーザーから見て本質的に透過的なものである。
【０００４】
[0004]クラスタを実装するためには、ノードの間で一貫性を維持することが必要である。たとえば、クラスタ構成データは、各ノードがその構成データに対してアクセスを有するにしても、ノードの間で依然として一貫しているべきである。各ノードがクラスタ内の他のノードと通信することができる限り、一貫性を維持することができる。クラスタによっては、各ノードがクラスタ構成データのコピーを記憶し、クラスタサービスがノードの間でデータを同期する。
【０００５】
[0005]ネットワークパーティションが発生し、したがってノードが通信できないとき、１つの問題が発生する。図１（従来技術）は、ネットワークパーティション１０７がクラスタ１００内で発生し、ノードの第１のパーティション（ノード１０１〜１０２）がノードの第２のパーティション（ノード１０３〜１０４）と通信できない例を示す。共有ストレージ１０６は、クラスタの各ノードにとって依然としてアクセス可能であるが、第１のパーティション内のノードは、第２のパーティション内のノードと通信することができない。クラスタ内のそのような分割が発生したとき、一貫性が確実に維持されるように、１つのパーティションだけがクラスタとして機能し続けることが必要である。
【０００６】
[0006]クラスタ内の１つのパーティションだけが確実に実行し続ける（すなわち、共有ストレージ１０６に対するアクセスを保持する）ためには、クラスタサービスは、パーティションにクォーラムを有するように要求する。一般に、クォーラムを有するとは、パーティションがクラスタ内の要素の過半数を含むことを意味する。クラスタの構成に応じて、要素は、クラスタのノード、またおそらくはディスク（ディスク証人（ｄｉｓｋ  ｗｉｔｎｅｓｓ）と呼ばれることもある）またはファイル共有を含むことができる。ディスク証人は、偶数のノードが存在するとき使用され、タイが発生するはずの状況（たとえば、過半数を決定するときそれらのノードだけが考慮される場合）を防止する。
【０００７】
[0007]図１では、第１のパーティションと第２のパーティションが共に同じ数のノードを有する。したがって、共有ストレージ１０６の所有権を有するどちらのパーティションも、クォーラム（すなわち、２つのノード＋１つのディスク）を有することになる。ノードは、ディスクを所有するとき、ディスクに対して書込みアクセスを有する。他のノードもディスクに書き込むことができるが、所有者は、どのノードがアクセスを有するか制御することができる。このようにして、単一のノードが、誰がディスクにアクセスすることができるかに対して制御することができる。図１では、ネットワークパーティション１０７の発生前、ノード１０１が共有ストレージ１０６の所有権を有する。
【０００８】
[0008]一般に、所有者ノードは、クラスタのメンバである、また（たとえばパーティションが発生したとき）所有者ノードのパーティション内にあることを知っているノードに対してアクセスを可能にする。したがって、パーティションが発生したとき、ディスクを所有するノードは、過半数外のノードが共有ストレージにアクセスするのを防止する責任を負う。たとえば、図１では、ノード１０１は、所有者として、ネットワークパーティション１０７が発生した後、ノード１０３〜１０４が共有ストレージ１０６にアクセスするのを防止することになる。
【０００９】
[0009]ディスク所有権は、一般に、永続的な予約（Ｐｅｒｓｉｓｔｅｎｔ  Ｒｅｓｅｒｖａｔｉｏｎ、ＰＲ）として知られるＳＣＳＩプロトコルを使用して決定および管理される。ＰＲは、防御／チャレンジ機構である。ＰＲでは、各ノードが、登録鍵として知られる一意の鍵を有する。ディスクの所有権を得るために、ノードは、登録されたそれ自体の鍵を有していなければならず、次いで、その鍵で予約を得なければならない。
【００１０】
[0010]図２Ａ（従来技術）は、ＰＲで使用される２つのテーブルを示す。図２Ａは、ノード１０１がディスク（共有ストレージ１０６）の現在の所有者であるとき２つのテーブルの状態を表す。２つのテーブルがこの例で示されているが、ＰＲは、単一のテーブル、または同様の情報を記憶するための他のデータ構造を使用して実装することができる。
【００１１】
[0011]ディスクに対する書込みアクセスを有するために、ノードは、その登録鍵を登録しなければならない。ノードは、その鍵を登録テーブル２０１に追加することによってその鍵を登録する。たとえば、登録テーブル２０１は、ノード１０１〜１０４のそれぞれが、それらの鍵を登録済みであることを示す。したがって、ノード１０１〜１０４は、共有ストレージ１０６に対して書込みアクセスを有する。
【００１２】
[0012]登録された後、次いでノードは、その鍵を、予約テーブル２０２に追加することによって予約しようと試みることができる。たとえば、予約テーブル２０２は、ノード１０１がその鍵を予約することに成功し、それによりノード１０１をそのディスクの所有者にすることを示す。ノードは、その鍵を予約した後で、その鍵を使用し、ディスクを制御することができる。
【００１３】
[0013]しかし、ノード（チャレンジャーと呼ばれる）がその鍵を予約しようと試みたとき予約がすでに存在する場合、予約は失敗することになる。たとえば、ノード１０１の鍵がすでに予約されているので、他のノードの、予約しようとする試みは失敗することになる。この失敗した予約の一部として、チャレンジャーは、現在の予約鍵（たとえば、ノード１０１の鍵）を受け取る。
【００１４】
[0014]予約がすでに存在するとき、ノードは、それ自体の鍵を受け取ることができる前に、まず予約をプリエンプトしなければならない。所有者ノード（ディフェンダーと呼ばれる）がディスクのその所有権を防御することを可能にするために、ＰＲ規則はチャレンジャーに、予約が失敗した後、プリエンプトコマンドを発光する前に、指定された期間（概して６秒）待つことを要求する。この期間後、チャレンジャーは起動状態になり、ディフェンダーの鍵を予約テーブルから除去しようと試みるためにプリエンプトコマンドを発行する。プリエンプトコマンドは、チャレンジャーの鍵と、現在の予約鍵（チャレンジャーが予約に失敗したとき受け取った予約テーブル内に予約されたディフェンダーの鍵）とを指定する。たとえば、プリエンプトコマンドは、予約テーブル２０２から除去するための鍵（ディフェンダーの鍵）と、予約テーブル２０２内で予約するための鍵（チャレンジャーの鍵）とを指定する。
【００１５】
[0015]プリエンプトコマンドが成功するために、チャレンジャーの鍵が依然として登録テーブル２０１内になければならない。その所有権を防御する（すなわち、チャレンジャーのプリエンプトコマンドに失敗させる）ために、ディフェンダーは、チャレンジャーがプリエンプトコマンドを発行する前にチャレンジャーの登録鍵を登録テーブル２０１から除去しなければならない。一般に、３秒ごとに、ディフェンダーは起動状態になり、何らかのチャレンジがなされたかどうか判定するために予約テーブル２０２を検査することになる。ディフェンダーは、ディスクを所有しているので、任意の他のノードの登録鍵を登録テーブル２０１から除去することができる。
【００１６】
[0016]ノード１０１が登録テーブル２０１内でノード１０４の鍵を見たとき、ノード１０１は、ノード１０４の鍵を登録テーブル２０１から除去することになる。図２Ｂ（従来技術）は、ノード１０１がノード１０４のチャレンジに対して防御した後の２つのテーブルの状態を表す。図のように、ノード１０４の鍵は、もはや登録テーブル２０１内にリストされていない。
【００１７】
[0017]したがって、ノード１０４が起動状態になり、プリエンプトコマンドを発行したとき、ディフェンダーがノード１０４の登録鍵をすでに除去しているので、プリエンプトコマンドは失敗することになる。ノード１０４の登録鍵が登録テーブル２０１から除去されているので、ノード１０４は、もはや共有ストレージ１０６に対するアクセスを有していない。
【００１８】
[0018]ディフェンダーはチャレンジャーより短い期間の間スリープするので、ディフェンダーが依然として機能する状態にあり、その所有権を防御しない理由がない限り、ディフェンダーは、所有権を求めてチャレンジするノードの登録鍵を定期的に除去することによって所有権を保持することになる。しかし、ディフェンダーは、ディスクに対するアクセスに失敗した、または他の形でアクセスを失った場合、チャレンジャーの登録鍵を除去することに失敗し、それによりチャレンジャーが所有権をプリエンプトする（すなわち、ディフェンダーの鍵を登録テーブルおよび予約テーブルから除去する）のに成功することを許すことになる。
【００１９】
[0019]また、防御時にチャレンジャーの登録鍵を除去することに加えて、ディフェンダーは、アクティブクラスタの一部であると認識できないノードの登録鍵を定期的に除去することになる。換言すれば、クラスタ内のノードは、ディフェンダーがどのノードと通信することができるかに関して定期的に更新される。所有者ノードが、（たとえば、ネットワークパーティションにより）クラスタ内の別のノードと通信することができないという通知を受け取った場合、所有者ノードは、その別のノードがクラスタストレージにアクセスするのを防止するためにその別のノードの登録鍵を除去することになる。
【００２０】
[0020]したがって、従来のＰＲでは、ノードの登録鍵が除去されることになる２つの一般的な状態、すなわち、（１）所有者ノードが、そのノードと通信することができないという通知を受け取ったとき、および（２）そのノードが、共有ストレージの所有権を求めるチャレンジに成功しなかったときがある。
【００２１】
[0021]ネットワークパーティションが発生したとき（すなわち、ノードが、クラスタ内の各ノードと通信することができないと気付いたとき）、ディスクの所有権を有していないパーティション内のノードは、一般に、ディスクの所有権を求めてチャレンジを開始することになる。たとえば、図１では、ネットワークパーティション１０７が発生した後、ノード１０３〜１０４の１つまたは複数は、ノード１０１の、共有ストレージ１０６の所有権をプリエンプトするためにチャレンジを開始することができる（なぜなら、ノード１０３、１０４は、クォーラムを取得し、それによりクラスタ内で引き続き機能することができるように、共有ストレージ１０６の所有権を必要とするからである）。
【００２２】
[0022]図１では、ネットワークパーティション１０７により、ノードのいずれも共有ストレージ１０６にアクセスするのを妨げられない（すなわち、ノード１０１〜１０２がノード１０３〜１０４と通信するのを防止するだけである）。したがって、ノード１０１は、その共有ストレージ１０６の所有権をノード１０３またはノード１０４のチャレンジから防御し続けることになる。
【００２３】
[0023]しかし、ノード１０１が共有ストレージ１０６に対する接続に失敗する、または他の形でその接続を失う（または、クォーラムを有することができるパーティション内にないので防御すべきでないと決定する）ことになった場合、ノード１０３またはノード１０４からのチャレンジは成功することになる（なぜなら、ノード１０１は、ノード１０３またはノード１０４の登録鍵を除去することができないことになるからである）。その結果、チャレンジャー（ノード１０３またはノード１０４）が起動状態になったとき、その登録鍵は依然として登録テーブル２０１内にリストされており、したがってチャレンジャーがノード１０１の所有権をプリエンプトすることを可能にすることになる。次いで、チャレンジャーは、共有ストレージ１０６の所有権を取ることになる。そのノードは、所有者として、上述のように（たとえば、ノード１０１またはノード１０２が所有権を求めてチャレンジを開始した場合）その所有権を防御し始めることになる。
【００２４】
[0024]上記の例は、ノードおよびストレージに所有権を決定するための投票権を与えるクラスタについて述べている。上述のＰＲ技法を使用する他の投票方式も存在する。これらの方式は、ノードだけの投票（そのノードだけが投票権を有する）、およびノード＋ファイル共有投票（ノードとファイルが投票権を共有する）を含む。ノードだけの投票は、一般に、クラスタが奇数のノードを含むとき使用される。ノード＋ファイル共有投票は、上述のノード＋ストレージ投票に似ているが、ファイル共有が共有ストレージのために使用されるとき使用される。
【００２５】
[0025]上述のＰＲは、多数の典型的なストレージ構成内で正しく機能する。しかし、上述のように、ＰＲは、他のタイプのストレージ構成で使用されたとき（たとえば、クラスタが共有ストレージとして仮想ディスクを使用するとき）必ずしも満足のゆくものではない。Ｗｉｎｄｏｗｓ（登録商標）オペレーティングシステムでは、仮想ディスクは、「記憶域スペース」と呼ばれる。記憶域スペースでは、複数の物理ディスクがストレージプールに集約される。次いで、このストレージプールを、１つまたは複数の論理的な「スペース」（または仮想ディスク）に分割することができる。このスペースは仮想化され、実際には多数の異なる物理記憶デバイスにまたがる可能性があるにもかかわらず、各スペースは、アプリケーションにとって物理記憶デバイスとして見える。
【００２６】
[0026]たとえば、図３（従来技術）は、共有ストレージ１０６がストレージプール３０６に置き換えられたことを除いて図１のクラスタ１００と同様であるクラスタ３００を示す。ストレージプール３０６は、３つの物理記憶デバイス３１０〜３１２を含む。このプールから、ユーザーは１つまたは複数のスペースを作成することができる。図３は、ユーザーが単一のスペース３０７を作成したことを示す。スペース３０７は、クラスタ内の各ノード上のアプリケーションから見て、通常の物理ディスクとして扱うことができる。
【００２７】
[0027]スペースが使用されるとき、これらのスペースは物理ディスク間に散らばっている可能性があるので、クラスタのノードは、基礎となるプール内の各物理ディスクに対するアクセスを有する必要がある。たとえば、クラスタ３００では、スペース３０７に書き込まれたデータは、ストレージプール３０６内の３つの物理記憶デバイスのどれにでも物理的に記憶される可能性がある。スペースを使用するとき、単一のノードがストレージプールを所有する（これは、そのノードがプール内の各物理ディスクを所有することを意味する）。
【発明の概要】
【発明が解決しようとする課題】
【００２８】
[0028]スペースを用いて標準的なＰＲ技法を適用することによって引き起こされる１つの特定の問題は、スペースがそこから作成されるプールの所有権をプリエンプトしようとチャレンジャーが試みるときはいつでも、プールの所有者は、チャレンジャーの鍵を除去し、したがって、（チャレンジャー上のアプリケーションが物理ディスクに書き込むことを可能にするためには、チャレンジャーの鍵が物理ディスクに登録されていなければならないので）チャレンジャー上のアプリケーションから任意のスペースへのＩ／Ｏを失敗させることになることである。
【００２９】
[0029]チャレンジャーからのＩ／Ｏを失敗させることは、チャレンジの正しくない結果となり得る。たとえば、チャレンジャーは、ディフェンダーの前にネットワークパーティションについて通知を受けてもよい。ネットワークパーティションに応答して、チャレンジャーは、プールを求めてチャレンジを開始する。チャレンジャーが、クォーラムを有するパーティション内にある場合、正しい結果は、チャレンジャーがチャレンジを勝ち取り、プールの所有権を取る（それにより、チャレンジャーのパーティションが引き続き実行することを可能にする）ことであろう。
【００３０】
[0030]しかし、ディフェンダーがネットワークパーティションについて通知されなかった（したがって、クォーラムを有するパーティション内にあることを通知されなかった）場合、ディフェンダーは、そのプールの所有権を防御するのに成功することになる。上述の従来のＰＲ技法を使用すると、この防御は、チャレンジャーの登録鍵を除去することを含み、その結果、チャレンジャーからの書込みは失敗することになる。ディフェンダーは、ネットワークパーティションの通知を受け取るまで、その所有権を防御するのに成功し続けることになる。したがって、ディフェンダーがネットワークパーティションの通知を受け取るまで、クラスタは、クォーラムを有するパーティション（すなわち、チャレンジャーのパーティション）での適正な動作を開始しないことになる。他のシナリオでは、従来のＰＲ技法の適用は、やはり望ましくない結果に通じる。
【課題を解決するための手段】
【００３１】
[0031]本発明は、１つまたは複数の物理ディスクの所有権を確立するために永続的な予約技法を実装するための方法、システム、およびコンピュータープログラム製品に及ぶ。これらの永続的な予約技法は、ストレージプール内、ならびに任意の他のストレージ構成内で物理ディスクの所有権を決定するために使用することができる。本発明の永続的な予約技法を使用すると、ネットワークパーティションが発生したとき、物理ディスクのディフェンダーは、チャレンジャーがもはやディフェンダーのパーティション内にないという通知をディフェンダーが受け取るまでチャレンジャーの登録鍵を除去しない。このようにして、チャレンジャー上で実行するアプリケーションからの保留中のＩ／Ｏは、物理ディスクの適正な所有権を解決することができるまで、チャレンジャーの鍵が除去されることにより失敗することはない。
【００３２】
[0032]一実施形態では、第１のノードは、記憶デバイスに対する第１のノードの永続的な予約をプリエンプトしようとする別のノードの試みに対して防御する。第１のノードがクラスタ内の別のノードと通信するのを妨げるネットワークパーティションの後、および第１のノードがそのネットワークパーティションについて通知される前に、第１のノードは、クラスタ内のノードによって共有される記憶デバイスをクラスタ内の別のノードが予約しようと試みたことを検出する。この検出は、その別のノードが、登録データ構造内のその別のノードの登録鍵を変更したことを識別することを含む。
【００３３】
[0033]第１のノードは第１のノードの登録鍵を変更し、変更された登録鍵を登録データ構造内で登録し、変更された登録鍵を予約データ構造内で予約する。
[0034]他の実施形態では、第２のノードが記憶デバイスに対する第１のノードの永続的な予約を除去し、第２のノードのための永続的な予約を得ようと試みる。第２のノードは、第２のノードが第１のノードと通信するのを妨げるネットワークパーティションが発生したという通知を受け取る。
【００３４】
[0035]第２のノードは、記憶デバイスに対する永続的な予約を得るように第２のノードの登録鍵を予約しようと試みる。予約しようとする試みは、第２のノードが、予約データ構造内に記憶されている第１のノードの登録鍵を読み取り、第１のノードの鍵を記憶することを含む。また、予約しようとする試みは、第２のノードが、第２のノードの登録鍵を変更し、変更された登録鍵を登録することを含む。また、予約しようとする試みは、第２のノードが、指定された期間の間スリープしてから、プリエンプトコマンドを発行し、第１のノードの永続的な予約を除去することを含む。
【００３５】
[0036]この概要は、以下、詳細な説明でさらに述べる概念のうちの選ばれたものを簡単な形態で紹介するために設けられている。この概要は、特許請求されている主題の重要な特徴または本質的な特徴を識別するものでも、特許請求されている主題の範囲を決定する助けとして使用されるものでもない。
【００３６】
[0037]本発明の追加の特徴および利点は、以下の説明で述べられることになり、一部にはその説明から明らかとなり、または本発明を実施することによって学習することができる。本発明のそれらの特徴および利点は、添付の特許請求の範囲で特に指摘される手段および組合せにより実現され得られる可能性がある。本発明のこれら、および他の特徴は、以下の説明および添付の特許請求の範囲からより十分に明らかになり、または以下に記載のように本発明を実施することによって学習することができる。
【００３７】
[0038]本発明の上記および他の利点および特徴をどのように得ることができるか述べるために、上記で簡単に述べた本発明のより具体的な説明を、添付の図面に示されているその特定の実施形態を参照することによって行う。これらの図面は、本発明の典型的な実施形態を示すにすぎず、したがってその範囲を限定するものと考えるべきでないことを理解して、本発明について、添付の図面を使用して追加の特殊性および詳細と共に述べ、説明する。
【図面の簡単な説明】
【００３８】
【図１】[0039]従来の永続的な予約技法が使用されるノードの典型的なクラスタの図である。
【図２Ａ】[0040]従来の永続的な予約を実装する際に使用される例示的なテーブルの図である。
【図２Ｂ】従来の永続的な予約を実装する際に使用される例示的なテーブルの図である。
【図３】[0041]共有ストレージのための仮想ディスクを使用するノードのクラスタの図である。
【図４】[0042]共有ストレージのための複数の仮想ディスクを使用するノードの別のクラスタの図である。
【図５Ａ】[0043]本発明の永続的な予約技法を実装する際に使用される例示的なテーブルの図である。
【図５Ｂ】本発明の永続的な予約技法を実装する際に使用される例示的なテーブルの図である。
【図５Ｃ】本発明の永続的な予約技法を実装する際に使用される例示的なテーブルの図である。
【図５Ｄ】本発明の永続的な予約技法を実装する際に使用される例示的なテーブルの図である。
【図５Ｅ】本発明の永続的な予約技法を実装する際に使用される例示的なテーブルの図である。
【図５Ｆ】本発明の永続的な予約技法を実装する際に使用される例示的なテーブルの図である。
【図６】[0044]本発明による永続的な予約に使用することができる登録鍵の例示的なフォーマットの図である。
【図７】[0045]第１のノードが記憶デバイスに対する第１のノードの永続的な予約をプリエンプトしようとする別のノードの試みに対して防御するための例示的な方法の流れ図である。
【図８】[0046]第２のノードが記憶デバイスに対する第１のノードの永続的な予約を除去し、第２のノードのための永続的な予約を得ようと試みるための例示的な方法の流れ図である。
【発明を実施するための形態】
【００３９】
[0047]本発明は、１つまたは複数の物理ディスクの所有権を確立するために永続的な予約技法を実装するための方法、システム、およびコンピュータープログラム製品に及ぶ。これらの永続的な予約技法は、ストレージプール内、ならびに任意の他のストレージ構成内で物理ディスクの所有権を決定するために使用することができる。本発明の永続的な予約技法を使用すると、ネットワークパーティションが発生したとき、物理ディスクのディフェンダーは、チャレンジャーがもはやディフェンダーのパーティション内にないという通知をディフェンダーが受け取るまでチャレンジャーの登録鍵を除去しない。このようにして、チャレンジャー上で実行するアプリケーションからの保留中のＩ／Ｏは、物理ディスクの適正な所有権を解決することができるまで、チャレンジャーの鍵が除去されることにより失敗することはない。
【００４０】
[0048]一実施形態では、第１のノードは、記憶デバイスに対する第１のノードの永続的な予約をプリエンプトしようとする別のノードの試みに対して防御する。第１のノードがクラスタ内の別のノードと通信するのを妨げるネットワークパーティションの後、および第１のノードがそのネットワークパーティションについて通知される前に、第１のノードは、クラスタ内のノードによって共有される記憶デバイスをクラスタ内の別のノードが予約しようと試みたことを検出する。この検出は、その別のノードが、登録データ構造内のその別のノードの登録鍵を変更したことを識別することを含む。
【００４１】
[0049]第１のノードは第１のノードの登録鍵を変更し、変更された登録鍵を登録データ構造内で登録し、変更された登録鍵を予約データ構造内で予約する。
[0050]他の実施形態では、第２のノードが記憶デバイスに対する第１のノードの永続的な予約を除去し、第２のノードのための永続的な予約を得ようと試みる。第２のノードは、第２のノードが第１のノードと通信するのを妨げるネットワークパーティションが発生したという通知を受け取る。
【００４２】
[0051]第２のノードは、記憶デバイスに対する永続的な予約を得るように第２のノードの登録鍵を予約しようと試みる。予約しようとする試みは、第２のノードが、予約データ構造内に記憶されている第１のノードの登録鍵を読み取り、第１のノードの鍵を記憶することを含む。また、予約しようとする試みは、第２のノードが、第２のノードの登録鍵を変更し、変更された登録鍵を登録することを含む。また、予約しようとする試みは、第２のノードが、指定された期間の間スリープしてから、プリエンプトコマンドを発行し、第１のノードの永続的な予約を除去することを含む。
【００４３】
[0052]本発明の実施形態は、下記でより詳細に論じる、たとえば１つまたは複数のプロセッサーおよびシステムメモリーなどコンピューターハードウェアを含む専用コンピューターまたは汎用コンピューターを含む、または使用することができる。また、本発明の範囲内の実施形態は、コンピューター実行可能命令および／またはデータ構造を担持または記憶するための物理的、または他のコンピューター可読媒体を含む。そのようなコンピューター可読媒体は、専用コンピューターシステムまたは汎用コンピューターシステムによってアクセスすることができる任意の使用可能な媒体とすることができる。コンピューター実行可能命令を記憶するコンピューター可読媒体は、コンピューター記憶媒体（デバイス）である。コンピューター実行可能命令を担持するコンピューター可読媒体は、伝送媒体である。したがって、限定するものではなく例として、本発明の実施形態は、少なくとも２つの明らかに異なる種類のコンピューター可読媒体、すなわちコンピューター記憶媒体（デバイス）と伝送媒体とを含むことができる。
【００４４】
[0053]コンピューター記憶媒体（デバイス）は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭ、ソリッドステートデバイス（ＳＳＤ）（たとえばＲＡＭをベースとするもの）、フラッシュメモリー、相変化メモリー（ＰＣＭ）、他のタイプのメモリー、他の光ディスクストレージ、磁気ディスクストレージもしくは他の磁気記憶デバイス、またはコンピューター実行可能命令もしくはデータ構造の形態で所望のプログラムコード手段を記憶するために使用することができ、専用コンピューターまたは汎用コンピューターによってアクセスすることができる任意の他の媒体を含む。
【００４５】
[0054]「ネットワーク」は、コンピューターシステムおよび／またはモジュールおよび／または他の電子デバイス間で電子データの移送を可能にする１つまたは複数のデータリンクと定義される。情報がネットワークまたは別の通信接続（ハードワイヤード、無線、またはハードワイヤードもしくは無線の組合せ）を介してコンピューターに転送または提供されるとき、コンピューターは、その接続を伝送媒体として適正に見る。伝送媒体は、コンピューター実行可能命令もしくはデータ構造の形態で所望のプログラムコード手段を担持するために使用することができ、専用コンピューターまたは汎用コンピューターによってアクセスすることができるネットワークおよび／またはリンクを含むことができる。上記の組合せもまた、コンピューター可読媒体の範囲内に含まれるべきである。
【００４６】
[0055]さらに、様々なコンピューターシステムコンポーネントに到達したとき、コンピューター実行可能命令もしくはデータ構造の形態にあるプログラムコード手段を、伝送媒体からコンピューター記憶媒体（デバイス）に（または逆も同様に）自動的に転送することができる。たとえば、ネットワークまたはデータリンクを介して受信されたコンピューター実行可能命令またはデータ構造は、ネットワークインターフェースモジュール（たとえば、ＮＩＣ）内のＲＡＭ内にバッファされ、次いで、最終的にコンピューターシステムのＲＡＭに、および／またはコンピューターシステムにおける、それより揮発性の低いコンピューター記憶媒体（デバイス）に転送することができる。したがって、コンピューター記憶媒体（デバイス）は、伝送媒体をも（さらには主として）使用するコンピューターシステムコンポーネントに含まれ得ることを理解されたい。
【００４７】
[0056]コンピューター実行可能命令は、たとえば、プロセッサーによって実行されたとき汎用コンピューター、専用コンピューター、または専用処理デバイスにある種の機能または機能のグループを実施させる命令およびデータを含む。コンピューター実行可能命令は、たとえば、バイナリ、アセンブリ言語など中間フォーマットの命令、さらにはソースコードであってもよい。主題について構造上の特徴および／または方法上の行為に特有の言語で述べたが、添付の特許請求の範囲に規定されている主題は、記載の特徴または上記の行為に必ずしも限定されないことを理解されたい。むしろ、記載の特徴および行為は、特許請求の範囲を実施する例示的な形態として開示されている。
【００４８】
[0057]本発明は、パーソナルコンピューター、デスクトップコンピューター、ラップトップコンピューター、メッセージプロセッサー、ハンドヘルドデバイス、マルチプロセッサーシステム、マイクロプロセッサーをベースとする、またはプログラム可能な消費者家電、ネットワークＰＣ、ミニコンピューター、メインフレームコンピューター、移動電話、ＰＤＡ、タブレット、ページャー、ルーター、スイッチなどを含めて、多数のタイプのコンピューターシステム構成を有するネットワークコンピューティング環境で実施されてもよいことを、当業者なら理解するであろう。また、本発明は、ネットワークを介して（ハードワイヤードデータリンク、無線データリンクによって、またはハードワイヤードデータリンクと無線データリンクの組合せによって）リンクされるローカルコンピューターシステムと遠隔コンピューターシステムが共にタスクを実施する分散システム環境で実施されてもよい。分散システム環境では、プログラムモジュールがローカルメモリー記憶デバイスと遠隔メモリー記憶デバイスの両方に位置してもよい。
【００４９】
[0058]本発明は、図４に示されているクラスタ４００内に実装されるものとして述べられているが、ＰＲ技法は、複数のノードを含む他のコンピューターアーキテクチャーで実装することもできることを理解されたい。クラスタ４００は、４つの相互接続されたノード（ノード４０１〜４０４）を含む。各ノードは、記憶デバイス４１０〜４１２のそれぞれに接続される。記憶デバイス４１０〜４１２は、複数の仮想ディスク（またはスペース）４３０ａ〜４３０ｎがそこから作成されたストレージプール４２０を含む。したがって、各ノード上のアプリケーションは、仮想ディスク４３０ａ〜４３０ｎのそれぞれにアクセスすることができる。クラスタ４００内のクォーラムは、ノード＋ストレージ投票方式を使用して決定されるものと仮定される。したがって、ノード４０１〜４０４のそれぞれ、およびプール４２０が投票権を有する。単一のノードが、所与の時間にプール４２０内の各記憶デバイスを所有する。
【００５０】
[0059]さらに、図５Ａ〜図５Ｆは、本発明のＰＲ技法を実装するために維持され得る登録テーブル５０１および予約テーブル５０２の様々な状態を示す。登録テーブルおよび予約テーブルの別々のセットが記憶デバイス４１０〜４１２のそれぞれについて維持される。以下の説明では、登録テーブル５０１および予約テーブル５０２は記憶デバイス４１０に関連するものと仮定されるが、各記憶デバイスの所有権を決定するために、同様のプロセスに従うことになることを理解されたい。また、２つのテーブルが示されているが、本発明は、単一のテーブル、または任意の数の他のデータ構造を使用して実装することができる。したがって、鍵を記憶するために使用されるデータ構造は、本発明にとって不可欠なものではない。
【００５１】
[0060]図５Ａ〜図５Ｆは、本発明のＰＲプロセス中にノードが現在予約されている鍵をどのように記憶するか示すためにノード４０１およびノード４０４をも含む。当然ながら、図示されていないが、各ノードは、やはりその登録鍵を記憶する。
【００５２】
[0061]図５Ａは、ネットワークパーティション４０５の発生前の２つのテーブルの状態を表す。図５Ａでは、登録テーブル５０１は、ノード４０１〜４０４に１つずつ、４つの登録鍵を含み、クラスタ内の各ノードが記憶デバイス４１０に書き込むことができることを示す。予約テーブル５０２もまた、ノード４０１の登録鍵を含み、ノード４０１が記憶デバイス４１０に対する予約を有する（すなわち、ノード４０１は、物理ディスクの現在の所有者である）ことを示す。
【００５３】
[0062]ネットワークパーティション４０５が発生したとき、クラスタ内の各ノードは、パーティションについて通知されることになる。しかし、各ノードは、必ずしも同時に通知されない。この例では、ノード４０４は、ネットワークパーティション４０５について通知されており、したがって（ノード４０４のパーティションは、クォーラムを有するためにプール４２０の所有権を必要とするので）プール４２０内の各記憶デバイスの所有権を求めてチャレンジを開始している。
【００５４】
[0063]しかし、ノード４０４のチャレンジの時点で、ノード４０１はまだネットワークパーティション４０５について通知されていない。したがって、ノード４０１は、依然としてノード４０４と同じパーティションにあると考えることになる。従来のＰＲでは、ノード４０４が記憶デバイス４１０の所有権を求めてチャレンジするとき、ノード４０４が同じパーティション内にあるとノード４０１が依然として考えることは問題にならないはずであり、ノード４０１はノード４０４の登録鍵を登録テーブル５０１から除去し、したがってノード４０４からのＩ／Ｏを失敗させることになる。
【００５５】
[0064]対照的に、本発明では、異なるＰＲ技法を適用し、ノード４０４がもはや同じパーティション内にないことをノード４０１が知るまでノード４０１がノード４０４の登録鍵を除去しないことを確実にする。図５Ｂ〜図５Ｅは、本発明のＰＲ技法がどのように実装されるかを示す。
【００５６】
[0065]図５Ｂは、ノード４０４が記憶デバイス４１０の所有権を求めてチャレンジを開始した後の２つのテーブルの状態を表す。したがって、図５Ｂは、ノード４０４が眠っており、ノード４０１が、まだその所有権を防御するために起動状態になっていない期間を表すことができる。
【００５７】
[0066]ノード４０４は、以下のタスクを実施することによって予約しようと試みる。ノード４０４は、それ自体の登録鍵を増分し（または他の方法で変更し）、それを（その古い登録鍵の代わりに）登録テーブル５０１内で登録する。しかし、ノード４０１が現在の所有者であるため、予約しようとするノード４０４の試みは最初失敗することになり、したがって、ノード４０１の予約をプリエンプトしようとする試みの前にノード４０４がスリープすることを必要とする。予約が失敗したので、ノード４０４もまた現在の予約鍵（予約テーブル５０２内のノード４０１の鍵）を読み取り、それを記憶する。
【００５８】
[0067]したがって、図５Ｂは、登録テーブル５０１が、ノード４０４の古い登録鍵をノード４０４の増分された登録鍵で置き換えることによって変更されたことを示す。図５Ｂでは、ノード４０４は、現在の予約鍵、すなわちノード４０１の登録鍵を記憶して示されている。
【００５９】
[0068]図５Ｃは、ノード４０１がその所有権を防御するために起動状態になった後で、しかしノード４０１がネットワークパーティション４０５について通知される前の２つのテーブルの状態を表す。防御では、ノードは、所有者ノードのパーティションの一部であると認識されないノードの登録鍵を除去する。したがって、ノード４０１が登録テーブル５０１内でノード４０４の増分された登録鍵を見たとき、ノード４０１は、ノード４０４が依然として同じパーティション内にあると信じるので、ノード４０１はノード４０４の登録鍵を除去しない。
【００６０】
[0069]ノード４０４の登録鍵を登録テーブル５０１から除去する（したがって、ノード４０４が記憶デバイス４１０に書き込むのを妨げる）のではなく、ノード４０１は、その代わりにそれ自体の登録鍵を増分し、増分された鍵を登録し、増分された鍵を予約する。これが、異なるパーティションにあることが知られていないノードが所有権を求めてチャレンジするときの、所有者ノードの防御の形態である。
【００６１】
[0070]したがって、図５Ｃは、登録テーブル５０１および予約テーブル５０２が、今やそれぞれ、ノード４０１の以前の鍵の代わりにノード４０１の増分された登録鍵を含むことを示す。要するに、ノード４０１は、まだノード４０１とノード４０４がもはや同じパーティション内にないことを知らないので、ノード４０４のチャレンジに対するノード４０１の応答は、ノード４０４の登録鍵を登録テーブル５０１から除去するのではなく、その登録鍵を増分し予約することを含む。
【００６２】
[0071]図５Ｄは、ノード４０４が起動状態になり、プリエンプトコマンド５３０を発行した後の２つのテーブルの状態を表す。プリエンプトコマンド５３０は、ノード４０４の現在の登録鍵と、ノード４０４がスリープする前に読み取った予約鍵とを含む。ノード４０１は、その登録鍵を増分し、増分された鍵を予約したので、ノード４０４によって保持されている予約鍵は、予約テーブル５０２内に記憶された現在の予約鍵と一致しないことになる（Ｎｏｄｅ＿４０１＿ｋｅｙ＿０００１  ！＝  Ｎｏｄｅ＿４０１＿ｋｅｙ＿０００２）。したがって、ノード４０４のプリエンプトの試みは失敗することになり、ノード４０１は、依然として記憶デバイス４１０の所有権のままとなる。したがって、ノード４０１が依然として所有権のままであるが、ノード４０４の登録を除去していないので、図５Ｄは、どちらのテーブルも図５Ｃと同じままであることを示す。
【００６３】
[0072]しばらくして、ノード４０４（または同様にノード４０３）は、図５Ａ〜図５Ｂに関連して述べたようにして別のチャレンジを開始することができる。図５Ｅは、ノード４０４が別のチャレンジを開始した後の２つのテーブルの状態を表す。図のように、登録テーブル５０１は、今やノード４０４の増分された鍵（Ｎｏｄｅ＿４０４＿ｋｅｙ＿０００３）を含む。また、ノード４０４は、現在の予約鍵（Ｎｏｄｅ＿４０１＿ｋｅｙ＿０００２）を記憶している。
【００６４】
[0073]ノード４０１がその所有権を防御するために起動状態になる前に、ノード４０１はネットワークパーティション４０５について通知された。したがって、ノード４０１は、ノード４０４のチャレンジに対して異なるように応答する。具体的には、ノード４０１は、今やノード４０４が同じパーティション内にないことを知っており、したがって、ノード４０１は、ノード４０４の登録鍵を登録テーブル５０１から除去し、ノード４０４のチャレンジを失敗させ、ノード４０４が記憶デバイス４１０に書き込むのを妨げる。
【００６５】
[0074]したがって、図５Ｆは、ノード４０１がネットワークパーティション４０５について通知された後、かつノード４０１がノード４０４のチャレンジに対して防御した後の２つのテーブルの状態を表す。図のように、登録テーブル５０１は、ノード４０４の登録鍵を含まない。ノード４０４は、依然として現在の予約鍵を記憶して示されているが、ノード４０４の登録鍵が登録テーブル５０１内にないので、ノード４０４によるプリエンプトの試みは失敗することになる。
【００６６】
[0075]上記の説明は、鍵を増分する例を使用しているが、本発明は、チャレンジについて別のノードに通知するために任意の他の方法で鍵を変更することによって実装することもできる。たとえば、その鍵を増分するのではなく、ノード４０４は、ビットを変更することができる。要するに、登録鍵を変更することは、ネットワークパーティションによりノードが直接通信することが妨げられたにもかかわらずノードが引き続き通信するための方法として働く。したがって、ノードのチャレンジを連絡するために登録鍵を修正する任意の手段を、本発明において使用することができる。
【００６７】
[0076]ノード４０４の登録鍵は、ノード４０４がチャレンジを開始することなしに除去されてもよいことに留意されたい。ノード４０１は、所有権を防御するために起動状態になるときはいつでも、最初に、同じパーティションの一部であると認識できないノードの登録鍵について検査する。たとえば、ノード４０１が、ネットワークパーティション４０５の後、ノード４０４がチャレンジを開始する前に起動状態になった場合、ノード４０４、４０３がもはや同じパーティション内にないので、ノード４０１は、ノード４０４の登録鍵（ならびにノード４０３の鍵）を登録テーブル５０１から除去することになる。
【００６８】
[0077]したがって、所有者ノードは、別のノードが所有者ノードと同じパーティション内にないことを所有者ノードが知るまでその別のノードの登録鍵を除去しない。このようにして、所有者ノードは、ネットワークパーティションが発生したとき、所有者ノードがそのネットワークパーティションについて知り、それに応じて（たとえば、その所有権を防御する、または防御しないことによって）応答することができるまで別のノードの鍵を除去しない。
【００６９】
[0078]当然ながら、任意の所与の防御中、所有者ノードは、同じパーティションの一部であると認識できないノードの登録鍵を除去することも、まだ別のパーティション内にあることを知らないノードからのチャレンジに応答してその登録鍵を増分し、登録し、予約することもできる。図５Ａ〜図５Ｆの同じ例を使用すると、ノード４０３、４０４が同時にチャレンジしたが、ノード４０１はノード４０４がもはや同じパーティション内にないことだけ通知された場合、ノード４０１は、ノード４０４の鍵を除去し、一方、ノード４０３の鍵は残し、それ自体の鍵を増分することになる。
【００７０】
[0079]同様に、いつでも、ノード４０１は、クォーラムを有していないパーティション内にあることに気付いた場合（たとえば、ネットワークパーティション４０５がノード４０１をノード４０２〜４０４から分離した場合）、ノード４０１はその所有権を防御せず、したがって他のパーティション内のノードの１つがノード４０１の所有権をプリエンプトするのに成功することを可能にすることになる。
【００７１】
[0080]上述のように、図５Ａ〜図５Ｆに関連して述べたプロセスは、ストレージプール内のあらゆる記憶デバイスについて実施される。たとえば、ノード４０４は、記憶デバイス４１１、４１２の所有権を求めて、同じようにしてチャレンジすることになる。しかし、単一のノードは、一般に、プール内のあらゆる記憶デバイスの所有権を有するべきである。単一のノードが各記憶デバイスの所有権を確実に得て保持するために、上述のプロセスは、各記憶デバイスに対して予め定義された順序で実施される。
【００７２】
[0081]換言すれば、各ノードは、各記憶デバイスを求めてチャレンジすべき順序について知っている。この順序は、たとえば、記憶デバイスに関連付けられた識別子（たとえば、プールＧＵＩＤ）に基づいて決定することができる。たとえば、ノード４０４が起動状態になりプリエンプトコマンドを発行するとき、ノード４０４は、（記憶デバイス４１０をプリエンプトし、次いで記憶デバイス４１１、次いで記憶デバイス４１２をプリエンプトすることによって）指定された順序でプリエンプトコマンドを発行することができる。
【００７３】
[0082]プリエンプトコマンドが失敗した場合、チャレンジしているノードは、所有権を求めてのチャレンジを止める。たとえば、ノード４０４のプリエンプトコマンドが記憶デバイス４１０に対して失敗した場合、ノード４０４は、記憶デバイス４１１、４１２の所有権をプリエンプトしようとは試みないことになる。プリエンプトコマンドを指定された順序で発行することによって、１つのノードがプール内のいくつかの記憶デバイスの所有権を勝ち取り、一方、１つまたは複数の他のノードがプール内の他の記憶デバイスの所有権を勝ち取るという状況を回避することができる。
【００７４】
[0083]所有者ノードまたはチャレンジャーノードが、クォーラムを有するパーティションの一部である（またはプールの所有権を得ることによってクォーラムを有することができる）ことを確実にすることに加えて、ノードは、プールの記憶デバイスの防御またはそれを求めてのチャレンジを開始する前にプール内のディスクのクォーラムがアクセス可能であることを検証することもできる。たとえば、ノード４０１がその所有権を防御するために起動状態になったとき、ノード４０１は、最初にプール４２０内のすべての記憶デバイスを列挙することができる。列挙された記憶デバイスの数がプール内の記憶デバイスの過半数未満（たとえば、記憶デバイス４１０〜４１２の２未満）である場合、ノード４０１は、その防御を止めることができる。同様に、ノード４０４がチャレンジを試みるとき、ノード４０４もまた、記憶デバイスを列挙し、記憶デバイスのクォーラムがアクセス可能でない場合、チャレンジを止めることができる。記憶デバイスは、故障している、または他の形で正しい動作を停止した場合、アクセス不能となり得る。
【００７５】
[0084]図６は、登録鍵６００のための例示的なフォーマットを示す。登録鍵６００は、４つのセクション、すなわち、識別子セクション６０１、改訂セクション６０２、ノード識別子セクション６０３、および署名セクション６０４を含む。識別子セクション６０１は、登録鍵が使用される記憶デバイスの識別子を含む。改訂セクション６０２は、上述のように増分される鍵の部分である。ノード識別子セクション６０３は、その鍵に関連するノードの識別子を含む。署名セクション６０４は、対応するノードによって生成された一意の署名を含む。
【００７６】
[0085]図７は、記憶デバイスに対する第１のノードの永続的な予約をプリエンプトしようとする別のノードの試みに対して第１のノードが防御するための例示的な方法７００の流れ図を示す。方法７００について、図４および図５Ａ〜図５Ｆに関連して述べる。
【００７７】
[0086]方法７００は、第１のノードがクラスタ内の別のノードと通信するのを妨げるネットワークパーティションの後、および第１のノードがそのネットワークパーティションについて通知される前に、第１のノードは、クラスタ内のノードによって共有される記憶デバイスをクラスタ内の別のノードが予約しようと試みたことを検出する行為７０１を含む。この検出は、その別のノードが、登録データ構造内のその別のノードの登録鍵を変更したことを識別することを含む。たとえば、ノード４０１は、ノード４０１が記憶デバイス４１０に対する永続的な予約を有するが、ノード４０４が記憶デバイス４１０に関連する登録テーブル５０１内のその登録鍵を変更したことを検出することができる。
【００７８】
[0087]方法７００は、第１のノードが第１のノードの登録鍵を変更し、変更された登録鍵を登録データ構造内で登録し、変更された登録鍵を予約データ構造内で予約する行為７０２を含む。たとえば、ノード４０１は、その登録鍵を変更（たとえば増分）し、変更された登録鍵を登録テーブル５０１内で登録し、変更された登録鍵を予約テーブル５０２内で予約することができる。
【００７９】
[0088]図８は、第２のノードが記憶デバイスに対する第１のノードの永続的な予約を除去し、第２のノードのための永続的な予約を得ようと試みるための例示的な方法８００の流れ図を示す。方法８００について、図４および図５Ａ〜図５Ｆに関連して述べる。
【００８０】
[0089]方法８００は、第２のノードが第１のノードと通信するのを妨げるネットワークパーティションが発生したという通知を第２のノードが受け取る行為８０１を含む。たとえば、ノード４０４は、ネットワークパーティション４０５が発生したという通知を受け取ることができる。
【００８１】
[0090]方法８００は、第２のノードが、記憶デバイスに対する永続的な予約を得るように第２のノードの登録鍵を予約しようと試みる行為８０２を含む。行為８０２は、下位の行為８０２ａ〜８０２ｃを含む。
【００８２】
[0091]下位の行為８０２ａは、第２のノードが、予約データ構造内に記憶されている第１のノードの登録鍵を読み取り、第１のノードの鍵を記憶することを含む。たとえば、ノード４０４は、予約テーブル５０２内のノード４０１の登録鍵を読み取ることができる。
【００８３】
[0092]下位の行為８０２ｂは、第２のノードが、第２のノードの登録鍵を変更し、変更された登録鍵を登録することを含む。たとえば、ノード４０４は、その登録鍵を変更し、変更された登録鍵を登録テーブル５０１内で登録することができる。
【００８４】
[0093]下位の行為８０２ｃは、第２のノードが、指定された期間の間スリープしてから、プリエンプトコマンドを発行し、第１のノードの永続的な予約を除去することを含む。たとえば、ノード４０４は、ディフェンダーノードがスリープする期間の少なくとも２倍（たとえば、ノード４０１が３秒間スリープする場合６秒）の間スリープしてから起動状態になり、プリエンプトコマンドを発行し、記憶デバイス４１０に対するノード４０１の予約を除去することができる。
【００８５】
[0094]本発明は、その精神または本質的な特徴から逸脱することなしに他の特定の形態で実施することができる。記載の実施形態は、あらゆる点で例示的なものにすぎず、限定するものではないとみなされるべきである。したがって、本発明の範囲は、前述の説明によってではなく、添付の特許請求の範囲によって示される。特許請求の範囲の均等物の趣旨および範囲内に入る変更すべてが、それらの範囲内に含まれるべきである。
【図１】
2015508213.tif 000003
【図２Ａ】
2015508213.tif 000004
【図２Ｂ】
2015508213.tif 000005
【図３】
2015508213.tif 000006
【図４】
2015508213.tif 000007
【図５Ａ】
2015508213.tif 000008
【図５Ｂ】
2015508213.tif 000009
【図５Ｃ】
2015508213.tif 000010
【図５Ｄ】
2015508213.tif 000011
【図５Ｅ】
2015508213.tif 000012
【図５Ｆ】
2015508213.tif 000013
【図６】
2015508213.tif 000014
【図７】
2015508213.tif 000015
【図８】
2015508213.tif 000016
【国際調査報告】
2015508213.tif 000017
2015508213.tif 000018