Horizon のイベント データベースは、SQL Server を利用することが多いと思います。今回は、ラボむけに SQL Server 2019 のコンテナでイベント データベースを用意してみます。
今回の内容です。
- 今回の環境
- 1. Docker コンテナ ホストの構築
- 2. Microsoft SQL Server 2019 コンテナの起動
- 3. イベント データベースの構成
- 4. イベント データベースの削除
今回の環境
Horizon 8 は、今回も下記の投稿で用意した Horizon ラボ環境を利用しています。
今回の SQL Server は、ラボむけにできるだけ簡単に構築すべく、Microsoft から提供されているコンテナ イメージを利用して、Docker コンテナ ホストで起動します。
SQL Server をコンテナで起動する方法については、下記のあたりが参考になります。
- クイック スタート:Docker を使用して SQL Server コンテナー イメージを実行する
https://docs.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15 -
Docker Hub の Microsoft SQL Server ページ
https://hub.docker.com/_/microsoft-mssql-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 with virtual hardware v13 (UEFI Secure Boot)
https://packages.vmware.com/photon/4.0/Rev2/ova/photon-ova_uefi-4.0-c001795b80.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 コンテナでイベント データベースを用意してみる話でした。