前回の連載ではOracle Real Application Clusters(RAC)の障害時の自動リカバリの仕組みを解説しました。今回はRACサーバー側で発生した障害に対し、Oracleクライアントがどのような動作をするのかを解説します。RAC 12c R1から、障害発生時にトランザクションを自動再実行するアプリケーション・コンティニュイティの機能が実装され、障害をアプリケーションからマスクできるパターンが増えました。
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つの機能は同じ経路で異なるタイプのメッセージを通知しています。
この記事は参考になりましたか?
- イチから学ぶデータベース最新技術 - Oracle Real Application Clusters編連載記事一覧
-
- Oracle Automatic Storage Managementのアーキテクチャ
- Oracleクライアントから見た障害フェイルオーバー
- RACの障害リカバリ
- この記事の著者
-
日下部 明(クサカベ アキラ)
日本オラクル データベース担当。Oracle GRID Centerのラインマネージャとしてオラクルの持つ最新技術をパートナー各社と共同で検証し、多くのホワイトペーパーを執筆・レビュー。以後、その経験を元にミッションクリティカルな案件のソリューションデザインの提案などを担当。データベースセキュリティ...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア