トップ > DBA上級 RAC > 11章
11章 サービス 応用編
それでは本章もRACのデータベースサービスについてご紹介していきます。

前回は基本的なサービスの作成についてご紹介してまいりました。

今回はPDB用のサービスや、SELECT実行中でも継続することが出来る
サービスの作成などについて確認していきます。


PDB用のサービス



Oracle 12cからはマルチプラガブルデータベース構成となる為、
アプリケーションは通常CDBではなくPDBに接続します。

前回のサービスはすべてCDBへ接続する為のサービスでした。

12cでも非CDBの構成を作成することができるので、
その場合は前回のサービスの作成で問題ありませんが、
PDB構成の場合は、PDB用のサービスを作成する必要があります。

またRAC環境の場合、srvctl start databaseコマンドでDBを起動します。
この起動はCDBは起動できますが、PDBは起動できません。

その為、PDBサービスを起動する場合、
SQLコマンドのalter pluggable databaseコマンドで起動する必要がありました。

その為、PDBを自動起動する場合はトリガーなどの方法で対応する必要がありますが、
PDB用のサービスを作成することで、srvctl start databaseコマンドのCDBが起動時に、
依存関係によりPDBを自動起動することが出来るようになります。

それでは構文を確認してみましょう。

[構文] PDB用サービスの作成
 $ srvctl add service -d DB名 -s サービス名 -pdb PDB名
 -preferred 優先インスタンス [-available 使用可能インスタンス]

※[-d]は-databaseの略です。

それでは試しに作成してみましょう。

   $ crsctl stat res -t -w "TYPE = ora.service.type"
   --------------------------------------------------------------------------------
   Name           Target  State        Server                   State details
   --------------------------------------------------------------------------------
   Cluster Resources
   --------------------------------------------------------------------------------
   ora.orcl.test1.svc
         1        ONLINE  ONLINE       rac01                    STABLE
         2        ONLINE  ONLINE       rac02                    STABLE
   ora.orcl.test2.svc
         2        ONLINE  ONLINE       rac01                    STABLE
   --------------------------------------------------------------------------------


test1,test2サービスは前回作成したサービスでした。

test1:優先インスタンス(rac01,rac02)のCDB接続用サービス
test2:優先インスタンス(rac01),使用可能(rac02)のCDB接続用サービス

今回はPDB接続用サービスをtest3_pdbと言う名前で作成していきます。
PDB名はpdb1となっています。

   $ srvctl add service -d orcl -s test3_pdb -pdb pdb1 
      -preferred orcl01 -available orcl02

   $ crsctl stat res -t -w "TYPE = ora.service.type"
   --------------------------------------------------------------------------------
   Name           Target  State        Server                   State details
   --------------------------------------------------------------------------------
   Cluster Resources
   --------------------------------------------------------------------------------
   ora.orcl.test1.svc
         1        ONLINE  ONLINE       rac01                    STABLE
         2        ONLINE  ONLINE       rac02                    STABLE
   ora.orcl.test2.svc
         2        ONLINE  ONLINE       rac01                    STABLE
   ora.orcl.test3_pdb.svc
         1        OFFLINE OFFLINE                               STABLE
   --------------------------------------------------------------------------------


test3_pdbサービスが作成されました。サービスを起動する前に一度PDBの状態を確認します。

  $ sqlplus / as sysdba

  SQL*Plus: Release 12.2.0.1.0 Production on XX XX XX XX:XX:XX 2018

  Copyright (c) 1982, 2016, Oracle.  All rights reserved.


  Connected to:
  Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

  SQL> show pdbs

      CON_ID CON_NAME                       OPEN MODE  RESTRICTED
  ---------- ------------------------------ ---------- ----------
           2 PDB$SEED                       READ ONLY  NO
           3 PDB1                           MOUNTED

まだPDB1はMOUNTEDである為、起動していません。
それではtest3_pdbサービスを起動してみます。


   $ srvctl start service -d orcl -s test3_pdb

   $ crsctl stat res -t -w "TYPE = ora.service.type"
   --------------------------------------------------------------------------------
   Name           Target  State        Server                   State details
   --------------------------------------------------------------------------------
   Cluster Resources
   --------------------------------------------------------------------------------
   ora.orcl.test1.svc
         1        ONLINE  ONLINE       rac01                    STABLE
         2        ONLINE  ONLINE       rac02                    STABLE
   ora.orcl.test2.svc
         2        ONLINE  ONLINE       rac01                    STABLE
   ora.orcl.test3_pdb.svc
         1        ONLINE  ONLINE       rac01                    STABLE
   --------------------------------------------------------------------------------

   $ sqlplus / as sysdba
   SQL> show pdbs

       CON_ID CON_NAME                       OPEN MODE  RESTRICTED
   ---------- ------------------------------ ---------- ----------
            2 PDB$SEED                       READ ONLY  NO
            3 PDB1

サービスを起動することによりPDB1が起動しました。
それではtest3_pdbを使用してみましょう。


   $ sqlplus system/manager@scan.oracle12c.jp:1521/test3_pdb

   SQL*Plus: Release 12.2.0.1.0 Production on XX XX XX XX:XX:XX 2018

   Copyright (c) 1982, 2016, Oracle.  All rights reserved.

   Last Successful login time: XX XX XX XX:XX:XX +09:00

   Connected to:
   Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

   SQL> show con_name

   CON_NAME
   ------------------------------
   PDB1


PDBに接続できました。

PDB用のサービスを作成したことでPDBの起動も自動化が可能です。
サービスはDB起動時に自動的に起動します。

その為、srvctl start databaseでDBを起動すればPDBまで起動が可能になります。

またデータベースの自動起動を有効にしておけばsrvctl start databaseも
必要なく自動的に起動します。


サーバサイドロードバランス機能を使用したサービス


次はロードバランス機能を備えたサービスについて確認していきます。
ロードバランスはDBサーバの負荷分散の機能であり、
優先インスタンスが複数ある場合、DBサーバの負荷を考慮して接続を行ってくれます。


サービスを使用したロードバランス

   $ srvctl config service -d orcl -s test1
   サービス名: test3_pdb
   サーバー・プール:
   ・・・省略・・・
   接続ロード・バランシングの目標: LONG
   ・・・省略・・・


デフォルトはロードバランスがLONGとなっています。

LONGは接続数を均等にするよう接続を振り分けます。
SHORTの場合はサーバの負荷状況によって接続を振り分けます。

ロードバランスの設定は-clbgoal [LONG|SHORT]で変更ができます。

ではまずLONGの状態で接続が均等になるか確認してみます。

現在は以下のようにサーバ1(rac01)側の負荷が高い状態になっています。

サーバ1(rac01) ロードアベレージ 約3.5付近
サーバ2(rac02) ロードアベレージ 約2.5付近

LONGの場合は負荷に関係なくセッション数は均等となります。
今回は以下SELECT文で各インスタンスのセッションを確認します。


   SQL> col machine for a20
     2  select inst_id,machine,count(*) 
     3  from gv$session 
     4  where username not in ('SYS','SYSRAC') group by inst_id,machine;

gv$instanceは全インスタンスの情報を取得できるRAC固有のV$ビューです。
接続は簡易接続を使用します。
    sqlplus system/manager@scan.oracle12c.jp:1521/test1


それでは試していきたいと思います。まずは10セッション接続してみます。

   SQL> /

      INST_ID MACHINE                COUNT(*)
   ---------- -------------------- ----------
            1 rac01.oracle12c.jp            5
            2 rac01.oracle12c.jp            5


次は50セッション接続させます。

   SQL> /

      INST_ID MACHINE                COUNT(*)
   ---------- -------------------- ----------
            1 rac01.oracle12c.jp           25
            2 rac01.oracle12c.jp           25


接続数が均等になりました。CLBGOALがLONGなので負荷は意識せず、接続を均等に振り分けます。 次はCLBGOALをSHORTに変更します。

   $ srvctl modify service -d orcl -s test1 -clbgoal SHORT
   $ srvctl config service -d orcl -s test1
   サービス名: test3_pdb
   サーバー・プール:
   ・・・省略・・・
   接続ロード・バランシングの目標: SHORT
   ・・・省略・・・

   $ srvctl stop service -d orcl -s test1
   $ srvctl start service -d orcl -s test1


では50セッション接続させます。

   SQL> /

      INST_ID MACHINE                COUNT(*)
   ---------- -------------------- ----------
            1 rac01.oracle12c.jp           10
            2 rac01.oracle12c.jp           40


負荷が高いサーバ1(rac01)には10セッションで負荷の
低いサーバ2(rac02)には40セッション接続しました。

このように接続数、負荷を考慮した接続の振り分けをしたい場合はCLBGOALオプションで
設定が可能です。デフォルトはLONGとなりますので、状況に応じて作成してみてください。


透過的アプリケーションフェイルオーバー(TAF)


サービスを使用したフェイルオーバー機能について確認していきます。

フェイルオーバーにはクライアント側とサーバ側の2種類あります。

クライアント側フェイルオーバー
サービスを使用した接続インスタンスの振り分け

クライアントフェイルオーバーは接続時、障害が発生しているインスタンスに接続し、
接続が失敗してしまった場合、次のインスタンスに再接続する機能です。

これはSCANを使用した接続を行えば特に意識する必要なくこの機能が有効となります。
SCANでない場合は、TNSNAMESに複数のVIPアドレスを指定し、FAILOVER=ON(デフォルトON)
を指定することでこの機能が有効になります。

透過的アプリケーションフェイルオーバー(TAF)は
DB接続後に障害でインスタンスダウンが発生した場合、
自動的に別インスタンスに接続する機能です。


透過的アプリケーションフェイルオーバー(TAF)

TAFの機能を使用するためにはJava Database Connectivity(JDBC)、
Oracle Call Interface(OCI)ドライバで接続する必要があります。

あとはサービスのfailovermethodを設定するだけです。
もしくはTNSファイルに以下のように(failover_mode= (type=select)(method=basic))
を設定することでサービスの設定はせずにする方法も可能です。

   TAF = (DESCRIPTION=
             (ADDRESS=(PROTOCOL=TCP)(HOST=scan.oracle12c.jp)(PORT=1521))
             (CONNECT_DATA=
              (SERVICE_NAME=test1)
              (FAILOVER_MODE=(TYPE=SESSION)(METHOD=BASIC))
              )
          )


TYPE項目にはSESSION,SELECTがあります。
SESSION:障害時、再接続を実施
SELECT:障害時、SELECT実行中の場合、再接続後、SELECTを継続実施

では今回はサービスの設定を行って接続を試してみます。

  $ srvctl config service -d orcl -s test1
  ・・・省略・・・
  フェイルオーバー・タイプ:


まだデフォルトは設定がありません。では設定していきます。

  $ srvctl modify service -d orcl -s test1 -failovertype SESSION
  $ srvctl config service -d orcl -s test1
  ・・・省略・・・
  フェイルオーバー・タイプ: SESSION

  $ sqlplus system/manager@scan.oracle12c.jp:1521/test1

  SQL> select username,failover_type,failover_method
    2  from v$session where username = 'SYSTEM';

  USERNAME             FAILOVER_TYPE FAILOVER_M
  -------------------- ------------- ----------
  SYSTEM               SESSION       BASIC


現在のTAFのモードは上記で分かります。
今回は障害時セッションを継続させます。

   SQL> select instance_name from v$instance;

   INSTANCE_NAME
   ----------------
   orcl02


ではこの時点ではorcl02に接続中です。
ここでインスタンス障害を発生させてみます。
インスタンス障害はノード2のSMONプロセスをkillして発生させます。

   SQL> select instance_name from v$instance;
   select instance_name from v$instance
   *
   ERROR at line 1:
   ORA-25408: can not safely replay call

   SQL> select instance_name from v$instance;

   INSTANCE_NAME
   ----------------
   orcl01


orcl01に自動的に再接続されました。

障害発生直前は上記のようにエラーになりますが、
少し経つと、別のインスタンスに再接続が完了します。

今回はSESSIONですがSELECTとした場合、SELECT実行中にサーバがダウンしても、
再接続完了までSQLが停止したように見えますが、その後再開されてエラーなくSELECTを
別のインスタンスで継続することが出来ます。

今回は画面のみの表示だけだと伝わりづらいのですが、環境がある場合は、是非試してみてください。

以上がサービスについての内容となります。

いかがでしたでしょうか。11章を通してRACについての内容をご紹介していきました。
まだバックアップリカバリやパフォーマンスチューニングなどお伝えしたい内容もあるので、
また次回掲載していきたいと思います。

本章は以上となります。お疲れ様でした。