1. はじめに
Docker で Oracle Database のシングルインスタンス環境を構築する記事は見かけますが、RAC (Real Application Clusters) 環境を構築する記事はそんなに無さそうだったので記事にしたいと思い、改めて手順確認の意味も込めて構築してみたいと思います。
今回は Oracle Cloud Infrastructure (以降、OCI) で作成した一つの Compute 上に、 Docker で 4つのコンテナを作成し、4 Node の RAC 環境を構築します。 もちろん、Node 数は調整可能です。
1-1. 注意
-
Docker で 構成された Oracle Database は検証環境や開発環境でのみ利用できます。本番環境での利用はできませんのでご注意ください。
Oracle Database 21c(21.3)以降では本番環境での利用もできるようです。
参考 : Support Policy for Oracle Database Container Images on Kubernetes Clusters (Doc ID 2789626.1) -
今回の環境とは違いますが、本来 OCI で RAC 構成がサポートされるのは DBCS, ExaCS, ExaCCといったサービスです。複数の Compute で RAC を構成することはできませんのでご注意ください。
1-2. 環境
- Oracle Cloud Infrastructure Compute
- Oracle Linux 7.9
- Oracle Database 19c (19.3)
- Oracle Database 19c Grid Infrastructure(19.3)
- Docker
1-3. 参考ドキュメント
Oracle 公式 Github に記載の手順に従って構築していきます。
2. Compute の作成
まずは OCI で Compute を作成していきます。
OCI Console の左上のハンバーガーメニューをクリックし、[コンピュート] - [インスタンス] をクリックします。
インスタンス名を入力してください。ADはどれを選択しても大丈夫です。
イメージは Oracle Linux のデフォルトで選択されるバージョンとしました。
シェイプは今回 4 Node RAC とするので、なんとなく4コアくらい欲しいかなと思い VM.Standard2.4としました。
ネットワーク(VCN)は事前に作成済みという前提です。今回はInternetから接続可能な Public Subnet に作成します。Internet 経由で接続するため、[パブリックIPアドレスの割当] も選択します。
SSHキーの追加はお好みの方法で構いません。今回は [SSHキー・ファイルの選択] で事前に作成していたSSHキーを登録しました。
デフォルトだとブート・ボリュームが46GB程度しかなく、Docker で Oracle Database を構成するにはちょっと足りません。おそらく100GB程度あれば大丈夫ですが、今回は余裕を持って200GBとします。
なお、ここで指定するサイズは、Oracle Database の データファイルを格納する ASMディスク分の容量は含みません。ASM 分は後ほど追加しますので、一旦は考慮しなくて大丈夫です。
インスタンスが [実行中] になったら作成完了です。
[パブリックIPアドレス] が表示されるので、このIPアドレスにSSHでログインします。
3. Compute にログイン
Teraterm等のSSHクライアントで、作成したComputeにログインします。
- 接続先 : [パブリックIPアドレス]
- ユーザ名 : opc
- パスフレーズ : SSHキー作成時に指定していれば、ここでも同じものを指定
- 秘密鍵 : Compute作成時に指定したSSH公開鍵と対になる秘密鍵を指定
4. Compute OS設定
Computeを作成したらまずやること、的なのがいくつかあるのでやっていきます。
4-1. タイムゾーンの変更
タイムゾーンを Asia/Tokyo に変更します。
[opc@rac-instance01 ~]$ sudo timedatectl set-timezone Asia/Tokyo
[opc@rac-instance01 ~]$ timedatectl
Local time: Fri 2021-01-01 16:18:26 JST
Universal time: Fri 2021-01-01 07:18:26 UTC
RTC time: Fri 2021-01-01 07:18:27
Time zone: Asia/Tokyo (JST, +0900)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
[opc@rac-instance01 ~]$
4-2. ロケールの変更
ロケールを ja_JP.utf8 に変更します。これはお好みです。
[opc@rac-instance01 ~]$ sudo localectl set-locale LANG=ja_JP.utf8
[opc@rac-instance01 ~]$ localectl
System Locale: LANG=ja_JP.utf8
VC Keymap: us
X11 Layout: us
[opc@rac-instance01 ~]$ cat /etc/locale.conf
LANG=ja_JP.utf8
[opc@rac-instance01 ~]$
4-3. ブート・ボリュームの拡張
Compute 作成の際に指定した 200GB は、デバイスとしては 200GB になっているのですが、ファイルシステムとしは変わっていないので、/ をマウントしている /dev/sda3 を拡張します。
まずは事前の状態の確認です。
[opc@rac-instance01 ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk ★200GBになっている
-sda2 8:2 0 8G 0 part [SWAP]
-sda3 8:3 0 38.4G 0 part / ★約39GBしかない
-sda1 8:1 0 200M 0 part /boot/efi
[opc@rac-instance01 ~]$ df -h /
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/sda3 39G 11G 29G 27% / ★39GBしかない
拡張には、OCI ユーティリティ の oci-growfs を利用します。
oci-growfs
https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/oci-growfs.htm
インスタンスのルート・ファイルシステムを構成したサイズに拡張します。このコマンドはルートとして実行する必要があります。
oci-growfs を実行するだけでブート・ボリュームを拡張できるので非常に便利です。
[opc@rac-instance01 ~]$ sudo /usr/libexec/oci-growfs
CHANGE: partition=3 start=17188864 old: size=80486400 end=97675264 new: size=402241502 end=419430366
Confirm? [y/n]y ★ y を入力してEnter
CHANGED: partition=3 start=17188864 old: size=80486400 end=97675264 new: size=402241502 end=419430366
meta-data=/dev/sda3 isize=256 agcount=4, agsize=2515200 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=0 finobt=0, sparse=0, rmapbt=0
= reflink=0
data = bsize=4096 blocks=10060800, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=4912, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 10060800 to 50280187
[opc@rac-instance01 ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
-sda2 8:2 0 8G 0 part [SWAP]
-sda3 8:3 0 191.8G 0 part / ★残りすべての容量が割り当てられた
-sda1 8:1 0 200M 0 part /boot/efi
[opc@rac-instance01 ~]$ df -h /
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/sda3 192G 11G 182G 6% / ★残りすべての容量が割り当てられた
5. Compute Dockerホスト構築
Dockerホストとしての設定をしていきます。
5-1. yum アップデート
yum update しておきます。たぶん色々と更新するので時間かかります。
[opc@rac-instance01 ~]$ sudo yum update
5-2. git インストール
Oracle 公式の Docker Image をクローンするため、gitをインストールします。
[opc@rac-instance01 ~]$ sudo yum install git
5-3. Docker イメージのクローン
Oracle の Docker イメージをクローンします。
[opc@rac-instance01 ~]$ git clone https://github.com/oracle/docker-images.git
Cloning into 'docker-images'...
remote: Enumerating objects: 13371, done.
remote: Total 13371 (delta 0), reused 0 (delta 0), pack-reused 13371
Receiving objects: 100% (13371/13371), 9.75 MiB | 0 bytes/s, done.
Resolving deltas: 100% (7857/7857), done.
5-4. Oracle Database ソフトウェアの準備
Oracle Database の ソフトウェアの zip ファイルを準備します。
Oracle Database 19c (19.3)
https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html
※ OTN ライセンスの範囲内で利用してください。
普通にブラウザでダウンロードして SCP や FTP 等で Compute にアップロードしても良いのですが、それだと時間かかるし面倒なので、今回は直接 Compute 上でダウンロードします。といっても、ファイルのURL直接だとダウンロードできないので、ちょっと小細工します。
ライセンスのチェックを入れ、Download のボタンをクリックします。
ダウンロードが始まったら、すぐにブラウザ上で一時停止します。
Compute 上で zip を配置する場所へ移動し、コピーしたURLで直接ダウンロードします。
[opc@rac-instance01 ~]$ cd ~/docker-images/OracleDatabase/RAC/OracleRealApplicationClusters/dockerfiles/19.3.0/
[opc@rac-instance01 19.3.0]$ curl -0 https://download.oracle.com/otn/linux/oracle19c/190000/LINUX.X64_193000_db_home.zip?AuthParam=xxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx > LINUX.X64_193000_db_home.zip
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
58 2917M 58 1694M 0 0 75.0M 0 0:00:38 0:00:22 0:00:16 6193k
同様に、Grid Infrastructure の zip も同じ場所にダウンロードしてください。
5-5. yum リポジトリの準備
1年ほど前に構築したときは OCI Compute のデフォルトイメージが Oracle Linux 7.7 だったのですが、その際は docker-engine インストールのために yum リポジトリの追加が必要でした。
今回、デフォルトイメージが Oracle Linux 7.9 になっており、必要なリポジトリがデフォルトで存在したので不要でしたが、念の為手順を記しておきます。
[opc@rac-instance01 ~]$ cd /etc/yum.repos.d/
[opc@rac-instance01 yum.repos.d]$ grep 'ol7_addons' *.repo
oracle-linux-ol7.repo:[ol7_addons] ★ol7_addons が存在する
ol7_addons を含むリポジトリファイルが存在すれば、当手順は不要です。SKIPしてください。
存在しない場合は以下の手順で追加してください。
[opc@rac-instance01 yum.repos.d]$ sudo wget http://yum.oracle.com/public-yum-ol7.repo
[opc@rac-instance01 yum.repos.d]$ vi public-yum-ol7.repo
-------------------------
[ol7_addons]
name=Oracle Linux $releasever Add ons ($basearch)
baseurl=http://yum.oracle.com/repo/OracleLinux/OL7/addons/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1 <--- ★ここを0から1に変更する
-------------------------
5-6. docker-engine インストール
docker-engine をインストールします。
[opc@rac-instance01 ~]$ sudo yum install docker-engine
Docker を起動します。
[opc@rac-instance01 ~]$ sudo systemctl start docker
[opc@rac-instance01 ~]$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since 月 2021-01-04 19:45:07 JST; 3s ago
5-7. カーネルパラメータ設定
公式 Github の手順通りにカーネルパラメータを追加します。
[opc@rac-instance01 ~]$ sudo vi /etc/sysctl.conf
---- ★以下すべてを追記
fs.file-max = 6815744
net.core.rmem_max = 4194304
net.core.rmem_default = 262144
net.core.wmem_max = 1048576
net.core.wmem_default = 262144
net.core.rmem_default = 262144
----
[opc@rac-instance01 ~]$ sysctl -a
[opc@rac-instance01 ~]$ sudo sysctl -p
5-8. Docker 起動設定
docker.service の起動設定をします。
/usr/lib/systemd/system/docker.service の ExecStart を以下の内容に置き換えます。
[opc@rac-instance01 ~]$ sudo vi /usr/lib/systemd/system/docker.service
---
ExecStart=/usr/bin/dockerd --cpu-rt-runtime=950000 --cpu-rt-period=1000000 --exec-opt=native.cgroupdriver=systemd
----
続いて、cgroup の設定を行います。
3つめは 95000 x node数 以上の値を入れます。今回は 4Node なので 95000 X 4 で
380000 ですが、余裕をもって 400000 とします。これをやっておかないと、後半のコンテナ起動でエラーが出て失敗しますので忘れずに設定しておきます。また、Dockerホストのサーバを再起動するとこの設定は消えてしまうので、ホストのサーバを起動するたびに設定されるようにしておくのがオススメです。
[root@rac-instance01 opc]# echo 950000 > /sys/fs/cgroup/cpu/cpu.rt_runtime_us
[root@rac-instance01 opc]# echo 1000000 > /sys/fs/cgroup/cpu/cpu.rt_period_us
[root@rac-instance01 opc]# echo 400000 > /sys/fs/cgroup/cpu,cpuacct/system.slice/cpu.rt_runtime_us
ここまで設定ができましたら、Docker を再起動します。
[opc@rac-instance01 ~]$ sudo systemctl daemon-reload
[opc@rac-instance01 ~]$ sudo systemctl restart docker
[opc@rac-instance01 ~]$ sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[opc@rac-instance01 ~]$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since 水 2021-01-06 21:35:11 JST; 9s ago
Docs: https://docs.docker.com
Main PID: 11610 (dockerd)
CGroup: /system.slice/docker.service
mq11610 /usr/bin/dockerd --cpu-rt-runtime=950000 --cpu-rt-period=1000000 --exec-opt=native.cgroupdriver=systemd
6. Docker 構築
Docker の構築をしていきます。
6-1. インストールイメージの構築
Oracle RAC Database の Docker インストールイメージを構築します。
[opc@rac-instance01 ~]$ cd ~/docker-images/OracleDatabase/RAC/OracleRealApplicationClusters/dockerfiles
[opc@rac-instance01 dockerfiles]$ sudo ./buildDockerImage.sh -v 19.3.0
Checking if required packages are present and valid...
LINUX.X64_193000_grid_home.zip: 完了
(中略)
Oracle Database Docker Image for Real Application Clusters (RAC) version 19.3.0 is ready to be extended:
--> oracle/database-rac:19.3.0
Build completed in 988 seconds.
途中、こんなエラーがでる場合があります(私は100%遭遇します...)が、無視して大丈夫です。
(参考:https://github.com/oracle/docker-images/issues/1416)
/opt/scripts/install/installGridBinaries.sh: line 57: : command not found
6-2. Docker ネットワーク設定
Docker コンテナ間のネットワークを設定します。
rac_pub1_nw がパブリックLAN、rac_priv1_nw がプライベートLANになります。
[opc@rac-instance01 dockerfiles]$ sudo docker network create --driver=bridge --subnet=172.16.1.0/24 rac_pub1_nw
b6d7984df77c6e42705bd242ee2e790882b2d9f5ff2ef20cf369b7105238adf4
[opc@rac-instance01 dockerfiles]$ sudo docker network create --driver=bridge --subnet=192.168.17.0/24 rac_priv1_nw
a47b39a3b43bebcc1d8a7676ac6786a581919f0dd20cab79c0ffbcb7005153ea
6-3. 共有ホストファイルの作成
全てのコンテナは、ホスト名の名前解決のために共有ホストファイルを使用します。共有ホストファイルはすべてのコンテナで利用可能である必要があるため、Docker ホスト上にファイルを作成します。
なお、現時点では空のファイルで大丈夫です。ノード作成時に自動的に hosts の中身が書き込まれます。
[opc@rac-instance01 dockerfiles]$ sudo mkdir /opt/containers
[opc@rac-instance01 dockerfiles]$ sudo touch /opt/containers/rac_host_file
[opc@rac-instance01 dockerfiles]$ ls -l /opt/containers/rac_host_file
-rw-r--r--. 1 root root 0 1月 6 22:12 /opt/containers/rac_host_file
6-4. パスワードファイルの作成
ノードの作成またはノードの追加中に、grid / oracle および データベースパスワードが必要になるため、事前にパスワードを暗号化したファイルを作成します。それぞれ個別にパスワードを設定可能ですが、今回は全て共通のパスワードで設定します。
[opc@rac-instance01 dockerfiles]$ sudo su -
[root@rac-instance01 ~]# mkdir /opt/.secrets/
[root@rac-instance01 ~]# openssl rand -hex 64 -out /opt/.secrets/pwd.key
echo で パスワードとする文字列をファイルにリダイレクトします。
今回は "oracle" としています。
[root@rac-instance01 ~]# echo oracle > /opt/.secrets/common_os_pwdfile
[root@rac-instance01 ~]# openssl enc -aes-256-cbc -salt -in /opt/.secrets/common_os_pwdfile -out /opt/.secrets/common_os_pwdfile.enc -pass file:/opt/.secrets/pwd.key
暗号化したファイルが作成できたら、平文のファイルは削除します。
[root@rac-instance01 ~]# rm -f /opt/.secrets/common_os_pwdfile
6-5. ASM 領域とする共有 DISK の作成
ASM 領域とするための共有DISK領域をブロックデバイスで作成します。
(RAC Storage Container という NAS 用のコンテナを立ててそこを共有 DISK とする方式もあるのですが、今回はブロックデバイス方式でいきます)
OCI Compute 作成時に拡張したブートボリュームは既に既存のファイルシステムに割り当てているので、別途ブート・ボリュームを拡張した上で新規パーティションを作成し、ASM 領域として使用します。なお、この作業は必ず 4.3 でブート・ボリュームを拡張した後で行ってください。これは、oci-growfs での拡張が、最終パーティション番号のパーティションにだけ有効であるためです。
(デフォルトでは / がマウントしている /dev/sda3 のパーティションが最後なので、oci-growfsで / が容易に拡張できる)
では、まず OCI Console でブロック・デバイスをオンライン拡張します。
OCI Console の左上のハンバーガーメニューをクリックし、[コンピュート]-[ブート・ボリューム]を選択します。
[ボリューム・サイズ(GB)] の入力欄に、希望のASMサイズ分プラスした値を入力します。今回は100GB分をASMとするため、元々の 200GB から 100GB 足して、300GB とします。
入力したら、[変更の保存] をクリックします。
するとこんなのが出るので、[再スキャン・コマンド] を控えておきます。
アイコンがオレンジから、グリーンの[使用可能]に戻ったら、OCI Console での作業は完了です。
現在のブロック・デバイスの状態を確認します。
特に変わっていません。
[opc@rac-instance01 dockerfiles]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk ★200GBのまま
tqsda2 8:2 0 8G 0 part [SWAP]
tqsda3 8:3 0 191.8G 0 part /
mqsda1 8:1 0 200M 0 part /boot/efi
先程 OCI Console で控えた再スキャン・コマンドを実行し、ブロックデバイスの拡張を OS に認識させます。
[opc@rac-instance01 dockerfiles]$ sudo dd iflag=direct if=/dev/oracleoci/oraclevda of=/dev/null count=1
echo "1" | sudo tee /sys/class/block/`readlink /dev/oracleoci/oraclevda | cut -d'/' -f 2`/device/rescan1+0 レコード入力
1+0 レコード出力
512 バイト (512 B) コピーされました、 0.000896604 秒、 571 kB/秒
[opc@rac-instance01 dockerfiles]$ echo "1" | sudo tee /sys/class/block/`readlink /dev/oracleoci/oraclevda | cut -d'/' -f 2`/device/rescan
1
改めて、ブロック・デバイスの状態を確認します。
300GBに拡張されていることが確認できます。
[opc@rac-instance01 dockerfiles]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 300G 0 disk ★300GBになっている
tqsda2 8:2 0 8G 0 part [SWAP]
tqsda3 8:3 0 191.8G 0 part /
mqsda1 8:1 0 200M 0 part /boot/efi
拡張したブロックデバイスに、パーティションを追加します。
parted 実行直後にエラーや警告が出ますが、Fixしておきます。
[opc@rac-instance01 ~]$ sudo -s
[root@rac-instance01 opc]# parted /dev/sda
(parted) print
エラー: あるべき GPT テーブルのバックアップがディスクの最後にありません。他の OS がディスクはもっと小さいものだと思っているのかもしれません。バックアップを最後に持ってきて(古いバックアップを削除して)修復しますか?
修正/Fix/無視(I)/Ignore/取消(C)/Cancel? Fix
警告: /dev/sda で利用可能な領域の一部が利用されていません。GPT を修正して全ての領域を利用可能にするか(209715200 ブロック増えます)、このままで続行することができますが、どうしますか?
修正/Fix/無視(I)/Ignore? Fix
番号 開始 終了 サイズ ファイルシステム 名前 フラグ
1 1049kB 211MB 210MB fat16 EFI System Partition boot
2 211MB 8801MB 8590MB linux-swap(v1)
3 8801MB 215GB 206GB xfs
最後のパーティション番号の終了のサイズから 100% を割り当てます。
今回は、番号3の終了の 215GB を始点とします。
(parted) mkpart gpt 215GB 100%
確認すると、パーティション番号4 ができています。
(parted) print
番号 開始 終了 サイズ ファイルシステム 名前 フラグ
1 1049kB 211MB 210MB fat16 EFI System Partition boot
2 211MB 8801MB 8590MB linux-swap(v1)
3 8801MB 215GB 206GB xfs
4 215GB 322GB 107GB gpt
(parted) q
作成したパーティションは /dev/sda4 です。
[root@rac-instance01 opc]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 300G 0 disk
-sda4 8:4 0 100G 0 part ★作成したパーティション
-sda2 8:2 0 8G 0 part [SWAP]
-sda3 8:3 0 191.8G 0 part /
-sda1 8:1 0 200M 0 part /boot/efi
追加したパーティションを初期化します。
[root@rac-instance01 opc]# dd if=/dev/zero of=/dev/sda4 bs=8k count=100000
100000+0 レコード入力
100000+0 レコード出力
819200000 バイト (819 MB) コピーされました、 4.09183 秒、 200 MB/秒
7. Oracle Database RAC Node1 の作成
7-1. Docker コンテナの作成
RACノード1つ目のコンテナを作成します。オプションで色々変更可能です。Github の手順の最後らへんに各種オプションの説明があります。
[opc@rac-instance01 ~]$ sudo docker create -t -i \
--hostname racnode1 \
--volume /boot:/boot:ro \
--volume /dev/shm \
--tmpfs /dev/shm:rw,exec,size=4G \
--volume /opt/containers/rac_host_file:/etc/hosts \
--volume /opt/.secrets:/run/secrets \
--device=/dev/sda4:/dev/asm_disk1 \
--privileged=false \
--cap-add=SYS_NICE \
--cap-add=SYS_RESOURCE \
--cap-add=NET_ADMIN \
-e NODE_VIP=172.16.1.160 \
-e VIP_HOSTNAME=racnode1-vip \
-e PRIV_IP=192.168.17.150 \
-e PRIV_HOSTNAME=racnode1-priv \
-e PUBLIC_IP=172.16.1.150 \
-e PUBLIC_HOSTNAME=racnode1 \
-e SCAN_NAME=racnode-scan \
-e SCAN_IP=172.16.1.70 \
-e OP_TYPE=INSTALL \
-e DOMAIN=example.com \
-e ASM_DEVICE_LIST=/dev/asm_disk1 \
-e ORACLE_SID=ORCL \
-e ASM_DISCOVERY_DIR=/dev \
-e CMAN_HOSTNAME=racnode-cman1 \
-e CMAN_IP=172.16.1.15 \
-e COMMON_OS_PWD_FILE=common_os_pwdfile.enc \
-e PWD_KEY=pwd.key \
--restart=always --tmpfs=/run -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--cpu-rt-runtime=95000 --ulimit rtprio=99 \
--name racnode1 \
oracle/database-rac:19.3.0
7-2. コンテナにネットワークを割り当てる
作成したコンテナにネットワークを割り当てます。
[opc@rac-instance01 ~]$ sudo docker network disconnect bridge racnode1
[opc@rac-instance01 ~]$ sudo docker network connect rac_pub1_nw --ip 172.16.1.150 racnode1
[opc@rac-instance01 ~]$ sudo docker network connect rac_priv1_nw --ip 192.168.17.150 racnode1
7-3. RAC コンテナの起動 (RAC Node 1)
ここからが本番です。RAC 1ノード目のコンテナを起動します。
このコンテナ起動により、GI/DBのインストールやDB作成、RACの構成が行われます。
[opc@rac-instance01 ~]$ sudo docker start racnode1
racnode1
起動コマンド自体はすぐリターンが返ります。
以下のコマンドでログを確認し、エラーが起きないことを確認します。
完了まで早くても40分~1時間程度はかかります。
[opc@rac-instance01 ~]$ sudo docker logs -f racnode1
成功すれば、最後に以下のメッセージが表示されます。
####################################
ORACLE RAC DATABASE IS READY TO USE!
####################################
もし途中で何らかのエラーが発生して処理が止まってしまった場合は、以下のコマンドでコンテナにログインし、/tmp/orod.log や $GRID_BASE/diag/crs 等に出力されているログを確認してください。
[opc@rac-instance01 ~]$ sudo docker exec -i -t racnode1 /bin/bash
起動が成功したのでコンテナにログインして確認してみます。
[opc@rac-instance01 ~]$ sudo docker exec -i -t racnode1 /bin/bash
[grid@racnode1 ~]$ sudo su - oracle
[oracle@racnode1 ~]$ /u01/app/19.3.0/grid/bin/crsctl stat res -t
--------------------------------------------------------------------------------
Name Target State Server State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
ONLINE ONLINE racnode1 STABLE
ora.chad
ONLINE ONLINE racnode1 STABLE
ora.net1.network
ONLINE ONLINE racnode1 STABLE
ora.ons
ONLINE ONLINE racnode1 STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
1 ONLINE ONLINE racnode1 STABLE
2 OFFLINE OFFLINE STABLE
3 OFFLINE OFFLINE STABLE
ora.DATA.dg(ora.asmgroup)
1 ONLINE ONLINE racnode1 STABLE
2 OFFLINE OFFLINE STABLE
3 OFFLINE OFFLINE STABLE
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE racnode1 STABLE
ora.asm(ora.asmgroup)
1 ONLINE ONLINE racnode1 Started,STABLE
2 OFFLINE OFFLINE STABLE
3 OFFLINE OFFLINE STABLE
ora.asmnet1.asmnetwork(ora.asmgroup)
1 ONLINE ONLINE racnode1 STABLE
2 OFFLINE OFFLINE STABLE
3 OFFLINE OFFLINE STABLE
ora.cvu
1 ONLINE ONLINE racnode1 STABLE
ora.orcl.db
1 ONLINE ONLINE racnode1 Open,HOME=/u01/app/o
racle/product/19.3.0
/dbhome_1,STABLE
ora.qosmserver
1 ONLINE ONLINE racnode1 STABLE
ora.racnode1.vip
1 ONLINE ONLINE racnode1 STABLE
ora.scan1.vip
1 ONLINE ONLINE racnode1 STABLE
--------------------------------------------------------------------------------
[oracle@racnode1 ~]$ exit
logout
[grid@racnode1 ~]$ exit
exit
[opc@rac-instance01 ~]$
問題無さそうなので、引き続き2ノード目以降を作成していきます。
8. Oracle Database RAC Node2 の追加
8-1. Docker コンテナの作成
先程作成した RAC環境に、2ノード目を追加します。
基本的に手順は同じですが、オプションで指定する内容が少しだけ違います。(ホスト名、ノード名、IPアドレス、CLS既存ノードの指定、ノード追加オプションなど)
[opc@rac-instance01 ~]$ sudo docker create -t -i \
--hostname racnode2 \
--volume /dev/shm \
--tmpfs /dev/shm:rw,exec,size=4G \
--volume /boot:/boot:ro \
--dns-search=example.com \
--volume /opt/containers/rac_host_file:/etc/hosts \
--volume /opt/.secrets:/run/secrets \
--device=/dev/sda4:/dev/asm_disk1 \
--privileged=false \
--cap-add=SYS_NICE \
--cap-add=SYS_RESOURCE \
--cap-add=NET_ADMIN \
-e EXISTING_CLS_NODES=racnode1 \ ★既存ノードを指定する
-e NODE_VIP=172.16.1.161 \
-e VIP_HOSTNAME=racnode2-vip \
-e PRIV_IP=192.168.17.151 \
-e PRIV_HOSTNAME=racnode2-priv \
-e PUBLIC_IP=172.16.1.151 \
-e PUBLIC_HOSTNAME=racnode2 \
-e DOMAIN=example.com \
-e SCAN_NAME=racnode-scan \
-e SCAN_IP=172.16.1.70 \
-e ASM_DISCOVERY_DIR=/dev \
-e ASM_DEVICE_LIST=/dev/asm_disk1\
-e ORACLE_SID=ORCL \
-e OP_TYPE=ADDNODE \ ★ノード追加オプション
-e COMMON_OS_PWD_FILE=common_os_pwdfile.enc \
-e PWD_KEY=pwd.key \
--tmpfs=/run -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--cpu-rt-runtime=95000 --ulimit rtprio=99 \
--restart=always \
--name racnode2 \
oracle/database-rac:19.3.0
8-2. コンテナにネットワークを割り当てる
作成したコンテナにネットワークを割り当てます。
[opc@rac-instance01 ~]$ sudo docker network disconnect bridge racnode2
[opc@rac-instance01 ~]$ sudo docker network connect rac_pub1_nw --ip 172.16.1.151 racnode2
[opc@rac-instance01 ~]$ sudo docker network connect rac_priv1_nw --ip 192.168.17.151 racnode2
8-3. RAC コンテナの起動 (RAC Node 2)
RAC 2ノード目のコンテナを起動します。やることは 1ノード目と同じです。
[opc@rac-instance01 ~]$ sudo docker start racnode2
racnode2
以下のコマンドでログを確認し、エラーが起きないことを確認します。
[opc@rac-instance01 ~]$ sudo docker logs -f racnode2
成功すれば、最後に以下のメッセージが表示されます。
2ノード目以降は、1ノード目のときよりは時間はかかりません。今回の環境では10分程度で終わりました。
####################################
ORACLE RAC DATABASE IS READY TO USE!
####################################
起動が成功したので、ログインして確認します。
[opc@rac-instance01 ~]$ sudo docker exec -i -t racnode2 /bin/bash
[grid@racnode2 ~]$ sudo su - oracle
[oracle@racnode2 ~]$ /u01/app/19.3.0/grid/bin/crsctl stat res -t
--------------------------------------------------------------------------------
Name Target State Server State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
ONLINE ONLINE racnode1 STABLE
ONLINE ONLINE racnode2 STABLE
ora.chad
ONLINE ONLINE racnode1 STABLE
ONLINE ONLINE racnode2 STABLE
ora.net1.network
ONLINE ONLINE racnode1 STABLE
ONLINE ONLINE racnode2 STABLE
ora.ons
ONLINE ONLINE racnode1 STABLE
ONLINE ONLINE racnode2 STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
1 ONLINE ONLINE racnode1 STABLE
2 ONLINE ONLINE racnode2 STABLE
3 OFFLINE OFFLINE STABLE
ora.DATA.dg(ora.asmgroup)
1 ONLINE ONLINE racnode1 STABLE
2 ONLINE ONLINE racnode2 STABLE
3 OFFLINE OFFLINE STABLE
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE racnode1 STABLE
ora.asm(ora.asmgroup)
1 ONLINE ONLINE racnode1 Started,STABLE
2 ONLINE ONLINE racnode2 Started,STABLE
3 OFFLINE OFFLINE STABLE
ora.asmnet1.asmnetwork(ora.asmgroup)
1 ONLINE ONLINE racnode1 STABLE
2 ONLINE ONLINE racnode2 STABLE
3 OFFLINE OFFLINE STABLE
ora.cvu
1 ONLINE ONLINE racnode1 STABLE
ora.orcl.db
1 ONLINE ONLINE racnode1 Open,HOME=/u01/app/o
racle/product/19.3.0
/dbhome_1,STABLE
2 ONLINE ONLINE racnode2 Open,HOME=/u01/app/o
racle/product/19.3.0
/dbhome_1,STABLE
ora.qosmserver
1 ONLINE ONLINE racnode1 STABLE
ora.racnode1.vip
1 ONLINE ONLINE racnode1 STABLE
ora.racnode2.vip
1 ONLINE ONLINE racnode2 STABLE
ora.scan1.vip
1 ONLINE ONLINE racnode1 STABLE
--------------------------------------------------------------------------------
問題無く2ノード目が追加されていました。
引き続き3ノード目を追加します。
9. Oracle Database RAC Node3 の追加
9-1. Docker コンテナの作成
RAC環境に、3ノード目を追加します。2ノード目と手順、変更点は全く同じです。
[opc@rac-instance01 ~]$ sudo docker create -t -i \
--hostname racnode3 \
--volume /dev/shm \
--tmpfs /dev/shm:rw,exec,size=4G \
--volume /boot:/boot:ro \
--dns-search=example.com \
--volume /opt/containers/rac_host_file:/etc/hosts \
--volume /opt/.secrets:/run/secrets \
--device=/dev/sda4:/dev/asm_disk1 \
--privileged=false \
--cap-add=SYS_NICE \
--cap-add=SYS_RESOURCE \
--cap-add=NET_ADMIN \
-e EXISTING_CLS_NODES=racnode1,racnode2 \ ★既存ノードを指定する
-e NODE_VIP=172.16.1.162 \
-e VIP_HOSTNAME=racnode3-vip \
-e PRIV_IP=192.168.17.152 \
-e PRIV_HOSTNAME=racnode3-priv \
-e PUBLIC_IP=172.16.1.152 \
-e PUBLIC_HOSTNAME=racnode3 \
-e DOMAIN=example.com \
-e SCAN_NAME=racnode-scan \
-e SCAN_IP=172.16.1.70 \
-e ASM_DISCOVERY_DIR=/dev \
-e ASM_DEVICE_LIST=/dev/asm_disk1\
-e ORACLE_SID=ORCL \
-e OP_TYPE=ADDNODE \ ★ノード追加オプション
-e COMMON_OS_PWD_FILE=common_os_pwdfile.enc \
-e PWD_KEY=pwd.key \
--tmpfs=/run -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--cpu-rt-runtime=95000 --ulimit rtprio=99 \
--restart=always \
--name racnode3 \
oracle/database-rac:19.3.0
9-2. コンテナにネットワークを割り当てる
作成したコンテナにネットワークを割り当てます。
[opc@rac-instance01 ~]$ sudo docker network disconnect bridge racnode3
[opc@rac-instance01 ~]$ sudo docker network connect rac_pub1_nw --ip 172.16.1.152 racnode3
[opc@rac-instance01 ~]$ sudo docker network connect rac_priv1_nw --ip 192.168.17.152 racnode3
9-3. RAC コンテナの起動 (RAC Node 3)
RAC 3ノード目のコンテナを起動します。
やることは 2ノード目と同じです。
[opc@rac-instance01 ~]$ sudo docker start racnode3
racnode3
以下のコマンドでログを確認し、エラーが起きないことを確認します。
[opc@rac-instance01 ~]$ sudo docker logs -f racnode3
成功すれば、最後に以下のメッセージが表示されます。
2ノード目以降は、1ノード目のときよりは時間はかかりません。今回の環境では10分程度で終わりました。
####################################
ORACLE RAC DATABASE IS READY TO USE!
####################################
起動が成功したので、ログインして確認します。
[opc@rac-instance01 ~]$ sudo docker exec -i -t racnode3 /bin/bash
[grid@racnode3 ~]$ sudo su - oracle
[oracle@racnode3 ~]$ /u01/app/19.3.0/grid/bin/crsctl stat res -t
--------------------------------------------------------------------------------
Name Target State Server State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
ONLINE ONLINE racnode1 STABLE
ONLINE ONLINE racnode2 STABLE
ONLINE ONLINE racnode3 STABLE
ora.chad
ONLINE ONLINE racnode1 STABLE
ONLINE ONLINE racnode2 STABLE
ONLINE ONLINE racnode3 STABLE
ora.net1.network
ONLINE ONLINE racnode1 STABLE
ONLINE ONLINE racnode2 STABLE
ONLINE ONLINE racnode3 STABLE
ora.ons
ONLINE ONLINE racnode1 STABLE
ONLINE ONLINE racnode2 STABLE
ONLINE ONLINE racnode3 STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
1 ONLINE ONLINE racnode1 STABLE
2 ONLINE ONLINE racnode2 STABLE
3 ONLINE ONLINE racnode3 STABLE
ora.DATA.dg(ora.asmgroup)
1 ONLINE ONLINE racnode1 STABLE
2 ONLINE ONLINE racnode2 STABLE
3 ONLINE ONLINE racnode3 STABLE
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE racnode1 STABLE
ora.asm(ora.asmgroup)
1 ONLINE ONLINE racnode1 Started,STABLE
2 ONLINE ONLINE racnode2 Started,STABLE
3 ONLINE ONLINE racnode3 Started,STABLE
ora.asmnet1.asmnetwork(ora.asmgroup)
1 ONLINE ONLINE racnode1 STABLE
2 ONLINE ONLINE racnode2 STABLE
3 ONLINE ONLINE racnode3 STABLE
ora.cvu
1 ONLINE ONLINE racnode1 STABLE
ora.orcl.db
1 ONLINE ONLINE racnode1 Open,HOME=/u01/app/o
racle/product/19.3.0
/dbhome_1,STABLE
2 ONLINE ONLINE racnode2 Open,HOME=/u01/app/o
racle/product/19.3.0
/dbhome_1,STABLE
3 ONLINE ONLINE racnode3 Open,HOME=/u01/app/o
racle/product/19.3.0
/dbhome_1,STABLE
ora.qosmserver
1 ONLINE ONLINE racnode1 STABLE
ora.racnode1.vip
1 ONLINE ONLINE racnode1 STABLE
ora.racnode2.vip
1 ONLINE ONLINE racnode2 STABLE
ora.racnode3.vip
1 ONLINE ONLINE racnode3 STABLE
ora.scan1.vip
1 ONLINE ONLINE racnode1 STABLE
--------------------------------------------------------------------------------
問題無く3ノード目が追加されました。
引き続き、最後の4ノード目を追加します。
10. Oracle Database RAC Node4 の追加
10-1. Docker コンテナの作成
RAC環境に、4ノード目を追加します。2,3ノード目と手順、変更点は全く同じです。
[opc@rac-instance01 ~]$ sudo docker create -t -i \
--hostname racnode4 \
--volume /dev/shm \
--tmpfs /dev/shm:rw,exec,size=4G \
--volume /boot:/boot:ro \
--dns-search=example.com \
--volume /opt/containers/rac_host_file:/etc/hosts \
--volume /opt/.secrets:/run/secrets \
--device=/dev/sda4:/dev/asm_disk1 \
--privileged=false \
--cap-add=SYS_NICE \
--cap-add=SYS_RESOURCE \
--cap-add=NET_ADMIN \
-e EXISTING_CLS_NODES=racnode1,racnode2,racnode3 \
-e NODE_VIP=172.16.1.163 \
-e VIP_HOSTNAME=racnode4-vip \
-e PRIV_IP=192.168.17.153 \
-e PRIV_HOSTNAME=racnode4-priv \
-e PUBLIC_IP=172.16.1.153 \
-e PUBLIC_HOSTNAME=racnode4 \
-e DOMAIN=example.com \
-e SCAN_NAME=racnode-scan \
-e SCAN_IP=172.16.1.70 \
-e ASM_DISCOVERY_DIR=/dev \
-e ASM_DEVICE_LIST=/dev/asm_disk1\
-e ORACLE_SID=ORCL \
-e OP_TYPE=ADDNODE \
-e COMMON_OS_PWD_FILE=common_os_pwdfile.enc \
-e PWD_KEY=pwd.key \
--tmpfs=/run -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--cpu-rt-runtime=95000 --ulimit rtprio=99 \
--restart=always \
--name racnode4 \
oracle/database-rac:19.3.0
10-2. コンテナにネットワークを割り当てる
作成したコンテナにネットワークを割り当てます。
[opc@rac-instance01 ~]$ sudo docker network disconnect bridge racnode4
[opc@rac-instance01 ~]$ sudo docker network connect rac_pub1_nw --ip 172.16.1.153 racnode4
[opc@rac-instance01 ~]$ sudo docker network connect rac_priv1_nw --ip 192.168.17.153 racnode4
10-3. RAC コンテナの起動 (RAC Node 4)
RAC 4ノード目のコンテナを起動します。
やることは 2,3ノード目と同じです。
[opc@rac-instance01 ~]$ sudo docker start racnode4
racnode4
以下のコマンドでログを確認し、エラーが起きないことを確認します。
[opc@rac-instance01 ~]$ sudo docker logs -f racnode4
成功すれば、最後に以下のメッセージが表示されます。
####################################
ORACLE RAC DATABASE IS READY TO USE!
####################################
起動が成功したので、ログインして確認します。
[opc@rac-instance01 ~]$ sudo docker exec -i -t racnode4 /bin/bash
[grid@racnode4 ~]$ sudo su - oracle
[oracle@racnode4 ~]$ /u01/app/19.3.0/grid/bin/crsctl stat res -t
--------------------------------------------------------------------------------
Name Target State Server State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
ONLINE ONLINE racnode1 STABLE
ONLINE ONLINE racnode2 STABLE
ONLINE ONLINE racnode3 STABLE
ONLINE ONLINE racnode4 STABLE
ora.chad
ONLINE ONLINE racnode1 STABLE
ONLINE ONLINE racnode2 STABLE
ONLINE ONLINE racnode3 STABLE
ONLINE ONLINE racnode4 STABLE
ora.net1.network
ONLINE ONLINE racnode1 STABLE
ONLINE ONLINE racnode2 STABLE
ONLINE ONLINE racnode3 STABLE
ONLINE ONLINE racnode4 STABLE
ora.ons
ONLINE ONLINE racnode1 STABLE
ONLINE ONLINE racnode2 STABLE
ONLINE ONLINE racnode3 STABLE
ONLINE ONLINE racnode4 STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
1 ONLINE ONLINE racnode1 STABLE
2 ONLINE ONLINE racnode2 STABLE
3 ONLINE ONLINE racnode3 STABLE
ora.DATA.dg(ora.asmgroup)
1 ONLINE ONLINE racnode1 STABLE
2 ONLINE ONLINE racnode2 STABLE
3 ONLINE ONLINE racnode3 STABLE
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE racnode1 STABLE
ora.asm(ora.asmgroup)
1 ONLINE ONLINE racnode1 Started,STABLE
2 ONLINE ONLINE racnode2 Started,STABLE
3 ONLINE ONLINE racnode3 Started,STABLE
ora.asmnet1.asmnetwork(ora.asmgroup)
1 ONLINE ONLINE racnode1 STABLE
2 ONLINE ONLINE racnode2 STABLE
3 ONLINE ONLINE racnode3 STABLE
ora.cvu
1 ONLINE ONLINE racnode1 STABLE
ora.orcl.db
1 ONLINE ONLINE racnode1 Open,HOME=/u01/app/o
racle/product/19.3.0
/dbhome_1,STABLE
2 ONLINE ONLINE racnode2 Open,HOME=/u01/app/o
racle/product/19.3.0
/dbhome_1,STABLE
3 ONLINE ONLINE racnode3 Open,HOME=/u01/app/o
racle/product/19.3.0
/dbhome_1,STABLE
4 ONLINE ONLINE racnode4 Open,HOME=/u01/app/o
racle/product/19.3.0
/dbhome_1,STABLE
ora.qosmserver
1 ONLINE ONLINE racnode1 STABLE
ora.racnode1.vip
1 ONLINE ONLINE racnode1 STABLE
ora.racnode2.vip
1 ONLINE ONLINE racnode2 STABLE
ora.racnode3.vip
1 ONLINE ONLINE racnode3 STABLE
ora.racnode4.vip
1 ONLINE ONLINE racnode4 STABLE
ora.scan1.vip
1 ONLINE ONLINE racnode1 STABLE
--------------------------------------------------------------------------------
問題無く4ノード目が追加されました。
11. Database ログイン確認
DBにログインできるか確認してみます。
[opc@rac-instance01 ~]$ sudo docker exec -i -t racnode1 /bin/bash
[grid@racnode1 ~]$ export ORACLE_HOME=`echo ${DB_HOME}`
[grid@racnode1 ~]$ export ORACLE_SID=ORCL1
[grid@racnode1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 6 16:12:43 2021
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB READ WRITE NO
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
ログインできました。PDBも作成されています。
以上で完了です。
12. あとがき
これで OCI Compute 上に Docker で Oracle Database 19c の 4 Node RAC 環境が構築ができました。
この環境に Oracle Data Guard の Physical Standby コンテナを作成できたりもするのですが、それはまた別の機会に書きたいと思います。
なお、今回 OCI Compute 上で環境を構築しましたが、クラウド環境でなくて Virtual Box でも構築可能ですし実績もあります。新しめの Virtual Box であれば、Virtual Box で構築したイメージをそのまま OCI に移行するなんてこともできると思います。
最後に、冒頭でも記載しましたが、Docker に構築した Oracle Database 環境は検証・開発目的のみで利用可能です。決して本番環境では使用しないようにお願いいたします。 冒頭でも記載しましたが、21c(21.3)以降では使用可能となりました。