APサーバ構築3(JDBC接続)

APサーバ・Weblogic

データ・ソース構成

構成概要

WebLogicサーバ・インスタンスとOracle DBの通信は常設のDBコネクション、いわゆるコネクション・プーリングを通して行われます。この接続を定義するデータ・ソースのタイプは主に「汎用データ・ソース」、「マルチ・データ・ソース」、「Active GlidLink(AGL)」の3タイプ、他に「UCPデータ・ソース(UCP:Oracle Universal Connection Pooling)」なんてのもありますがこれはWebLogicではほとんど使用されていないと思います。今回使用するのも先に挙げた3タイプのデータ・ソースでざっくり特徴を説明するとこんな感じです。

【WebLogicデータソース・タイプ】

データソース・タイプ説明
汎用データ・ソースシングル構成やH/A構成のDB接続に使用。複数インスタンス(RAC構成)を対象とした
フェイルオーバー、接続ロードバランシング設定可能。
FCF(高速アプリケーション通知)使用不可
マルチデータ・ソース汎用データソースを束ねて論理的に一つのデータソースを構成。
データソース(通常タイプ)の機能に加え汎用データソース間でラウンドロビンによるリクエスト投入先DBインスタンスの振り分けが可能。
FCF使用不可
Active GridLinkDBインスタンスの負荷状況に応じてリクエスト投入先を分散するランタイム・ロードバランシング、FCFによる高速フェイルオーバーを設定可能

機能面で言えばActive GridLink一択ですが、これがちょっとお高くて使用できるライセンスはEnterprise Edition以上(WebLogic Server Enterprise EditionまたはWebLogic Suite)となっており、どのデータソースを使うかはロードバランシングやフェイルオーバーの要件と費用のご相談というところです。

一口にロードバランシングといってもDB接続時のバランシング、コネクション・プーリングを介したリクエストの投入先のバランシングがあり、後者についてはラウンドロビンによる静的ロードバランシングとDBインスタンスの負荷状況に応じてリクエストの投入先を振り分ける、いわゆるランタイム・ロードバランシングがあります。また、フェイルオーバーについても通常のフェイルオーバーの他、ONSの高速アプリケーション通知によって障害発生から短時間で接続切り替えを行う高速接続フェイルオーバー(Fast Connection Failover: FCF)があります。

こうした機能の使用にはサーバサード、クライアントサイドでそれぞれの設定があり、マニュアルを読んでも(私にとっては)正直ちょっとややこしいところです。なのでとりあえずAPサーバ#1にマルチデータ・ソース、APサーバ#2にActive GlidLink の2パターンでデータ・ソースを定義していくつか簡単なテストケースでもって機能面のざっくりした比較をやってみたいと思います。

マルチ・データ・ソースはDBサーバ#1(インスタンスprdb1)、DBサーバ#2(インスタンスprdb2)のPDBにそれぞれ100本、Active GlidLinkはDBサーバ#1、DBサーバ#2で合計200本(DB接続時の負荷状況により変動)のコネクションを張ってリクエストを振り分けます。

データ・ソースの障害運用はマルチ・データ・ソースの場合、そのノードへの振り分けを停止して残ったノードの接続だけを使用した縮退運用、Active GlidLinkの場合は高速フェイルオーバー(FCF)です。

マルチ・データ・ソースでも汎用データ・ソース側にフェイルオーバーを設定すればActive GlidLinkと同じような動きになりますが、この設定では接続の不整合や遅延、リトライによるタイムアウト延伸といった問題があるようなのでこれはやらない方が無難です。

なお、DBの接続サービスにはonline_srvサービス作成手順はこちら)を使用します。

事前準備

ファイアウォール設定

現在、DBサーバのファイアウォールはDBサーバ間の接続しか許可していません。このままではAPサーバからDBに接続できないのでOracle Net接続およびONSへの接続を許可します。

【prsdb01、prsdb02、prsdb03 / rootユーザで実行】
-----------------------------------------------------------------------------
# firewalldの現在の設定を確認
firewall-cmd --list-all

# APサーバからのOracle Net、ONSへのアクセスを許可(firewall-cmd~--permanentまで1行で記述)
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.30.51" port port="1521" protocol="tcp" accept' --permanent

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.30.51" port port="6200" protocol="tcp" accept' --permanent

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.30.52" port port="1521" protocol="tcp" accept' --permanent

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.30.52" port port="6200" protocol="tcp" accept' --permanent


# 設定をリロード
firewall-cmd --reload

# 最新の設定を確認
firewall-cmd --list-all

CRS、DBインスタンス、PDB、サービス起動

DBサーバ#1、DBサーバ#2のCRSが停止している場合はCRSを起動します。

【prsdb01、prsdb02 / rootユーザで実行】
-----------------------------------------------------------------------------
# CRS起動(prsdb01→prsdb02の順に1台ずつCRSを起動)
/opt/app/21.0.0/grid/bin/crsctl start crs -wait

DBサーバ#1からDBインスタンス、PDB、online_srvサービスの起動状況を確認し、停止している場合は起動します。

【prsdb01で実行】
-----------------------------------------------------------------------------
# oracleユーザにスイッチ
su - oracle

# DBの起動状況を確認
srvctl status database -db prdb

# DBが停止している場合は起動
srvctl start database -db prdb

# PDBの起動状況を確認
srvctl status pdb -db prdb -pdb prpdb

# PDBが停止している場合は起動
srvctl start pdb -db prdb -pdb prpdb

# online_srvサービスの起動状況を確認
srvctl status service -db prdb -service online_srv

# online_srvサービスが停止している場合は起動
srvctl start service -db prdb -service online_srv

アプリケーション用のオブジェクトを格納するための表領域とWebLogicからDBへの接続に使用するOracleユーザを作成します。このユーザはDB接続、オブジェクト作成、管理ビューへのアクセスを行うので必要な権限も付与しておきます。

【prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
# DBに接続
sqlplus / as sysdba

# コンテナをPDBに移動
alter session set container = prpdb;

# ユーザ・テーブル用表領域、ユーザ・インデックス用表領域を作成
create tablespace USERTBL01 datafile '+DG21/PRDB/prpdb/usertbl01.dbf' size 10G autoextend on next 16M;
create tablespace USERIDX01 datafile '+DG21/PRDB/prpdb/useridx01.dbf' size 5G autoextend on next 16M;


# ユーザ作成
create user PDBUSER identified by pdbuser
default tablespace USERTBL01 temporary tablespace TEMP
quota unlimited on USERTBL01
quota unlimited on USERIDX01;


# 権限付与
grant CREATE SESSION, RESOURCE, SELECT_CATALOG_ROLE to PDBUSER;

WebLogic起動

APサーバのAdmin Serverが停止している場合はAdmin Serverを起動します。

【prsap01、prsap02 / oracleユーザで実行】
-----------------------------------------------------------------------------
/opt/app/oracle/bin/startWebLogic_prs.sh

Managed Serverが起動している場合はManaged Serverを停止します。

【prsap01、prsap02 / oracleユーザで実行】
-----------------------------------------------------------------------------
/opt/app/oracle/bin/stopManagedWebLogic_prs.sh

マルチ・データ・ソース作成(APサーバ#1)

汎用データソースを2本作成し、これを束ねてマルチ・データ・ソースを構成します。汎用データ・ソース①は接続先DBインスタンスがprdb1、汎用データ・ソース②は接続先DBインスタンスがprdb2、負荷分散はマルチ・データ・ソース側に設定します。設定可能な振り分け方式はラウンドロビン一択です。

【マルチ・データ・ソース構成】

設定項目設定値
マルチデータ・ソース名DS_PDBUSER_10
汎用データ・ソースGDS_PDBUSER_11
GDS_PDBUSER_12
負荷分散方式ラウンドロビンによる各汎用データ・ソースへの静的ロードバランシング

【汎用データソース】

設定項目汎用データ・ソース①汎用データ・ソース②
データソース名GDS_PDBUSER_11GDS_PDBUSER_12
DB接続ユーザPDBUSERPDBUSER
接続ホストprsdb01-conprsdb02-con
接続サービス名online_srvonline_srv
ロードバランスOFFOFF
初期要領 / 最大容量 / 最小要領100 / 100 / 100100 / 100 / 100

汎用データソース作成

WebLogic Remote Consoleを起動してAPサーバ#1に接続、ツリーの編集画面で「サービス」を展開、「データ・ソース」-「新規」をクリックします。

以下の設定で汎用データ・ソース①と汎用データ・ソース②を作成します。

【データ・ソース作成画面】

設定項目汎用データ・ソース①汎用データ・ソース②
名前GDS_PDBUSER_11GDS_PDBUSER_12
JNDI名GDS_PDBUSER_11GDS_PDBUSER_12
ターゲットprs_ap01(チェックして「>」クリック)prs_ap01(チェックして「>」クリック)
データ・ソース・タイプ汎用データソース汎用データソース
データベース・タイプOracleOracle
データベース・ドライバ*Oracle’s Driver (Thin) for RAC Service-Instance connections; Versions:Any*Oracle’s Driver (Thin) for RAC Service-Instance connections; Versions:Any
グローバル・トランザクション・プロトコルOnePhaseCommitOnePhaseCommit
データベース名prdb1prdb2
ホスト名prdb01-conprdb02-con
サービス名online_srvonline_srv
ポート15211521
データベース・ユーザー名PDBUSERPDBUSER
パスワード<DBUSERパスワード><DBUSERパスワード>
プロトコルTCPTCP

すべての項目の設定が完了したら画面上部の「作成」をクリックします。

汎用データ・ソースの作成に成功すると編集画面に遷移します。まず「構成のテスト」をクリックしてDBに接続できていることを確認します。

汎用データ・ソースの設定を行います。「接続プール」タブの「一般」タブと「拡張」タブをクリックして以下の通り編集します。なお、設定は各タブごとに保存します。

【接続プール – 一般タブ設定内容】

設定項目GDS_PDBUSER_11GDS_PDBUSER_12
URLjjdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=prsdb01-con.exsample.lan)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=online_srv)))jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=prsdb02-con)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=online_srv)))
初期要領100100
最大容量100100
最小要領100100

※2025/7/6 /etc/hostsのドメイン名記載誤り修正(prsite.local → exsample.lan)。URLは修正後のホスト名を指定

【接続プール – 拡張タブ設定内容】

設定項目GDS_PDBUSER_11 / GDS_PDBUSER_12
予約時に接続をテストオン
テスト頻度60
テスト対象の表名SQL select 1 from dual
縮小頻度0
接続作成の再試行間隔2

一通り設定が終わったら「一般」タブ(上段のタブ) -「構成のテスト」をクリックして構成に問題がないことを確認します。

マルチ・データ・ソース作成

WebLogic Remote Console画面左ツリーの「データ・ソース」をクリックしてデータソースの管理画面を表示、画面上部の「新規」をクリックします。

以下の設定でマルチ・データ・ソースを作成します。

【データ・ソース作成画面】

設定項目設定値
名前DS_PDBUSER_10
JNDI名DS_PDBUSER_10
ターゲットprs_ap01(チェックして「>」クリック)
データ・ソース・タイプマルチ・データ・ソース
アルゴリズム・タイプロード・バランシング
XAドライバオフ
データ・ソースGDS_PDBUSER_11、GDS_PDBUSER_12(両方にチェックして「>」クリック)
※この操作は一回やっても無反応、2回目で成功します。バグですかね

マルチ・データ・ソースの作成が完了すると管理画面に遷移します。「一般」タブの「テスト頻度」を60に設定して保存をクリック、画面上部「ショッピング・カート」-「変更のコミット」をクリックして変更を確定させます。

DBサーバ#1でPRDBに接続して現在のDBセッションを確認します。Managed Serverが起動していないので下記のSELECT文を実行すると「レコードが選択されませんでした。」と返されるはずです。

【prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
# PRDBに接続
sqlplus / as sysdba

-- コンテナをPDBに移動
alter session set container = PRPDB;

-- 現在のDBセッションを確認
set pages 999 lines 100
col USERNAME format a8
col MACHINE format a8 trunc
col PROGRAM format a10 trunc

select INST_ID, MACHINE, USERNAME, PROGRAM, count(*) SESS_CNT
from GV$SESSION
where USERNAME is not NULL
and USERNAME != 'SYS'
group by INST_ID, MACHINE, USERNAME, PROGRAM
order by 1,2,3,4;

→ 。Managed Serverが起動していないので「レコードが選択されませんでした。」と返される

APサーバ#1のManaged Serverを起動します。Managed Serverを起動後、DBサーバ#1で同じSQLを再度実行してAPサーバ#1からDBサーバ#1、DBサーバ#2に各100本の接続が行われていることを確認します。

【prsap01 / oracleユーザで実行】
-----------------------------------------------------------------------------
/opt/app/oracle/bin/startManagedWebLogic_prs.sh
【prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
-- SQL再実行
r

-----------------------------------------------------------------------------
【SQL実行結果】
-----------------------------------------------------------------------------
SQL> r
1 select INST_ID, MACHINE, USERNAME, PROGRAM, count(*) SESS_CNT,to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') TMSTMP
2 from GV$SESSION
3 where USERNAME is not NULL
4 and USERNAME != 'SYS'
5 group by INST_ID, MACHINE, USERNAME, PROGRAM
6* order by 1,2,3,4

INST_ID MACHINE USERNAME PROGRAM SESS_CNT TMSTMP
---------- -------- -------- ---------- ---------- -------------------
1 prsap01. PDBUSER Server 100 2025/07/09 15:18:13
2 prsap01. PDBUSER Server 100 2025/07/09 15:18:13


SQL>

Active GlidLink作成(APサーバ#2)

WebLogic Remote ConsoleでAPサーバ#2に接続して「ツリーの編集」画面から「サービス」-「データ・ソース」-「新規」をクリックします。

データ・ソースの作成画面が表示されるので以下のように設定して「作成」をクリックします。

【データ・ソース作成・設定内容】

設定項目設定値
名前DS_PDBUSER_10
JNDI名DS_PDBUSER_10
ターゲットprs_ap02(チェックして「>」クリック)
データ・ソース・タイプGridLinkデータ・ソース
データベース・ドライバ*Oracle’s Driver (Thin) for GridLink Connections; Versions:Any
グローバル・トランザクション・プロトコルOnePhaseCommit
リスナーprsdb01-con.exsample.lan:1521
prsdb02-con.exsample.lan:1521
サービス名online_srv
データベース・ユーザー名PDBUSER
パスワード<PDBUSERパスワード>
プロトコルTCP
FANの有効化オン
ONSノードprsdb01.exsample.lan:6200,prsdb02.exsample.lan:6200

Active GlidLinkの作成に成功すると管理画面に遷移するので「構成のテスト」をクリックして構成に問題がないことを確認します。

「接続プール」タブをクリックして「一般」、「拡張」を以下の通り設定します。

【接続プール設定内容】

タブ設定項目設定値
一般初期容量200
一般最大容量200
一般最小容量200
拡張予約時に接続をテストオン
拡張テスト頻度60
拡張縮小頻度0
拡張接続作成の再試行間隔2

接続プールの設定及び保存が終了したら画面上部「ショッピング・カート」-「変更をコミット」をクリックして変更を確定させます。

Active GlidLinkの作成が完了したらDBサーバ#1でDB接続状況の確認用SQLを再実行して現在のDB接続状況を確認します。

【prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
-- SQL再実行
r

-----------------------------------------------------------------------------
【SQL実行結果】
-----------------------------------------------------------------------------
SQL> r
1 select INST_ID, MACHINE, USERNAME, PROGRAM, count(*) SESS_CNT,to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') TMSTMP
2 from GV$SESSION
3 where USERNAME is not NULL
4 and USERNAME != 'SYS'
5 group by INST_ID, MACHINE, USERNAME, PROGRAM
6* order by 1,2,3,4

INST_ID MACHINE USERNAME PROGRAM SESS_CNT TMSTMP
---------- -------- -------- ---------- ---------- -------------------
1 prsap01. PDBUSER Server 100 2025/07/09 15:18:13
2 prsap01. PDBUSER Server 100 2025/07/09 15:18:13

SQL>
-- 現時点ではAPサーバ#1からDBサーバへの接続のみ存在

APサーバ#2でManaged Serverを起動します。

【prsap02 / oracleユーザで実行】
-----------------------------------------------------------------------------
/opt/app/oracle/bin/startManagedWebLogic_prs.sh

DBサーバ#1でDB接続状況の確認用SQLを再実行してAPサーバ#2からDBサーバ#1、DBサーバ#2のそれぞれ約100本の接続が行われていることを確認します。

【prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
-- SQL再実行
r

-----------------------------------------------------------------------------
【SQL実行結果】
-----------------------------------------------------------------------------
SQL> r
1 select INST_ID, MACHINE, USERNAME, PROGRAM, count(*) SESS_CNT,to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') TMSTMP
2 from GV$SESSION
3 where USERNAME is not NULL
4 and USERNAME != 'SYS'
5 group by INST_ID, MACHINE, USERNAME, PROGRAM
6* order by 1,2,3,4

INST_ID MACHINE USERNAME PROGRAM SESS_CNT TMSTMP
---------- -------- -------- ---------- ---------- -------------------
1 prsap01. PDBUSER Server 100 2025/07/09 16:08:33
1 prsap02. PDBUSER Server 100 2025/07/09 16:08:33
2 prsap01. PDBUSER Server 100 2025/07/09 16:08:33
2 prsap02. PDBUSER Server 100 2025/07/09 16:08:33

SQL>
-- 今回はたまたまAPサーバ#2からDBサーバ#1、DBサーバ#2に各100本の接続を生成。タイミングによっては少しバラけます

これでデータ・ソースの作成は一旦終了です。続けて細かい挙動をいろいろテストしてみたいところですが、実際にアプリからDBに接続してみないとロードバランシングの挙動だの通常のフェイルオーバーとFCFの比較だのといった確認ができません。ということで次は接続確認用のWebアプリケーションを作成します。

コメント

タイトルとURLをコピーしました