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

APサーバ・Weblogic

データ・ソース構成

構成概要

WebLogicで使用するデータ・ソースのタイプは主に「汎用データ・ソース」、「マルチ・データ・ソース(MDS)」、「Active GlidLink(AGL)」の3タイプです。各データ・ソースの特徴はざっくりこんな感じです。

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

データソース・タイプ説明
汎用データ・ソースシングル構成やH/A構成のDB接続に使用。複数インスタンス(RAC構成)を対象とした
フェイルオーバー、接続ロードバランシング設定可能。
FCF(高速アプリケーション通知)使用不可
マルチデータ・ソース(MDS)汎用データソースを束ねて論理的に一つのデータソースを構成。
データソース(通常タイプ)の機能に加え汎用データソース間でラウンドロビンによるリクエスト投入先DBインスタンスの振り分けが可能。FCFは使用不可
Active GridLink(AGL)バック・エンド・ノードの能力(CPU、可用性、応答時間など)に応じた作業の分散を調整するランタイム接続ロード・バランシング(RCLB)、FCFによる高速フェイルオーバーを設定可能
※AGLの使用にはServer Enterprise EditionまたはWebLogic Suiteのライセンスが必要

正直なところ、私はAGLを実際の業務で扱ったことがないのでマニュアルを読んでもRCLBやFCFが実際にはどんな挙動を示すのかよくわかりません。なのでAPサーバ#1にマルチデータ・ソース、APサーバ#2にActive GlidLink の2パターンでデータ・ソースを定義していくつか簡単なテストケースでもってのちほど機能面のざっくりした比較をやってみたいと思います。

とりあえずMDSはDBサーバ#1のPDB(prpdb1)とDBサーバ#2のPDB(prpdb2)に各100本、AGLはprpdb1 / prpdb2合計で200本の接続構成とし、各DSの挙動を見てから最終的な設定を決定します。MDS、AGLともにDBの接続サービスはonline_srvです。

事前準備

DBサーバ側のファイアウォール設定

現在、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が停止している場合は起動します。

【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

※各汎用データソースのURLにFAILOVERを設定すればAGLみたくDBノード障害時にアクティブ・ノードに接続が移動しますが、ChatGpt曰く接続管理にいろいろよろしくない面が生じるのでお勧めしないとのこと。

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

設定項目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-con.exsample.lan:6200,prsdb02-con.exsample.lan:6200

※2025/9/23修正:ONSノードが実IP(ホスト名)となっていましたがVIP(ホスト名)が正解です。

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アプリケーションを作成します。

APサーバ構築 関連ページ
1.Weblogicインストール
2.WebLogicドメイン構築
3.JDBC接続
4.DB接続確認用アプリ作成
5.アプリ・デプロイ
6.本番モード切替

修正履歴

2025/9/23

Active Grid Linkの構成からONSノードの指定をDBサーバの実IP(ホスト名)指定からVIP(ホスト名)指定に修正しました。

実アドレス指定でも動作はしますが接続先DBインスタンスのサーバ・ダウンにはうまく対応できません(検知に時間がかかる)。

なお、「Oracle WebLogic Server JDBCデータ・ソースの管理」には”ONSノード・リストを構成する場合、値を指定せず、自動ONSによるONS構成の実行を許可することをお薦めします。”なんて書いてありますが、実際にその通りにしてみたところリクエスト投入先のDBインスタンスに偏りが生じてランタイム・ロード・バランシングがうまく機能しないように見受けられたためONSノードの設定自体は(VIP指定に修正したけれども)残しています。

2025/10/25
「構成概要」のAGL、MDSの記述がごちゃごちゃしていたんでずっぱり簡素化させました。

コメント

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