vm.gowatana.jp

NEOにほんごVMware(仮)

Horizon 8 のイベント データベースを構築してみる。(Microsoft SQL Server コンテナ)

Horizon のイベント データベースは、SQL Server を利用することが多いと思います。今回は、ラボむけに SQL Server 2019 のコンテナでイベント データベースを用意してみます。

 

今回の内容です。

 

今回の環境

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

 

今回の SQL Server は、ラボむけにできるだけ簡単に構築すべく、Microsoft から提供されているコンテナ イメージを利用して、Docker コンテナ ホストで起動します。

SQL Server をコンテナで起動する方法については、下記のあたりが参考になります。

 

コンテナイメージは下記を利用します。タグは、上記の Docker Hub ページにある 2022/05/21 時点での最新のもの(2019-CU16-ubuntu-20.04)です。

  • mcr.microsoft.com/mssql/server:2019-CU16-ubuntu-20.04

 

コンテナ ホストには、デフォルトで Docker がインストールされていている、VMware Photon OS 4.0 Rev2 の OVA を利用します。

Photon OS の OVA ファイルは、下記のサイトからダウンロードできます。

 

そして、今回のデータベース サーバは下記のように設定します。

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

 

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

Photon OS の OVA ファイルをデプロイして、Docker コンテナ ホストとして利用する準備をします。

 

1-1. OVA のデプロイ

まず、Photon OS の OVA ファイルをデプロイします。OVA ファイルは、vSphere Client の「OVF テンプレートのデプロイ」でウィザードに従ってデプロイします。

使用した VMware Photon OS 4.0 Rev2 の OVA ファイルは下記です。

 

デプロイする際には、OVA の URL を直接指定できます。(デプロイ手順は省略)

 

デプロイが完了したら、パワーオンします。

ちなみに、仮想マシンのリソース割り当てはデフォルトのままにしてあります。

  • vCPU: 1
  • メモリ: 2GB

 

1-2. OS 設定

最初は、vSphere Client の VM コンソールから、root ユーザでログインして作業します。デフォルトのパスワードは「changeme」で、初回ログイン時にパスワード変更要求があります。

 

初回ログイン時のパスワード変更では、簡単なパスワードが設定できません。今回は、root ユーザでの初回ログイン後にあらためて「VMware1!」を設定しています。

# passwd

 

SSH ログインするために、一時的なネットワーク アドレスを設定しておきます。

# ip a add dev eth0 192.168.80.52/24
# ip r add default via 192.168.80.1

 

SSH ログインした際にわかりやすいように、ホスト名を変更しておきます。

# hostnamectl set-hostname lab-db-82

 

SSH で、Photon OS に root ユーザでログインします。

$ ssh root@192.168.80.52

 

DHCP 設定のファイルを削除します。

# rm -rf /etc/systemd/network/99-dhcp-en.network

 

静的にネットワーク アドレスを設定するファイルを作成します。

cat << EOF > /etc/systemd/network/10-static.network
[Match]
Name=eth0

[Network]
DHCP=no
Address=192.168.80.52/24
Gateway=192.168.80.1
DNS=192.168.80.11
EOF

 

設定ファイルは、systemd での起動時に読み込めるようにパーミッションを変更しておきます。

# chmod 644 /etc/systemd/network/10-static.network

 

実際にコマンドを実行すると、下記のようになります。ファイル作成後に、cat コマンドで内容を確認しています。

root@lab-db-82 [ ~ ]# cat << EOF > /etc/systemd/network/10-static.network
> [Match]
> Name=eth0
>
> [Network]
> DHCP=no
> Address=192.168.80.52/24
> Gateway=192.168.80.1
> DNS=192.168.80.11
> EOF
root@lab-db-82 [ ~ ]# chmod 644 /etc/systemd/network/10-static.network
root@lab-db-82 [ ~ ]# cat /etc/systemd/network/10-static.network
[Match]
Name=eth0

[Network]
DHCP=no
Address=192.168.80.52/24
Gateway=192.168.80.1
DNS=192.168.80.11

 

ネットワーク サービスを再起動して、ファイルに記載した設定を反映しておきます。

# systemctl restart systemd-networkd

 

1-3. Docker サービスの起動

Photon OS の OVA には、デフォルトで Docker の RPM がインストールされています。dcoker サービスを有効化して、起動しておきます。

インストールされている Docker のバージョンです。

root@lab-db-82 [ ~ ]# rpm -qa | grep -i docker
docker-engine-20.10.11-1.ph4.x86_64
docker-cli-20.10.11-1.ph4.x86_64
docker-20.10.11-1.ph4.x86_64

 

docker サービスを有効化し、起動しておきます。

# systemctl enable docker
# systemctl start docker

 

サービスが起動され、docker info が表示できるようになりました。

root@lab-db-82 [ ~ ]# systemctl is-active docker
active
root@lab-db-82 [ ~ ]# docker info
Client:
 Context:    default
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 20.10.11
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc version: 14faf1c20948688a48edb9b41367ab07ac11ca91
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: default
 Kernel Version: 5.10.83-6.ph4-esx
 Operating System: VMware Photon OS/Linux
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 1.947GiB
 Name: lab-db-82
 ID: UGRB:W4FG:MQZQ:7VM4:7DBO:SF3L:IROT:WSUG:5D2G:O4FY:VGZA:4YPC
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false
 Product License: Community Engine
 

 

この Photon OS は、ディスク構成がデフォルトのまま使用しています。コンテナのデータは、/ (ルート)ファイルシステムに配置されます。ちなみに、この後作成する SQL Server データベースのファイルもこのファイルシステムに配置します。

root@lab-db-82 [ ~ ]# df -h /var/lib/docker/
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        16G  669M   15G   5% /

 

2. Microsoft SQL Server 2019 コンテナの起動

コンテナ ホスト側にデータベース格納ディレクトリを作成してから、SQL Server のコンテナを起動します。そして、Horizon イベント情報を格納するデータベースを作成しておきます。

 

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

今回は、SQL Server のデータベース ファイルをコンテナの外部に配置しておきます。コンテナ ホストに /mssql/data ディレクトリを作成し、パーミッションを変更しておきます。

root@lab-db-82 [ ~ ]# mkdir -p /mssql/data
root@lab-db-82 [ ~ ]# chmod 770 /mssql/data

 

2-2. SQL Server コンテナ イメージの Pull

mcr.microsoft.com レジストリから、コンテナ イメージをダウンロードしておきます。ちなみに、ここで Pull していなかったとしても docker container run を実行すると自動的にダウンロードされます。

root@lab-db-82 [ ~ ]# docker image pull mcr.microsoft.com/mssql/server:2019-CU16-ubuntu-20.04
2019-CU16-ubuntu-20.04: Pulling from mssql/server
5e51d371b4de: Pull complete
98f9a4e5d42f: Pull complete
239fcd477f4b: Pull complete
Digest: sha256:49a57dc220b1ea9d5bbdb95a98a27b3ed2c50e164c643eefab2e985e798f0b6b
Status: Downloaded newer image for mcr.microsoft.com/mssql/server:2019-CU16-ubuntu-20.04
mcr.microsoft.com/mssql/server:2019-CU16-ubuntu-20.04

 

イメージがダウンロードできました。

root@lab-db-82 [ ~ ]# docker image ls
REPOSITORY                       TAG                      IMAGE ID       CREATED       SIZE
mcr.microsoft.com/mssql/server   2019-CU16-ubuntu-20.04   f554c0722914   4 weeks ago   1.64GB

 

2-3. SQL Server コンテナの起動

SQL Server のコンテナを起動します。下記のようにパラメータを指定しています。

  • Express エディション
  • sa ユーザのパスワードは VMware1!"
  • コンテナ ホスト外部からの接続は 1433 ポート
  • コンテナの名前(--name)は eventdb
  • コンテナのホスト名(--hostname)も eventdb
  • コンテナをバックグラウンドで(デタッチして)起動。(-d)
  • ホスト起動時に、コンテナも自動起動する(--restart=always)
  • ホストの /mssql/data ディレクトリを、コンテナの /var/opt/mssql/data ディレクトリにマウント
docker container run \
-e "ACCEPT_EULA=Y" \
-e "MSSQL_PID=Express" \
-e "SA_PASSWORD=VMware1!" \
-p 1433:1433 \
--name eventdb \
--hostname eventdb \
-d \
--restart=always \
-v /mssql/data:/var/opt/mssql/data \
mcr.microsoft.com/mssql/server:2019-CU16-ubuntu-20.04

 

コンテナが起動できたことを確認しておきます。

root@lab-db-82 [ ~ ]# docker container ps

 

STATUS が Up になっていることを確認しておきます。

 

Windows に SQL Server をインストールした場合には下記のような設定をしますが、今回の Linux でのコンテナ起動では不要です。この時点で、外部のサーバから TCP 1433 ポートで接続できるはずです。

 

2-4. データベースの作成

SQL Server に、Horizon のイベント情報を格納するためのデータベースを作成しておきます。

コンテナに含まれている SQL Server のクライアント(sqlcmd)で、SQL Server インスタンスに sa ユーザで接続します。パスワードは、コンテナ起動時に指定した「VMware1!」です。

root@lab-db-82 [ ~ ]# docker exec -it eventdb /opt/mssql-tools/bin/sqlcmd -S localhost -U sa
Password:
1>

 

「evtdb」という名前のデータベースを作成します。入力した SQL は、「go」コマンドで実行されます。

1> create database evtdb
2> go

 

sys.databases テーブルの name 列で、データベース「evtdb」が作成されたことを確認しておきます。1行目の「:setvar SQLCMDMAXFIXEDTYPEWIDTH 35」は、列幅を35に表示調整するために実行しています。

1> :setvar SQLCMDMAXFIXEDTYPEWIDTH 34
2> select name from sys.databases;
3> go
name
----------------------------------
master
tempdb
model
msdb
evtdb

(5 rows affected)

 

データベースのファイルは、コンテナの /var/opt/mssql/data ディレクトリに配置されています。これは、コンテナ起動時にホスト側の /mssql/data ディレクトリをマウントしたディレクトリです。

1> :setvar SQLCMDMAXFIXEDTYPEWIDTH 34
2> select name,physical_name from sys.master_files
3> go
name                               physical_name
---------------------------------- ----------------------------------
master                             /var/opt/mssql/data/master.mdf
mastlog                            /var/opt/mssql/data/mastlog.ldf
tempdev                            /var/opt/mssql/data/tempdb.mdf
templog                            /var/opt/mssql/data/templog.ldf
modeldev                           /var/opt/mssql/data/model.mdf
modellog                           /var/opt/mssql/data/modellog.ldf
MSDBData                           /var/opt/mssql/data/MSDBData.mdf
MSDBLog                            /var/opt/mssql/data/MSDBLog.ldf
evtdb                              /var/opt/mssql/data/evtdb.mdf
evtdb_log                          /var/opt/mssql/data/evtdb_log.ldf

(10 rows affected)

 

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

1> exit
root@lab-db-82 [ ~ ]#

 

「docker container exec」コマンドから、eventdb コンテナの「ls -lh」コマンドを実行すると、コンテナ内の /var/opt/mssql/data ディレクトリにデータベース ファイルが作成されていることが確認できます。

root@lab-db-82 [ ~ ]# docker container exec -it eventdb ls -lh /var/opt/mssql/data/
total 88M
-rw-r----- 1 mssql root  256 May 21 11:16 Entropy.bin
-rw-r----- 1 mssql root 8.0M May 21 18:59 evtdb.mdf
-rw-r----- 1 mssql root 8.0M May 21 18:59 evtdb_log.ldf
-rw-r----- 1 mssql root 4.5M May 21 18:52 master.mdf
-rw-r----- 1 mssql root 2.0M May 21 19:06 mastlog.ldf
-rw-r----- 1 mssql root 8.0M May 21 18:52 model.mdf
-rw-r----- 1 mssql root  14M May 21 18:52 model_msdbdata.mdf
-rw-r----- 1 mssql root 512K May 21 18:52 model_msdblog.ldf
-rw-r----- 1 mssql root 512K May 21 18:52 model_replicatedmaster.ldf
-rw-r----- 1 mssql root 4.5M May 21 18:52 model_replicatedmaster.mdf
-rw-r----- 1 mssql root 8.0M May 21 18:52 modellog.ldf
-rw-r----- 1 mssql root  14M May 21 18:28 msdbdata.mdf
-rw-r----- 1 mssql root 512K May 21 18:52 msdblog.ldf
-rw-r----- 1 mssql root 8.0M May 21 18:52 tempdb.mdf
-rw-r----- 1 mssql root 8.0M May 21 18:59 templog.ldf

 

そして、実際にはホスト側の /mssql/data ディレクトリに格納されています。

root@lab-db-82 [ ~ ]# ls -lh /mssql/data/
total 88M
-rw-r----- 1 10001 root  256 May 21 11:16 Entropy.bin
-rw-r----- 1 10001 root 8.0M May 21 18:59 evtdb_log.ldf
-rw-r----- 1 10001 root 8.0M May 21 18:59 evtdb.mdf
-rw-r----- 1 10001 root 4.5M May 21 18:52 master.mdf
-rw-r----- 1 10001 root 2.0M May 21 19:06 mastlog.ldf
-rw-r----- 1 10001 root 8.0M May 21 18:52 modellog.ldf
-rw-r----- 1 10001 root 8.0M May 21 18:52 model.mdf
-rw-r----- 1 10001 root  14M May 21 18:52 model_msdbdata.mdf
-rw-r----- 1 10001 root 512K May 21 18:52 model_msdblog.ldf
-rw-r----- 1 10001 root 512K May 21 18:52 model_replicatedmaster.ldf
-rw-r----- 1 10001 root 4.5M May 21 18:52 model_replicatedmaster.mdf
-rw-r----- 1 10001 root  14M May 21 18:28 msdbdata.mdf
-rw-r----- 1 10001 root 512K May 21 18:52 msdblog.ldf
-rw-r----- 1 10001 root 8.0M May 21 18:52 tempdb.mdf
-rw-r----- 1 10001 root 8.0M May 21 18:59 templog.ldf

 

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

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

 

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

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

 

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

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

 

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

PS C:\Users\administrator.EUC> curl.exe -v 192.168.80.52:1433
* Rebuilt URL to: 192.168.80.52:1433/
*   Trying 192.168.80.52...
* TCP_NODELAY set
* Connected to 192.168.80.52 (192.168.80.52) port 1433 (#0)
> GET / HTTP/1.1
> Host: 192.168.80.52:1433
> 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
  • データベース タイプ:Microsoft SQL Server
  • ポート: 1433
  • データベース名: evtdb
  • ユーザー名: sa
  • パスワード: VMware1!
  • テーブルのプリフィックス: evt_

 

イベント データベースが構成されました。

 

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

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

 

ちなみに、SQL Sever データベースのテーブルは自動作成されます。evtdb データベースに、さきほど設定したプリフィックス(evt_)のテーブルが作成されていることが確認できます。

root@lab-db-82 [ ~ ]# docker exec -it eventdb /opt/mssql-tools/bin/sqlcmd -S localhost -U sa
Password:
1> use evtdb
2> go
Changed database context to 'evtdb'.
1> select name from sys.tables
2> go
name
------------------------------
evt_props
evt_event
evt_event_data
evt_event_historical
evt_event_data_historical
evt_timing_profiler

(6 rows affected)
1> exit
root@lab-db-82 [ ~ ]#

 

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

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

 

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

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

 

4-2. SQL Server コンテナの削除

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

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

 

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

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

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

 

以上、MS SQL Server コンテナでイベント データベースを用意してみる話でした。