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の機能を使用するためには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についての内容をご紹介していきました。
まだバックアップリカバリやパフォーマンスチューニングなどお伝えしたい内容もあるので、
また次回掲載していきたいと思います。
本章は以上となります。お疲れ様でした。