vm.gowatana.jp

NEOにほんごVMware(仮)

Horizon 8 のイベント データベースを構築してみる。(Oracle Database 21c XE コンテナ)

Horizon のイベント データベースを、Oracle Database で構築してみます。ラボむけに Oracle Database 21c XE(Express Edition)のコンテナでイベント データベースを用意してみます。ただし、そもそも Product Interoperability Matrix には 21c が掲載されていないので、サポート構成から大幅に外れていますが、ラボ環境ということで・・・

 

今回の内容です。

 

今回の環境

Horizon 8 は、今回も下記の投稿で用意した Horizon ラボ環境を利用しています。

 

今回の Oracle Database は、ラボむけにできるだけ簡単に構築すべく、ORACLE から提供されている Oracle Database 21c XE(Express Edition)のコンテナ イメージを利用して、Docker コンテナ ホストで起動します。

Oracle Database のコンテナ イメージは、Oracle Container Registry から入手できます。下記 URL の「Database」→「express」 Repository のリンクをたどると、「Oracle Database XE Release 21c (21.3.0.0) Docker Image Documentation」を参照できます。ここで、コンテナの起動手順などは、ここで確認できます。

 

そして、今回の Docker コンテナ ホストの OS は下記のように構成しています。(前回 と同様に)

  • 仮想マシン名とホスト名: lab-db-82
  • IP アドレス: 192.168.80.52
  • OS ユーザ / パスワード: root / VMware1!

 

1. Docker コンテナ ホストの構築

今回も、Photon OS の OVA で Docker コンテナ ホストを構築します。

 

1-1. OVA のデプロイと OS 設定

コンテナ ホストは、前回の投稿(下記)での「1. Docker コンテナ ホストの構築」の手順で構築してあります。

 

ただし、今回は OVA のデフォルトのストレージ構成だと容量が少ないの、仮想ディスクを追加しておきます。ちなみに、Oracle Database XE のコンテナ イメージで 11GB 以上、さらにデータベース ファイルの作成では最低でも 4.5GB が必要になります。

 

1-2. 仮想ディスクの追加

Photon OS の OVA で構築した Docker コンテナ ホストの仮想マシン「lab-db-82」に、仮想ディスクを 2つ追加しておきます。

まず、vSphere Client から、仮想マシンに 2つの仮想ディスクを追加しておきます。

  • ハード ディスク 2: 40GB
    → Docker コンテナ イメージを格納する。
  • ハード ディスク 3: 20GB
    → Oracle Database のデータベース ファイルを格納する。

また、仮想マシンへの仮想ディスク追加(設定の変更)では、OVA デプロイ後のデフォルト設定では、CD/DVD ドライブで「ホスト デバイス」が選択されています。そのままでは「OK」をクリックできないので、「クライアント デバイス」に変更しておきます。

Docker コンテナ ホストで、追加した仮想ディスクをゲスト OS で利用できるように準備をしておきます。追加した仮想ディスクは、Photon OS では下記のデバイス名で認識されます。

  • ハード ディスク 2:/dev/sdb
  • ハード ディスク 3:/dev/sdc

 

1-3. ゲスト OS でのストレージ準備(コンテナ イメージ用)

/dev/sdb にパーティションとファイルシステムを作成して、/var/lib/docker にマウントします。

/dev/sdb は、仮想ディスクを追加すると Photon OS 側で自動認識されます。

root@lab-db-82 [ ~ ]# lsblk -i /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  40G  0 disk

 

sfdisk コマンドで、パーティションを作成しておきます。

root@lab-db-82 [ ~ ]# echo '2048,,' | sfdisk -uS /dev/sdb

 

/dev/sdb1 パーティションが作成されました。

root@lab-db-82 [ ~ ]# lsblk -i /dev/sdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  40G  0 disk
`-sdb1   8:17   0  40G  0 part

 

/dev/sdb1 パーティションに、ext4 ファイルシステムを作成します。

root@lab-db-82 [ ~ ]# mkfs -t ext4 -L docker /dev/sdb1

 

/dev/sdb1 に ext4 ファイルシステムが作成されて、「docker」ラベルが付与されました。

root@lab-db-82 [ ~ ]# blkid /dev/sdb1
/dev/sdb1: LABEL="docker" UUID="a33fb1d3-f7ec-4c1e-94a2-1e4a1510f40e" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="0384df3c-01"

 

/var/lib/docker の既存データを移行するために、一時的に /dev/sdb1 を /mnt にマウントします。ちなみに、まだ Docker 環境が未使用であれば、データ移行せずに /var/lib/docker にマウントできます。

root@lab-db-82 [ ~ ]# mount /dev/sdb1 /mnt

 

コンテナが起動されていないことを確認して、docker サービスを停止します。

root@lab-db-82 [ ~ ]# docker container ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
root@lab-db-82 [ ~ ]# systemctl stop docker

 

/var/lib/docker ディレクトリ 配下のファイルを、/mnt にコピーします。

root@lab-db-82 [ ~ ]# cp -pr /var/lib/docker/* /mnt/
root@lab-db-82 [ ~ ]# ls /mnt/
buildkit    image       network   plugins   swarm  trust
containers  lost+found  overlay2  runtimes  tmp    volumes

 

/var/lib/docker ディレクトリ 配下のファイルは削除してしまいます。

root@lab-db-82 [ ~ ]# rm -rf /var/lib/docker/*

 

/mnt の /dev/sdb1 をアンマウントしておきます。

root@lab-db-82 [ ~ ]# umount /mnt

 

/dev/sdb1 を、/var/lib/docker ディレクトリにマウントします。ここでは /etc/fstab ファイルにマウント設定を追記してから、「mount -a」でマウントしています。

root@lab-db-82 [ ~ ]# echo 'LABEL=docker /var/lib/docker ext4 defaults 0 0' >> /etc/fstab
root@lab-db-82 [ ~ ]# mount -a
root@lab-db-82 [ ~ ]# df -h /var/lib/docker
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1        40G   13G   25G  33% /var/lib/docker

 

これでストレージが切り替えられたので、docker サービスを起動します。

root@lab-db-82 [ ~ ]# systemctl start docker

 

1-4. ゲスト OS でのストレージ準備(データベース ファイル用)

/dev/sdc にパーティションとファイルシステムを作成して、/data にマウントします。

/dev/sdc も、仮想ディスクを追加すると Photon OS 側で自動認識されます。

root@lab-db-82 [ ~ ]# lsblk -i /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc    8:32   0  20G  0 disk

 

sfdisk コマンドで、パーティションを作成しておきます。

root@lab-db-82 [ ~ ]# echo '2048,,' | sfdisk -uS /dev/sdc

 

/dev/sdc1 パーティションが作成されました。

root@lab-db-82 [ ~ ]# lsblk -i /dev/sdc
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc      8:32   0  20G  0 disk
`-sdc1   8:33   0  20G  0 part

 

/dev/sdc1 パーティションに、ext4 ファイルシステムを作成します。

root@lab-db-82 [ ~ ]# mkfs -t ext4 -L oracledata /dev/sdc1

 

/dev/sdc1 に ext4 ファイルシステムが作成されて、「oracledata」ラベルが付与されました。

root@lab-db-82 [ ~ ]# blkid /dev/sdc1
/dev/sdc1: LABEL="oracledata" UUID="687e1770-6967-4dfc-b2b1-1196e48eb36a" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="9dbdf3c6-01"

 

/data ディレクトリを作成して、ファイルシステムをマウントします。

root@lab-db-82 [ ~ ]# mkdir /data
root@lab-db-82 [ ~ ]# echo 'LABEL=oracledata /data ext4 defaults 0 0' >> /etc/fstab
root@lab-db-82 [ ~ ]# mount -a
root@lab-db-82 [ ~ ]# df -h /data
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc1        20G   45M   19G   1% /data

 

2. Oracle Database コンテナの構築

Oracle Database 21c XE のコンテナを起動して、デフォルトで作成されている PDB に Horizon イベント データベースむけの表領域とユーザを作成します。

 

2-1. データベース ファイル格納ディレクトリの作成

データベース ファイルを配置するディレクトリを、/data 配下に作成します。

root@lab-db-82 [ ~ ]# mkdir /data/oradata

 

コンテナ内部からデータベース ファイルを作成できるように、パーティションを変更しておきます。

root@lab-db-82 [ ~ ]# chmod 777 /data/oradata

 

2-2. Oracle Database コンテナ イメージの Pull

今回は、Oracle Container Registry から下記のコンテナイメージを Pull します。

  • container-registry.oracle.com/database/express:21.3.0-xe
root@lab-db-82 [ ~ ]# docker image pull container-registry.oracle.com/database/express:21.3.0-xe

 

Oracle Database のコンテナ イメージは、XE でもけっこう容量があります。

root@lab-db-82 [ ~ ]# docker image ls container-registry.oracle.com/database/express
REPOSITORY                                       TAG         IMAGE ID       CREATED       SIZE
container-registry.oracle.com/database/express   21.3.0-xe   e986fd612413   7 weeks ago   11.2GB

 

2-2. Oracle Database コンテナの起動

Oracle Database のコンテナを起動します。

  • コンテナの名前は eventdb-oracle
  • コンテナ ホスト外部から、1521 と 5500 ポートでアクセス可能にする
  • Oracle の SYS / SYSTEM / PDBADMIN のパスワードは VMware1!
  • コンテナ ホストの data/oradata ディレクトリを、コンテナの /opt/oracle/oradata にマウント
  • コンテナはバックグラウンド で起動する(-d)
docker container run \
--name eventdb-oracle \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_PWD='VMware1!' \
-v /data/oradata:/opt/oracle/oradata \
-d \
container-registry.oracle.com/database/express:21.3.0-xe

 

Oracle Database のインスタンスの起動は、下記のように確認できます。ログファイルに「Completed: ALTER DATABASE OPEN」と出力されればデータベース インスタンスが起動完了です。これは10分以上時間がかかるはずです。

root@lab-db-82 [ ~ ]# docker logs -f eventdb-oracle

 

データベース インスタンスには、コンテナ内の sqlplus で接続できます。

root@lab-db-82 [ ~ ]# docker exec -it eventdb-oracle sqlplus system/'VMware1!'

SQL*Plus: Release 21.0.0.0.0 - Production on Sun May 22 05:08:07 2022
Version 21.3.0.0.0

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

Last Successful login time: Sun May 22 2022 05:05:15 +00:00

Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL> select instance_name,status from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
XE               OPEN

SQL>
SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> exit
Disconnected from Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
root@lab-db-82 [ ~ ]#

 

この時点で、下記のパラメータで Horizon イベント データベースの構成が可能になっています。ただし、このパラメータで接続すると、Horizon のイベント情報を格納するテーブルなどが ROOT CDB(CDB$ROOT)の SYSTEM 表領域に作成されてしまい、Oracle Database 的にはあまりに微妙です。

  • データベース サーバ: 192.168.80.52
  • データベース タイプ:Oracle
  • ポート: 1521
  • データベース名: XE
  • ユーザー名: system
  • パスワード: VMware1!
  • テーブルのプリフィックス: evt_

 

そのため、デフォルトで作成される プラガブル データベース(PDB)に表領域とデータベース ユーザを作成して、Horizon Connection Server から接続できるようにします。

 

2-3. PDB での表領域とユーザの作成

まず、コンテナ内で自由にコマンドを実行するために bash を起動します。

root@lab-db-82 [ ~ ]# docker exec -it eventdb-oracle bash
bash-4.2$ 

 

sqlplus で、デフォルトで作成される PDB「XEPDB1」に接続します。

root@lab-db-82 [ ~ ]# docker exec -it eventdb-oracle bash
bash-4.2$ sqlplus system/'VMware1!'@xepdb1

SQL*Plus: Release 21.0.0.0.0 - Production on Sun May 22 05:20:13 2022
Version 21.3.0.0.0

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

Last Successful login time: Sun May 22 2022 05:08:07 +00:00

Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL>

 

XEPDB1 に接続していることが確認できます。

SQL> show con_name

CON_NAME
------------------------------
XEPDB1

 

horizon_ts という表領域を作成します。

SQL> create tablespace horizon_ts datafile '/opt/oracle/oradata/XE/horizon_ts.dbf' size 100M autoextend on maxsize unlimited;

Tablespace created.

SQL>

 

表領域に対応するデータファイルが作成されました。

SQL> col TABLESPACE_NAME for a15
SQL> col FILE_NAME for a44
SQL> set line 60
SQL> select TABLESPACE_NAME,FILE_NAME from DBA_DATA_FILES;

TABLESPACE_NAME FILE_NAME
--------------- --------------------------------------------
SYSTEM          /opt/oracle/oradata/XE/XEPDB1/system01.dbf
SYSAUX          /opt/oracle/oradata/XE/XEPDB1/sysaux01.dbf
UNDOTBS1        /opt/oracle/oradata/XE/XEPDB1/undotbs01.dbf
USERS           /opt/oracle/oradata/XE/XEPDB1/users01.dbf
HORIZON_TS      /opt/oracle/oradata/XE/horizon_ts.dbf

SQL>

 

データベースのユーザを作成して、デフォルトでテーブルなどを格納する表領域を 「horizon_ts」にします。

SQL> create user horizon identified by "VMware1!" default tablespace horizon_ts;

User created.

SQL>

 

そして、ユーザへの権限の割り当ては、ラボ環境なので強めに設定してしまいます。

SQL> grant unlimited tablespace to horizon;

Grant succeeded.

SQL> grant dba to horizon;

Grant succeeded.

SQL>

 

「exit」コマンドで、sqlplus を終了します。

SQL> exit

 

2-4. Oracle Listener 設定変更

Horizon Connection Server から Oracle Database への接続方式は古めのようで、ドキュメントには下記のような説明があります。インスタンスへの接続には Oracle SID を指定しているようです。

Oracle 12c または 11g データベースの場合、Horizon Console でイベント データベースを設定するときに Oracle System Identifier (SID) をデータベース名として使用する必要があります。

 

しかし、PDB への接続では SID ではなくサービスの名前で接続する必要があります。そこで、Oracle Database のリスナーに下記のドキュメントにあるパラメータを追加して、SID 指定でも接続可能にします。

 

リスナーの設定ファイルである listener.ora に、パラメータ「USE_SID_AS_SERVICE_listener=on」を追記します。

bash-4.2$ cp -p /opt/oracle/oradata/dbconfig/XE/listener.ora ./listener.ora.backup
bash-4.2$ echo 'USE_SID_AS_SERVICE_listener=on' >> /opt/oracle/oradata/dbconfig/XE/listener.ora

 

リスナーを再起動します。そして、リスナーにデータベース インスタンスが登録されるまで少し待ちます。

bash-4.2$ lsnrctl stop
bash-4.2$ lsnrctl start
bash-4.2$ lsnrctl status

 

3. イベント データベースの構成

Horizon Console から、Horizon イベント データベースを構成します。

 

3-1. Horizon Connection Server からの疎通確認

Horizon Connection Server の Windows からデータベース サーバに、簡易的に疎通確認しておきます。今回は、Connection Server の PowerShell コンソールなどから、データベース サーバ(192.168.80.52)の 1521 ポートに curl.exe を実行してみます。

 

データベース サーバ側で Oracle Database(のコンテナ)が準備できていない場合は、下記のように「TCP_NODELAY set」となるはずです。このコマンドは Ctrl + C で終了できます。この例では失敗結果を見るため、あえて 1521 ではなく 152 ポートにアクセスしています。

PS C:\Users\administrator.EUC> curl.exe -v 192.168.80.52:152
* Rebuilt URL to: 192.168.80.52:152/
*   Trying 192.168.80.52...
* TCP_NODELAY set

 

SQL Serer コンテナが起動できていれば、下記のような出力になるはずです。データベースに HTTP で接続しているので結果は微妙ですが、TCP 1521 ポートから応答があり、ひとつ前の実行結果とは異なることがわかります。

PS C:\Users\administrator.EUC> curl.exe -v 192.168.80.52:1521
* Rebuilt URL to: 192.168.80.52:1521/
*   Trying 192.168.80.52...
* TCP_NODELAY set
* Connected to 192.168.80.52 (192.168.80.52) port 1521 (#0)
> GET / HTTP/1.1
> Host: 192.168.80.52:1521
> User-Agent: curl/7.55.1
> Accept: */*
>
* Empty reply from server
* Connection #0 to host 192.168.80.52 left intact
curl: (52) Empty reply from server

 

3-2. イベント データベースの構成

Horizon のイベント データベースは、Horizon Console の「設定」→「イベント構成」→「編集」から構成できます。

「イベント データベースを編集」画面が表示されるので、下記のように入力してから「OK」をクリックします。

  • データベース サーバ: 192.168.80.52
  • データベース タイプ:Oracle
  • ポート: 1521
  • データベース名: XEPDB1
  • ユーザー名: horizon
  • パスワード: VMware1!
  • テーブルのプリフィックス: evt_

 

3-3. イベント情報とデータベースの確認

これで、「監視」→「イベント」を開くと、イベント情報が表示されるようになります。イベント データベース構成以降の、Horizon Console のログインやデスクトップ プールの操作などが表示されるはずです。

 

データベース側でも、さきほど設定したプリフィックス(evt_)のテーブルが作成されていることが確認できます。

root@lab-db-82 [ ~ ]# docker exec -it eventdb-oracle bash
bash-4.2$ sqlplus horizon/'VMware1!'@xepdb1

SQL*Plus: Release 21.0.0.0.0 - Production on Sun May 22 07:04:06 2022
Version 21.3.0.0.0

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

Last Successful login time: Sun May 22 2022 06:50:59 +00:00

Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL> show con_name

CON_NAME
------------------------------
XEPDB1
SQL> col TABLE_NAME for a30
SQL> col TABLESPACE_NAME for a30
SQL> select TABLESPACE_NAME,TABLE_NAME from USER_TABLES;

TABLESPACE_NAME                TABLE_NAME
------------------------------ ------------------------------
HORIZON_TS                     EVT_EVENT
HORIZON_TS                     EVT_PROPS
HORIZON_TS                     EVT_EVENT_DATA
HORIZON_TS                     EVT_EVENT_HISTORICAL
HORIZON_TS                     EVT_EVENT_DATA_HISTORICAL
HORIZON_TS                     EVT_TIMING_PROFILER

6 rows selected.

SQL>

 

4. イベント データベースの削除

ラボでの検証がおわったら、イベント データベースを削除することもできます。

 

4-1. Horizon Console でのイベント データベースのクリア

まず、Horizon のイベント データベース構成は、Horizon Console の「設定」→「イベント構成」→「クリア」から解除できます。

 

4-2. Oracle Database コンテナの削除

イベント データベースのコンテナは、下記のコマンドで削除できます。「-f」オプションによって、コンテナが起動されたままでも削除できます。

root@lab-db-82 [ ~ ]# docker container rm -f eventdb-oracle

 

4-3. データベース ファイルの削除

コンテナ ホストで、データベース ファイルを削除します。これは、コンテナを削除してから実施します。

root@lab-db-82 [ ~ ]# rm -rf /data/oradata/*

 

以上、Oracle Database コンテナの PDB でイベント データベースを用意してみる話でした。