OCIでDBCSの内部IPと重複するIPを使用している場合に、ロード・バランサを使って回避する方法

Oracle Cloud Infrastructure（以下、OCI）の Database Cloud Service（以下、DBCS）ではOracle Clusterwareプライベート・インターコネクトによって使用される内部的なIPがあります。（以下、内部IP）

https://docs.oracle.com/ja-jp/iaas/Content/Database/Tasks/network.htm
<table><tr><td><b>IPアドレス空間の要件</b>
ベア・メタルまたは仮想マシンDBシステム用に作成するサブネットは、データベース・インスタンス上のOracle Clusterwareプライベート・インターコネクトによって使用される192.168.16.16/28と重複できません。
</td></tr></table>
このドキュメントには誤りがあり、正しくは 192.168.16.18/24 が使用されているようです。

正規の回避策はマニュアルのとおり、IPアドレス空間が重複しないようにネットワークを構成することです。
ただ、すでに社内環境などで同じアドレス空間を使用している場合などは、アドレス体系を変更することは簡単なことではないケースがあります。

IPアドレス空間が重複することはよくないことなのは当然なのですが、実害という観点では、重複したアドレス空間に所属する機器とDBCSが直接疎通しない限りは問題は発生しません。
例えば、IPアドレス 192.168.16.1 を持つクライアントからDBCSにアクセスすると疎通できませんが、間にアプリケーション・サーバーを挟めばシステムとしては問題なく稼働します。
言い換えると、間にプロキシのような機器を介してやりとりすれば、疎通できることになります。

Oracle Databaseの機能で言うと、Connection Manager がそれに該当しますが、より安価に、そして簡単に構築できる回避策として ロード・バランサを使って回避する方法を記載します。

### 0.検証環境 ###

今回は以下のような環境で検証を行いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/e7062775-76e9-2e65-fadf-b931a187063d.png)
DBCSとクライントに該当するComputeが同じ仮想クラウド・ネットワーク（VCN）に存在しています。
ComputeはDBCSの内部IPと重複するサブネット（192.168.16.0/24）に所属しています。


### 1.クライアントからDBCSに直接接続 ###

まずは、クライアントとなる Computeから DBCSに直接接続してみましょう。
クライアントのtnsnames.oraにDBCSのIPアドレスを設定します。

```
privatedb =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.130)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = DB19c_db19c.sub11150127121.vcn2.oraclevcn.com)
    )
  )
```

SQL*Plusで接続してみます。

```
[opc@develop ~]$ sqlplus system/xxxxxxxxxxxx@privatedb

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Nov 25 09:45:40 2021
Version 19.10.0.0.0

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

ERROR:
ORA-12170: TNS:Connect timeout occurred
```

タイムアウトでエラーになり接続することができませんでした。
おそらく、DBCSではクライアントのIPアドレスは内部的なIPと認識するため、応答が返ってこないのが原因だと推測されます。

### 2.ロード・バランサの作成 ###

#### 2-1.ロード・バランサの作成 ####

まずは、ロード・バランサを作成します。
OCIコンソールの左上三本線メニューより「ネットワーク＞ロード・バランサ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/dfe5f5e4-7d43-e4c0-4022-eac78bc29173.png)
［ロード・バランサの作成］ボタンを押し、作成ウィザードを起動します。

ロード・バランサ・タイプの選択画面では、「ロード・バランサ」を選択し、［ロード・バランサの作成］ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/3448a2db-f93d-ab75-b02c-d15dc6f1799a.png)
「詳細の追加」画面で任意のロード・バランサ名を指定し、今回はプライベート・ネットワークなので、可視性タイプを「プライベート」に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/adf58930-14a9-db7f-f79a-fc45d0046404.png)
下にスクロールして、帯域幅を設定します。
「動的シェイプ」は将来的にサポートされなくなる予定のため、「フレキシブル・シェイプ」を選択します。
必要に応じて「最小帯域幅」「最大帯域幅」を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/9b762180-2446-393e-5960-bf4d4724fd63.png)
さらに下にスクロールして、ロード・バランサの所属するネットワークを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/aa12ca15-1c1f-371d-4d2f-0019c819f1b5.png)
［次］ボタンを押して、「バックエンドの選択」画面に進みます。

まずは、ロード・バランシング・ポリシーを設定します。
今回は、プロキシとして機能させることが目的で、バックエンド・サーバーは１台のデータベースを想定しているため、デフォルトの「重み付けラウンド・ロビン」にしておきます。（バックエンドの追加はここでは行わないでおきます（あとで設定します））
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/5966e080-14a4-be44-54e9-960d767ca8dc.png)
下にスクロールして、ヘルスチェック・ポリシーを設定します。
プロトコルは「TCP」を選択し、ポートはDBCSへの接続ポートを設定します。
今回は Oracle Databaseのデフォルトである「1521」を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/e9d7caa8-5d88-4d34-e110-b6cf059cae4d.png)
拡張オプションの表示リンクを押して、バックエンド・セット名をわかりやすい名前にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/8e20e6d4-cece-3995-98e1-aa0bcb944aee.png)
［次］ボタンを押して、「リスナーの構成」画面に進みます。

任意のリスナー名を設定し、「リスナーで処理するトラフィックのタイプ」は「TCP」を選択します。
「リスナーでイングレス・トラフィックをモニターするポート」には、前画面で設定したDBCSへの接続ポートを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/e089f1d4-7e9e-cdaf-2f2c-06f2c45ddfe9.png)
［次］ボタンを押して、「ロギングの管理」画面に進みます。

今回はエラーログのみ取得する設定にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/657c5df0-1370-7bdb-1c9b-183e3ae9f53a.png)
すべて設定できたら、［送信］ボタンを押してロード・バランサを作成します。
この時点では、バックエンドセットを設定していないため、ヘルスチェックは「不完全」となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/f4eadf12-b62f-beb2-0dec-f25484a2cd46.png)

#### 2-2.バックエンド・サーバーの追加 ####

バックエンド・セットにDBCSを追加します。

ロード・バランサ詳細画面の左下にあるリソース・メニューから「バックエンド・セット」を選択し、先ほど作成したバックエンド・セットを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/b7e442f6-47d1-b874-e01f-a07d1515a18d.png)
バックエンド・セットの詳細画面の左下にあるリソース・メニューから「バックエンド」を選択し、「バックエンドの追加」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/506e726e-a0b0-aabe-b027-1de56b7f5fd6.png)
バックエンドの追加画面で、追加方法として「IPアドレス」を選択し、DBCSのプライベートIPとポートを設定します。（ポートにはDBCSへの接続ポートを設定します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/6d624540-1973-645d-dd9a-7453428c0a59.png)
［追加］ボタンを押すと「作業リクエスト送信済」のダイアログが表示され、しばらく待つとステータスが「受入れ済」から「成功」に変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/863b4876-3d4f-89ba-0dd0-f96dd20d71c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/3f580935-70d4-facf-6438-b7148bed369b.png)
しばらすると、バックエンドのヘルス状態が「OK」に変わります。（数分かかります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/b45d5b2c-5411-cccd-2814-ff0ab2172f1d.png)
ロード・バランサの詳細画面に戻ると、ヘルスチェックが「OK」に変わっているのがわかります。（ここも反映されるのに少しタイムラグがあるかもしれません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/95dc1089-a64a-5c6e-7af9-90b35819b83e.png)
画面上のロード・バランサの「IPアドレス」を控えておきます。

### 3.クライアントからロード・バランサを経由してDBCSに接続 ###

今度は、クライアントとなる Computeから、作成したロード・バランサを経由して DBCSに接続してみましょう。
クライアントのtnsnames.oraにロード・バランサのIPアドレスを設定します。

```
lb_privatedb =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.173)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = DB19c_db19c.sub11150127121.vcn2.oraclevcn.com)
    )
  )
```

SQL*Plusで接続してみます。

```
[opc@develop ~]$ sqlplus system/xxxxxxxxxxxx@lb_privatedb

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Nov 25 09:48:49 2021
Version 19.10.0.0.0

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

Last Successful login time: Wed Nov 17 2021 09:14:14 +00:00

Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

SQL>
```

ロード・バランサを経由することで、DBCSの内部IPと重複するクライアントからでも、DBCSに接続することができました。

### 注意点

ロード・バランサにはアイドル・タイムアウトの設定があり、TCPリスナーのデフォルト値は300秒です。

ロード・バランサ作成時のリスナー構成の拡張オプション、または作成後のリスナー編集でアイドル・タイムアウト時間を設定できるので、必要に応じて変更してください。