RAC障害時の新規セッション確立
Oracle Grid Infrastructure(GI)はOracleインスタンスだけでなく、Oracleリスナー・プロセスなども管理しています。SCANリスナーやローカル・リスナーにプロセス障害が発生すると、GIによって再起動が試みられます。Oracleリスナー・プロセスに障害が発生している最中にOracleクライアントから新規接続リクエストが発行された場合、そのコネクションにはエラーが返ります。しかし、Oracleクライアントにはそのエラーをマスクし、別のOracleリスナーへ接続リクエストを自動再発行する機能があります。これを接続時フェイルオーバーと呼びます(図1)。
接続時フェイルオーバーを有効にするには、Oracleクライアントの接続記述子にFAILOVER=ONと指定します。ただ、FAILOVERの設定はデフォルトでONなので明示的に記述する必要はありません。
RAC障害時の接続済みセッション
RACサーバーに障害が発生すると、GIのコンポーネントであるCluster Synchronization Services(CSS)によって障害ノードがクラスタから排除され、正常ノードのOracleインスタンスによってリカバリが開始されます。障害が発生したノードのOracleインスタンスに接続していたセッションにはエラーが返ります。
Oracleインスタンス障害の場合は、OSが正常動作していればOSによってTCP切断処理が開始されます。接続されていたTCPコネクションに対してFINフラグが付いたパケットがOracleクライアントに返されます。そのため、Oracleクライアントは即時に切断を検出することができます。
しかし、ノード障害のようにOSごと無応答になってしまう場合、Oracleクライアントは障害のタイミングによってはTCPタイムアウトを待ってしまう場合があります。この状況に対処するため、RAC 10g R1から高速接続フェイルオーバー(Fast Connection Failover : FCF)という機能が実装されました。FCFは、GIとFCFに対応したコネクション・プールの連携機能です。FCFに対応したコネクション・プールにはUniversal Connection Pool for Java(UCP)やOracle Data Provider for .NET(ODP.NET)、OCIセッション・プールがあります。
GIがノード障害やOracleインスタンス障害を検出すると、正常ノードによってDOWNイベントが生成され、Oracleクライアントのコネクション・プールに通知されます。コネクション・プールはこのDOWNイベントを受け、該当する障害インスタンスとのコネクションをプールから削除します(図2)。
このようにして、OracleクライアントはTCPタイムアウトを待つよりも早く障害コネクションをクリーンアップすることができます。FCFのOracleクライアントとGI間のイベント通知経路はランタイム接続ロード・バランシングと同じです。これら2つの機能は同じ経路で異なるタイプのメッセージを通知しています。