
本記事の目的
本ブログの人気記事の一つに「[Oracle Database] 公式Docker Imageを利用してOracle Database 19c環境を構築してみた」があるのですが、年末年始休暇に入る直前にOracle Real Application Clusters(RAC)環境用のDocker Imageが公開されているのを知ったので、これは冬休みの課題として取り組むしかない!というわけで実際に構築手順を確認してみました。
参考手順
構築にあたり参考にしたのは、以下のホワイトペーパーおよび、そこからリンクされている公式Docker ImageサイトのREADMEです。
・Best Practices for Deploying Oracle RAC on Docker
・Oracle RAC Database on Docker
基本的には後者のREADME(本記事ではこれ以降「公式ガイド」と呼ぶ)にある手順に沿って構築可能ですが、前提としてホワイトペーパーも眺めておくとよいと思います。
この記事では実際に構築した際の手順の概要を紹介します。
ただし、試行錯誤しながら構築した際のメモを整理したものなので、手順の流れを把握する程度に利用するのをお奨めします。この手順で無事に構築できた or うまく出来なかったなど、こっそりフィードバック頂けると嬉しいです。
※必要に応じて追記更新予定
注意事項
なお、お約束事ですが、本記事に掲載している内容を実践したことにより、如何なる損害が発生しても責任は負いかねます。ご了承の上で参照ください。
また、前述の公式ガイドにも記載の通り、本番環境での利用はサポートされていないので注意してください。
IMPORTANT: Note that the current version of Oracle RAC on Docker is only supported for test and development environments, but not for production environments.
検証環境
Oracle Database 19c on Oracle Linux7.9
・構築方針
前述のホワイトペーパーおよびDocker Imageにあるガイドでは複数パターンでの構築手順が記載されているのですが(それが混乱を誘いがち…)、今回は以下のような構成で作成することにしました。
ホストOSは1台のみ利用し、この中にracnode1,racnode2という2つのコンテナを作成。
共有ディスク領域にはブロックデバイスを利用。
(他にNFSを利用する方法や、RAC Storage Containerを利用する方法も記載あり)
・検証環境およびスペック
以下の環境で構築しました。
- Oracle Cloud Infrastructure Compute
- シェイプ:VM.Standard.E3.Flex 2 CPU, 32GB
- ブートボリューム:46.6 GB(デフォルト)
- ブロックボリューム:50GB(RACデータ領域用)
- Oracle Linux 7.9
- Oracle Database 19c (19.3)
- Oracle Database 19c Grid Infrastructure(19.3)
- Docker
今回はOracle Cloudの仮想マシンを利用しましたが、dockerを利用可能であれば環境はローカルPCでも他社クラウドでも何でも良いはず。
ちなみに、上記のスペックだとOracle RACのインストール要件を満たしていませんが、構築だけであれば大丈夫でした。
Section 1 : Prerequsites for RAC on Docker
ここからは公式ガイドのタイトルにあわせて、ポイントとなる手順を記載していく。公式ガイドもあわせて参照のこと。
本セクションはホストOS上の環境設定。ここで漏れがあると、コンテナの作成や起動時にエラーとなりがち(経験済み)。
dockerインストール
[root@vmrac ~]# yum install -y docker-engine [root@vmrac ~]# systemctl start docker [root@vmrac ~]# systemctl enable docker
ユーザopcをdockerグループへ追加
[root@vmrac ~]# usermod -aG docker opc
カーネルパラメータ変更
[root@vmrac ~]# 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 設定値確認と反映 [root@vmrac ~]# sysctl -a [root@vmrac ~]# sysctl -p
docker用ネットワーク作成
パブリック用とプライベート用をそれぞれ用意。サブネットは公式ガイドの値をそのまま利用。
[root@vmrac ~]# docker network create --driver=bridge --subnet=172.16.1.0/24 rac_pub1_nw [root@vmrac ~]# docker network create --driver=bridge --subnet=192.168.17.0/24 rac_priv1_nw [root@vmrac ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 68daca2e085c bridge bridge local c1ba84c821dd host host local afbc82426cdb none null local 5c1c5480bad6 rac_priv1_nw bridge local 97a8d8984474 rac_pub1_nw bridge local
dockerオプション変更
公式ガイドだと以下のような手順が記載されている。
update the OPTIONS value in /etc/sysconfig/docker to following:
OPTIONS=’–selinux-enabled –cpu-rt-runtime=950000′
が、自分の環境では指定のファイルが存在せず有効にならなかったので、以下の手順で反映。
[root@vmrac ~] vi /usr/lib/systemd/system/docker.service [root@vmrac ~] grep ExecStart /usr/lib/systemd/system/docker.service #ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --selinux-enabled --cpu-rt-runtime=950000 [root@vmrac ~] systemctl daemon-reload [root@vmrac ~] systemctl restart docker [root@vmrac ~] 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 Wed 2020-12-30 08:51:59 GMT; 5s ago Docs: https://docs.docker.com Main PID: 18032 (dockerd) Tasks: 10 Memory: 46.1M CGroup: /system.slice/docker.service └─18032 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --selinux-enabled --cpu-rt... /usr/lib/systemd/system/docker.service [root@vmrac ~]$ ps -ef | grep docker root 18032 1 0 08:51 ? 00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --selinux-enabled --cpu-rt-runtime=950000
⇒起動オプションに反映されていることを確認。
SELINUX設定変更
公式ガイドに従いPermissiveモードに変更。
[root@vmrac ~] vi /etc/selinux/config #SELINUX=enforcing ★変更前 SELINUX=permissive ★変更 [root@vmrac ~] shutdown -r now 再起動後に設定値確認。 [opc@vmrac ~]$ getenforce Permissive
docker-imagesのダウンロード
今回はopcユーザのホームディレクトリを利用。
[opc@vmrac ~]$ sudo yum install -y git [opc@vmrac ~]$ git clone https://github.com/oracle/docker-images.git
Oracle Databaseバイナリのダウンロード
docker-imagesにはOracle Databaseのバイナリは含まれていないので、OTNから以下のファイルを入手する。
Oracle Database 19c Grid Infrastructure (19.3) for Linux x86-64
Oracle Database 19c (19.3) for Linux x86-64
※利用にあたっては、ライセンス許諾ルールを確認のこと。
dockerf-imagesフォルダに配置
winscpなどでdocker-images配下の指定のフォルダに配置する。
[opc@vmrac 19.3.0]$ pwd /home/opc/docker-images/OracleDatabase/RAC/OracleRealApplicationClusters/dockerfiles/19.3.0 [opc@vmrac 19.3.0]$ ls AddNode.sh db_sw_install_19c.rsp gridsetup_19cv1.rsp runUserScripts.sh applyGridPatch.sh DelNode.sh grid_sw_install_19c.rsp sample_19c.ccf checkDBStatus.sh Dockerfile installDBBinaries.sh setCrontab.sh checkSpace.sh Dockerfile_orig installGridBinaries.sh setPassword.sh Checksum enableRAC.sh LINUX.X64_193000_db_home.zip setupDB.sh configGrid.sh fixupPreq.sh LINUX.X64_193000_grid_home.zip setupGridEnv.sh dbca_19c.rsp functions.sh MultiNodeInstall.py setupGrid.sh dbca_19cv1.rsp grid1.rsp MultiRACInstall.sh setupLinuxEnv.sh dbca1.rsp grid_addnode.rsp OracleHomeCleanup.sh setupSSH.expect dbca.rsp GridHomeCleanup.sh remoteListener.sh sshUserSetup.sh db_install_19cv1.rsp grid.rsp resetOSPassword.sh stopOracle.sh db_inst.rsp gridsetup_19c.rsp runOracle.sh tempfile [opc@vmrac 19.3.0]$ ls -l *.zip -rw-rw-r--. 1 opc opc 3059705302 Dec 30 07:23 LINUX.X64_193000_db_home.zip ★ここに配置 -rw-rw-r--. 1 opc opc 2889184573 Dec 30 07:23 LINUX.X64_193000_grid_home.zip ★ここに配置
Section 2: Building Oracle RAC Database Docker Install Images
Oracle Database 19c RAC用のdockerイメージを作成
[opc@vmrac ~]$ cd /home/opc/docker-images/OracleDatabase/RAC/OracleRealApplicationClusters/dockerfiles/ [opc@vmrac dockerfiles]$ ls 12.2.0.1 18.3.0 19.3.0 buildDockerImage.sh [opc@vmrac dockerfiles]$ time ./buildDockerImage.sh -v 19.3.0 ⇒10分程度で作成完了。
・docker イメージ作成確認
[opc@vmrac dockerfiles]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE oracle/database-rac 19.3.0 3a5cf5173651 About a minute ago 20.5GB oraclelinux 7-slim 0df4834a761b 7 days ago 132MB
Section 3: Creating the Docker GI and RAC Container
このセクションが特に分かりづらいが、シングルホストでのブロックデバイス利用の場合は以下に記載のコマンド群のみでよいはず。
Create the shared host file
[opc@vmrac]$ sudo mkdir /opt/containers [opc@vmrac]$ sudo touch /opt/containers/rac_host_file [opc@vmrac]$ ls -l /opt/containers/rac_host_file -rw-r--r--. 1 root root 0 Dec 30 08:22 /opt/containers/rac_host_file
Password management
[opc@vmrac dockerfiles]$ sudo vi /opt/.secrets/common_os_pwdfile ★任意のパスワード文字列を指定(これがsysユーザのパスワードとなる) [opc@vmrac dockerfiles]$ sudo mkdir /opt/.secrets/ [opc@vmrac dockerfiles]$ sudo openssl rand -hex 64 -out /opt/.secrets/pwd.key [opc@vmrac dockerfiles]$ sudo 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 [opc@vmrac dockerfiles]$ ls -l /opt/.secrets/pwd.key -rw-r--r--. 1 root root 129 Dec 30 08:23 /opt/.secrets/pwd.key
Deploying RAC on Docker With Block Devices
・デバイス初期化
公式ガイドだと/dev/xvdeとなってるが、自分の環境にあわせて対象デバイスを初期化。
[root@vmrac ~] dd if=/dev/zero of=/dev/sdb bs=8k count=100000
・ノード1用コンテナ作成
公式ガイドにあるコマンドを参考にノード1(racnode1)用のコンテナを作成。
以下は自分の環境に合わせて編集したもの。
「device」、「 ASM_DEVICE_LIST」の書き換えと、「CMAN_HOSTNAME」、「CMAN_IP」のエントリ削除。
[opc@vmrac ]$ 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 \ --dns-search=example.com \ --device=/dev/sdb:/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 ASM_DISCOVERY_DIR=/dev \ -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
・作成確認
[opc@vmrac]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c815ff1b3530 oracle/database-rac:19.3.0 "/usr/sbin/oracleinit" About a minute ago Created racnode1
Assign networks to RAC containers
[opc@vmrac]$ docker network disconnect bridge racnode1 [opc@vmrac]$ docker network connect rac_pub1_nw --ip 172.16.1.150 racnode1 [opc@vmrac]$ docker network connect rac_priv1_nw --ip 192.168.17.150 racnode1
Start the first container
[opc@vmrac]$ docker start racnode1
・起動ログ確認
[opc@vmrac dockerfiles]$ docker logs -f racnode1
コンテナ作成は20分程度かかる。最終的に以下のようなメッセージが表示されれば成功。
####################################
ORACLE RAC DATABASE IS READY TO USE!
####################################
※途中でエラーとなった場合、エラーメッセージを参考に原因調査。
Connect to the RAC container
[opc@vmrac ~]$ docker exec -it racnode1 bash [grid@racnode1 ~]$
⇒racnode1へログインできればOK
・プロセスチェック
[grid@racnode1 ~]$ ps -ef | grep pmon grid 12829 12699 0 13:04 pts/1 00:00:00 grep --color=auto pmon grid 17827 1 0 11:57 ? 00:00:00 asm_pmon_+ASM1 oracle 21805 1 0 12:18 ? 00:00:00 ora_pmon_ORCLCDB1 [grid@racnode1 ~]$ crsctl check crs CRS-4638: Oracle High Availability Services is online CRS-4537: Cluster Ready Services is online CRS-4529: Cluster Synchronization Services is online CRS-4533: Event Manager is online
・DBログイン確認
[oracle@racnode1 ~]$ export ORACLE_HOME=$DB_HOME [oracle@racnode1 ~]$ cd $ORACLE_HOME/network/admin [oracle@racnode1 admin]$ cat tnsnames.ora # tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/tnsnames.ora # Generated by Oracle configuration tools. ORCLCDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = racnode-scan)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCLCDB) ) ) [oracle@racnode1 admin]$ sqlplus sys@ORCLCDB as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Dec 30 13:08:38 2020 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Enter password: Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0
⇒この時点で既にノード1ではDBログイン出来る状態!
Section 4: Adding a RAC Node using a Docker container
Password management
同一ホスト上なので、この手順はスキップで良いはず。
Deploying with Block Devices
・ノード2用コンテナ作成
ノード1の時と同様手順で、ノード2用のコンテナを作っていく。
[opc@vmrac]$ 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/sdb:/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=ORCLCDB \ -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
Assign Network to additional RAC container
[opc@vmrac ~]$ docker network disconnect bridge racnode2 [opc@vmrac ~]$ docker network connect rac_pub1_nw --ip 172.16.1.151 racnode2 [opc@vmrac ~]$ docker network connect rac_priv1_nw --ip 192.168.17.151 racnode2
Start RAC container
[opc@vmrac ~]$ docker start racnode2 racnode2
・別端末からログ確認
[opc@vmrac ~]$ docker logs -f racnode2
こちらも20分程度かかった。最終的に以下のようなメッセージが表示されれば成功。
####################################
ORACLE RAC DATABASE IS READY TO USE!
####################################
※途中でエラーとなった場合、エラーメッセージを参考に原因調査。
Connect to the RAC container
[opc@vmrac ~]$ docker exec -i -t racnode2 /bin/bash [grid@racnode2 ~]$ ps -ef | grep pmon grid 13908 1 0 13:20 ? 00:00:00 asm_pmon_+ASM2 oracle 17185 1 0 13:22 ? 00:00:00 ora_pmon_ORCLCDB2 grid 18662 18403 0 13:25 pts/1 00:00:00 grep --color=auto pmon [grid@racnode2 ~]$ crsctl check crs CRS-4638: Oracle High Availability Services is online CRS-4537: Cluster Ready Services is online CRS-4529: Cluster Synchronization Services is online CRS-4533: Event Manager is online [grid@racnode2 ~]$ 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 ONLINE 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.orclcdb.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 --------------------------------------------------------------------------------
Section 5: Connecting to RAC Database
・DBログイン確認
[oracle@racnode2 ~]$ export ORACLE_HOME=$DB_HOME [oracle@racnode2 admin]$ sqlplus sys@ORCLCDB as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Dec 30 13:28:17 2020 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Enter password: Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0
⇒racnode2からもsqlplusログイン成功!
おまけ
公式ガイドに従って順調にいけば、シングルホスト上でのRAC環境が手に入るはず。
ちなみに、ホストOSを再起動すると勝手にコンテナ(racnode1,racnode2)は起動する設定となっている模様。
dockerの仕組みがまだまだ理解できていないのと、本当はRAC Storage Containerを利用した方法で構築したかったので(最初に試したが、うまくいかず一旦断念)、今後色々と調べつつ補足記事を書く予定。
おまけ1:[Docker] Oracle Database RAC 構築で学ぶDocker入門
参考情報
※既に紹介したものも含みます。
・Best Practices for Deploying Oracle RAC on Docker
・Oracle RAC Database on Docker
・Grid Infrastructureインストレーションおよびアップグレード・ガイドfor Linux
Oracle Grid Infrastructureのサーバー・ハードウェアのチェックリスト
・RAC on Docker – Single Host Setup
・如何获得一个RAC Oracle数据库(从Github – oracle/docker-images) – 公有云版
⇒参考にさせてもらった検証記事。
変更履歴
・2021/01/05
Section 3 の Password management の記載内容変更(記載漏れコマンド追記)
Section 3 の Connect to the RAC container の記載内容変更(設定確認コマンド追記)
おまけ1記事追加
・2021/01/07
注意事項セクション追記、検証環境のスペック表現修正
こちらの記事を見て早速構築してみました!
一部私が追加したコマンドがあるので記載しますー。
Section 3 の「Password management」の前に以下を実施。
mkdir /opt/.secrets/
openssl rand -hex 64 -out /opt/.secrets/pwd.key
また、DBログイン確認の際にORACLE_SIDの指定も記載してあげた方がいいかもしれないっすね。
早速試して頂いたようで、ありがとうございます!
コマンドも追記しておきます。