TimesTen Scaleoutのメンバーシップ・サービスの概要
メンバーシップ・サービスは、データおよび管理インスタンスのステータスを追跡し、ネットワーク・パーティション・エラーによる不整合の問題を解決します。
-
インスタンス・ステータスの追跡。これにより、インスタンスは相互の通信を維持できます。
-
通信障害が修正された後のネットワーク・パーティション・エラーからのリカバリ。
インスタンス・ステータスの追跡
グリッドは、1つの内部ネットワークを介して通信する、複数のホストにあるインスタンスの集合です。メンバーシップ・サービスは、アクティブになっているインスタンスを認識します。各インスタンスは、起動するとき、図3-1に示すように、メンバーシップ・サービス内のメンバーシップ・サーバーに接続してそれ自体を登録します。いずれかのメンバーシップ・サーバーに障害が発生した場合、障害が発生したメンバーシップ・サーバーに接続していたインスタンスは、使用可能なメンバーシップ・サーバーのいずれかに透過的に再接続します。
各インスタンスは、アクティブ・インスタンス・リストを問い合せることができるように、いずれかのメンバーシップ・サーバーへの永続接続を維持します。メンバーシップ・サーバーとインスタンスの間のネットワークが停止している場合、ネットワークが修正されてメンバーシップ・サーバーとの通信が復元されるまで、インスタンスは実行を拒否します。
図3-2は、グリッド内のデータ・インスタンスが相互に接続する方法を示しています。各データ・インスタンスは、グリッド内の他のすべてのデータ・インスタンスに接続します。また、この例の各データ・インスタンスがいずれかのメンバーシップ・サーバーとの永続接続を維持する方法も示しています。
データ・インスタンスは別のインスタンスへの接続を失った場合、そのメンバーシップ・サーバー上のアクティブ・インスタンス・リストを問い合せて、失われたインスタンスが稼働しているかどうかを確認します。失われたインスタンスが稼働している場合、データ・インスタンスはそのインスタンスとの接続を再確立しようとします。それ以外の場合、不要な遅延を回避するために、失われたインスタンスへの接続の確立はこれ以上試行されません。
失われたインスタンスが再起動すると、メンバーシップ・サービスにそれ自体を登録し、グリッド内の他のすべてのインスタンスに対して、起動していることを事前に通知します。グリッドの残りのインスタンスとの同期が適切である場合、リカバリされたインスタンスは、再度、アプリケーションからのトランザクションを処理するために使用されます。
図3-3では、host4.instance1
データ・インスタンスが稼働していません。host3.instance1
データ・インスタンスがhost4.instance1
データ・インスタンスとの通信を試みると、壊れた接続が検出されます。host3.instance1
データ・インスタンスがメンバーシップ・サーバー上のアクティブ・インスタンス・リストを問い合せると、host4.instance1
データ・インスタンスがアクティブ・インスタンス・リストにないことが通知されます。host4.instance1
データ・インスタンスは、再起動されると、それ自体をメンバーシップ・サービスに再度登録します。それにより、それがこのグリッド内のアクティブ・インスタンスのリストに含まれます。
ネットワーク・パーティション・エラーからの回復
ネットワーク・パーティション・エラーによって、単一のグリッドに含まれるインスタンスが2つのサブセットに分割されます。ネットワーク・パーティション・エラーが発生した場合、インスタンスの各サブセットはインスタンスの他のサブセットと通信できません。
図3-4は、メンバーシップ・サービスがない場合、アプリケーションがインスタンスの一方のサブセットにアクセスでき、インスタンスの切断されたサブセットにはアクセスできないために、ネットワーク・パーティションによって、アプリケーション問合せに対して矛盾した結果が返されることを示しています。インスタンスの一方のサブセットに対して実行された更新は、もう一方のサブセットには反映されません。アプリケーションがhost1
データ・インスタンスに接続すると、問合せによって、host1
およびhost3
データ・インスタンスの結果が返されます。ただし、host2
およびhost4
データ・インスタンスに常駐するデータは、2つのサブセット間に接続がないため、使用できません。
ネットワーク・パーティションが発生した場合、メンバーシップ・サービスによって解決策が提供されます。図3-5は、6つのインスタンスと3つのメンバーシップ・サーバーがあるグリッドを示しています。ネットワーク通信エラーにより、グリッドがサブセット2つに分割され、それにより、host3.instance1
およびhost4.instance1
で、残りのインスタンスについて認識することやそれらと通信することができなくなりました。また、ms_host1
メンバーシップ・サーバーは他の2つのメンバーシップ・サーバーと通信できません。
グリッドのステータスを管理するためにメンバーシップ・サービスが適切に動作するには、作成された全部のサーバーのうち、過半数のアクティブなメンバーシップ・サーバーが相互に通信して適切に動作できる必要があります。あるメンバーシップ・サーバーに障害が発生すると、他のサーバーは、過半数が使用可能であるかぎり、リクエストの処理を続行します。
例:
-
3つのメンバーシップ・サーバーで構成されたメンバーシップ・サービスは、1つのメンバーシップ・サーバー障害を処理できます。
-
5つのメンバーシップ・サーバーで構成されたメンバーシップ・サービスは、2つのメンバーシップ・サーバー障害を処理できます。
-
6つのメンバーシップ・サーバーで構成されたメンバーシップ・サービスでは、3つのメンバーシップ・サーバーは過半数ではないため、2つのみの障害は処理できます。
ノート:
メンバーシップ・サーバーの数を構成するとき、メンバーシップ・サービスとして機能するメンバーシップ・サーバーを常に奇数個作成するようにしてください。メンバーシップ・サーバーの数が偶数であるとき、ネットワーク・パーティション・エラーが発生すると、グリッドの各サブセットには同じ数のメンバーシップ・サーバーが存在する可能性があり、その場合はいずれの側にも過半数のサーバーが存在しません。したがって、ネットワーク・パーティション化されたグリッドの両方が機能しなくなります。
残りのメンバーシップ・サーバーの数が過半数に必要な数を下回る場合、残りのメンバーシップ・サーバーは、少なくとも過半数のメンバーシップ・サーバーが実行されるまで、すべてのリクエストを拒否します。また、メンバーシップ・サービスと通信できないデータ・インスタンスは、すべてのトランザクションを実行できません。障害の問題を調査し、障害が発生したメンバーシップ・サーバーを再起動する必要があります。
通信障害のため、ms_host1
メンバーシップ・サーバーは、他の2つのメンバーシップ・サーバーを認識できません。過半数を構成するにはメンバーシップ・サーバーが足りないため、ms_host1
メンバーシップ・サーバーはhost3.instance1
およびhost4.instance1
データ・インスタンスからの着信リクエストをこれ以上受け入れることができません。障害が発生したメンバーシップ・サーバーが再起動されるまで、host3.instance1
およびhost4.instance1
データ・インスタンスはすべてのトランザクションを実行できません。
ネットワーク・パーティションが存在するかどうかを確認するには、デーモン・ログで、メンバーシップ・サーバーとの接続を失っている要素に関するエラーを確認します。
グリッドが2つに分割される原因となった接続エラーを解決した後、すべてのメンバーシップ・サーバーは再接続し、メンバーシップ情報を同期化します。図3-5の例では、ms_host1
メンバーシップ・サーバーがメンバーシップ・サービスに再び参加します。その後、host3.instance1
およびhost4.instance1
データ・インスタンスもアクティブ・インスタンスとしてこのグリッドに再び参加します。