OpenShiftにDb2 Warehouseをインストールして無料トライアル（Db2U s11.5.8.0-cn3インストール編）

# 目次
1. はじめに
2. 前提
3. 方針
4. 手順
4.1 Db2 Warehouse用のプロジェクトを作成
4.2 IBM Operator Catalogを導入
4.3 Db2 Operatorを導入
4.4 Security Context Constraints (SCC)を作成
4.5 Db2 Warehouseクラスターを作成
4.6 Db2コマンドライン・プロセッサ(CLP)の動作確認
5. エラー例
6. 参考資料


# 1. はじめに
Db2とDb2 Warehouseは同じデータベース・エンジンを使っていますが、前者はトランザクション処理向け、後者はレポーティングや分析処理向けの位置付けです。しかしデータの持たせ方を表単位で変更して（行表／列表）、どちらの処理も効率よく実行できるように構成できます。

Db2とDb2 Warehouseはフルマネージド・サービスとしてクラウド環境で提供されていますが、ユーザー自身でクラウド環境(OpenShift)に導入することもできて、そのエンジンはDb2U ([Db2 Universal container](https://www.ibm.com/docs/en/db2/11.5?topic=1154-whats-new-in-db2))と呼ばれています。

Db2UをOpenShiftクラスターにデプロイするとき、Db2とDb2 Warehouseのいずれかを指定します。Db2の場合はカスタムリソース定義(CRD)に`db2oltp`を設定、Db Warehouseの場合は`db2wh`を設定します。この違いはDb2とDb2 Warehouseのマニュアルを見比べて把握しました。こういった内容確認も含めて、エラー無しでデプロイできるまで私は時間を要してしまったので、本記事に手順をまとめます。

導入する製品は[Db2 Warehouse Community Edition](https://www.ibm.com/docs/en/db2/11.5?topic=editions-db2-database-product-offerings#c0058536__db2_community)です。無料で利用できますが（但しIBM社の製品サポート対象外）、クラスター全体でCPUが4vCPUs、メモリーが16GBに制限されます。これを使って本記事ではSMP（symmetric multiprocessor、ノード1台）、論理パーティション2個の構成を導入します。構成図が次のページに載っています。

- [Figure 5. Partitioned database with symmetric multiprocessor environment](https://www.ibm.com/docs/en/db2/11.5?topic=environments-database-partition-processor#d24742e277)


# 2. 前提
次の環境を用いて本記事の内容を検証しました。これと同等の環境を入手済みであることが前提となりますが、ただし導入するDb2 WarehouseがSMP構成のためworkerノードは1台で足ります。
- OpenShftクラスター
    - OpenShift 4.12.41
    - ノード
        - control-plane (4vCPUs, memory 16GB, ephemeral-storage 100GB)：3台
        - infra (16vCPUs, memory 32GB, ephemeral-storage 100GB)：3台
        - worker (8vCPUs, memory 32GB, ephemeral-storage 100GB)：3台
    - ストレージ
        - ODF 4.12.9：500GB
- Bastionマシン
    - RHEL 8.8

本記事の手順に従って次のソフトウェアを導入します。
- IBM Operator Catalog
- Db2 Operator 110508.0.3
- Db2 Warehouse s11.5.8.0-cn3


# 3. 方針
### 3.1 Db2 Warehouseのマニュアルに加えてDb2のマニュアルも参照
Db2マニュアルの方が新しい説明が載っています。本記事ではDb2 WarehouseのクラスターをデプロイするときにDb2 Warehouseマニュアルに従い、それ以外はDb2マニュアルに従います。
    - [Db2マニュアル](https://www.ibm.com/docs/en/db2/11.5?topic=deployments-db2-rhos-k8s)
    - [Db2 Warehouseマニュアル](https://www.ibm.com/docs/en/db2-warehouse?topic=db2-warehouse-rhos-k8s)

### 3.2 Db2UオペレーターをIBM Operator Catalogから導入
オペレーター導入方法は[3種類](https://www.ibm.com/docs/en/db2/11.5?topic=db2-installing-operator)あって、その中で前提が少ないIBM Operator Catalogを使うことにします。
- Red Hat Marketplace：アカウントが必要
- コマンドライン・インターフェース：[cloudctl](https://github.com/IBM/cloud-pak-cli)が必要
- IBM Operator Catalog：上のいずれも不要

### 3.3 Db2Uのカスタムリソース(CR)としてDb2uInstanceを利用
Db2U v11.5.8では[2種類のCR](https://www.ibm.com/docs/en/db2/11.5?topic=db2-deploying-using-custom-resource)が提供されています。本記事では新しい方のDb2uInstanceを使います。
- Db2uCluster
- Db2uInstance

### 3.4 Db2uInstanceのカスタムリソース定義(CRD)をDb2 Warehouseマニュアルにもとづき作成
私の環境ではマニュアルに載っているカスタムリソース定義(CRD)がそのままでは動かず、修正する必要がありました。修正箇所を減らすために、Db2マニュアルにもとづくよりも[Db2 Warehouseのマニュアルに載っているCRD](https://www.ibm.com/docs/en/db2-warehouse?topic=resource-deploying-db2-warehouse-using-db2uinstance-custom#db2_cluster_api_11-5-7__title__17)を使います。これでDb2 Warehouse特有の設定をどのように行うのか、といったことに悩む必要が少なくなります。

なお、Db2Uオペレーターの画面インターフェース(GUI)を使ってCRDを作成することができますが、私は却って手間を要したので本記事では使いません。

### 3.5 Db2 Warehouseクラスターのデプロイをbastionマシンのコマンドライン・インターフェース(CLI)で実行
OpenShiftの管理画面を使ってクラスターをデプロイできますが、本記事ではbastionマシンのLinux CLIを使います。こちらの方がコマンド再実行やログ記録が便利と思います。


# 4. 手順1) Db2 Warehouse用のプロジェクトを作成
OpenShiftクラスターにログインしてプロジェクトを作成します。プロジェクト名は任意で、本記事では`ns-db2u`とします。
```
[admin@bastion ~]$ oc login --server=xxx.xxx.xxx:nnnn -u kubeadmin
[admin@bastion ~]$ oc new-project ns-db2u
Now using project "ns-db2u" on server "https://xxx.xxx.xxx:nnnn".
...
```

# 4. 手順2) IBM Operator Catalogを導入
次のページを参考にして手順を進めます。
- [Db2マニュアル：Installing the Db2 Operator from the IBM Operator Catalog](https://www.ibm.com/docs/en/db2/11.5?topic=operator-installing-from-catalog)

OpenShiftの管理画面を開いて、右上の＋ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700959/e3df5d52-3049-a978-04c8-2bea322eaf11.png)

[マニュアル](https://www.ibm.com/docs/en/db2/11.5?topic=operator-installing-from-catalog#taskinstall_op_from_cat_11-5-8__steps__1)に載っているIBM Operator CatalogのYAML定義を管理画面に貼り付けて`Create`ボタンを押します。
<details><summary>IBM Operator CatalogのYAML定義</summary><div>

```yaml
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
  name: ibm-operator-catalog
  namespace: openshift-marketplace
spec:
  displayName: "IBM Operator Catalog" 
  publisher: IBM
  sourceType: grpc
  image: icr.io/cpopen/ibm-operator-catalog
  updateStrategy:
    registryPoll:
      interval: 45m
```
</div></details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700959/cd53d117-88f9-8570-0637-267000ab8031.png)
導入したカタログが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700959/f916433b-7ec6-147b-3e7b-f0446af763c9.png)

導入結果をbastionマシンのCLIで確認すると、次のようになります。
```
[admin@bastion ~]$ oc get CatalogSources ibm-operator-catalog -n openshift-marketplace
NAME                   DISPLAY                TYPE   PUBLISHER   AGE
ibm-operator-catalog   IBM Operator Catalog   grpc   IBM         71s

[admin@bastion ~]$ oc get catalogsource,pods -n openshift-marketplace
NAME                                                      DISPLAY                TYPE   PUBLISHER   AGE
catalogsource.operators.coreos.com/certified-operators    Certified Operators    grpc   Red Hat     25h
catalogsource.operators.coreos.com/community-operators    Community Operators    grpc   Red Hat     25h
catalogsource.operators.coreos.com/ibm-operator-catalog   IBM Operator Catalog   grpc   IBM         96s
catalogsource.operators.coreos.com/redhat-marketplace     Red Hat Marketplace    grpc   Red Hat     25h
catalogsource.operators.coreos.com/redhat-operators       Red Hat Operators      grpc   Red Hat     25h

NAME                                       READY   STATUS    RESTARTS   AGE
pod/certified-operators-xzmvb              1/1     Running   0          10h
pod/community-operators-8xv56              1/1     Running   0          160m
pod/ibm-operator-catalog-vhj8x             1/1     Running   0          96s
pod/marketplace-operator-c67ccf5d6-kqs8h   1/1     Running   0          25h
pod/redhat-marketplace-dwtsr               1/1     Running   0          25h
pod/redhat-operators-q797q                 1/1     Running   0          25h
```

# 4. 手順3) Db2 Operatorを導入
OpenshiftのWeb管理画面でOperator HubからDb2を検索します。表示された`IBM Db2`の箱をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700959/90a7d596-7bcc-84c7-d261-ada85e59aba7.png)
次の画面で`Install`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700959/9597cc29-3d3f-d03a-6558-da3e0a0f2988.png)
次の画面でUpdate channelとして`v110508.0`が選択されています。そうでなければ`v110508.0`を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700959/d7fad03e-321d-3dbe-9fc9-f711d8d2bd2d.png)
画面を下にスクロールしてInstallation modeとして`A specific namespace on the cluster`を選択します。Installed Namespaceに手順1で作成したプロジェクト名`ns-db2u`を設定し、`Install`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700959/188d0136-5d57-e5bc-0e13-34f1e8bafcc1.png)
導入が終わると次の画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700959/0c1663ff-9981-b074-7d8a-fe513ab9f6b8.png)


# 4. 手順4) Security Context Constraints (SCC)を作成
SCCを作成してpodの権限を設定します。次のページに載っているSCCの定義をコピーしてファイルに保存します。ファイル名は任意で、本記事では`db2u-scc.yaml`とします。
- [Db2マニュアル：SecurityContextConstraints Requirements](https://www.ibm.com/docs/en/db2/11.5?topic=db2-deploying#deploy_db2_rhos_cluster_11-5-8__title__7)

<details><summary>db2u-scc.yaml</summary><div>

```yaml
kind: SecurityContextConstraints
apiVersion: security.openshift.io/v1
apiGroup: security.openshift.io
metadata:
    name: db2u-scc
allowHostDirVolumePlugin: false
allowHostIPC: false
allowHostNetwork: false
allowHostPID: false
allowHostPorts: false
# privileged container is only needed for the init container that sets the Db2 kernel parameters
allowPrivilegedContainer: true
allowedCapabilities:
- "SYS_RESOURCE"
- "IPC_OWNER"
- "SYS_NICE"
- "CHOWN"
- "DAC_OVERRIDE"
- "FSETID"
- "FOWNER"
- "SETGID"
- "SETUID"
- "SETFCAP"
- "SETPCAP"
- "SYS_CHROOT"
- "KILL"
- "AUDIT_WRITE"
priority: 10
runAsUser:
    type: RunAsAny
seLinuxContext:
    type: MustRunAs
fsGroup:
    type: RunAsAny
supplementalGroups:
    type: RunAsAny
version: v1
```
</div></details>

SCCを作成します。
```
[admin@bastion ~]$ oc apply -f db2u-scc.yaml
securitycontextconstraints.security.openshift.io/db2u-scc created

[admin@bastion ~]$ oc get scc | grep db2
db2u-scc                          true    ["SYS_RESOURCE","IPC_OWNER","SYS_NICE","CHOWN","DAC_OVERRIDE","FSETID","FOWNER","SETGID","SETUID","SETFCAP","SETPCAP","SYS_CHROOT","KILL","AUDIT_WRITE"]   MustRunAs   RunAsAny           RunAsAny    RunAsAny    10           false            ["awsElasticBlockStore","azureDisk","azureFile","cephFS","cinder","configMap","csi","downwardAPI","emptyDir","ephemeral","fc","flexVolume","flocker","gcePersistentDisk","gitRepo","glusterfs","iscsi","nfs","persistentVolumeClaim","photonPersistentDisk","portworxVolume","projected","quobyte","rbd","scaleIO","secret","storageOS","vsphere"]
```

# 4. 手順5) Db2 Warehouseクラスターを作成
Db2uInstanceのカスタムリソース定義(CRD)を次の例から作成します。
- [Db2 Warehouseマニュアル：Example of a complete Db2uInstance CR](https://www.ibm.com/docs/en/db2-warehouse?topic=resource-deploying-db2-warehouse-using-db2uinstance-custom#db2_cluster_api_11-5-7__title__17)

本記事では上のCRDを次のように変更します。
- metadata.namespace
    - nameの値は任意で、本記事では`db2wh1112a`を設定
    - namespaceの値に手順1で作成したプロジェクト名`ns-db2u`を設定
- spec.storage
    - archivelogsのstorageClassNameの値を変更（タイプミスと思われる値を変更）
        - 新：ocs-storagecluster-cephfs
        - 旧：ocs-storagecluster-ceph-rbd
    - activelogsを追加
- spec.version
    - 本記事を作成したとき（2023年11月）の最新版に変更
		- 新：s11.5.8.0-cn3
		- 旧：s11.5.8.0-cn2

変更済みのCRDは次のようになります。
```db2wh1112a.yaml
apiVersion: db2u.databases.ibm.com/v1
kind: Db2uInstance
metadata:
  name: db2wh1112a
  namespace: ns-db2u
spec:
  account:
    privileged: true
  environment:
    authentication:
      ldap:
        enabled: false
    databases:
    - dbConfig:
        APPLHEAPSZ: "25600"
        LOGPRIMARY: "50"
        LOGSECOND: "35"
        STMTHEAP: 51200 AUTOMATIC
      name: BLUDB
    dbType: db2wh
    instance:
      dbmConfig:
        DIAGLEVEL: "2"
      registry:
        DB2_4K_DEVICE_SUPPORT: "ON"
        DB2_ATS_ENABLE: "NO"
        DB2_DISPATCHER_PEEKTIMEOUT: "2"
        DB2_OBJECT_STORAGE_SETTINGS: "OFF"
    partitionConfig:
      dataOnMln0: true
      total: 2
      volumePerPartition: true
  license:
    accept: true
  nodes: 1
  podTemplate:
    db2u:
      resource:
        db2u:
          limits:
            cpu: 4
            memory: 16Gi
  storage:
  - name: meta
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      storageClassName: ocs-storagecluster-cephfs
    type: create
  - name: data
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 100Gi
      storageClassName: ocs-storagecluster-ceph-rbd
    type: template
  - name: backup
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      storageClassName: ocs-storagecluster-cephfs
    type: create
  - name: tempts
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: ocs-storagecluster-ceph-rbd
    type: template
  - name: archivelogs
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 100Gi
      storageClassName: ocs-storagecluster-cephfs
    type: create
  - name: activelogs
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 100Gi
      storageClassName: ocs-storagecluster-ceph-rbd
    type: template
  version: s11.5.8.0-cn3
```
クラスターをデプロイします。
```
[admin@bastion ~]$ oc apply -f db2wh1112a.yaml
db2uinstance.db2u.databases.ibm.com/db2wh1112a created
```
しばらくすると（本記事の環境で約10分後）podがREADYとなります。
```
[admin@bastion ~]$ oc get pods
NAME                                                READY   STATUS      RESTARTS      AGE
c-db2wh1112a-db2u-0                                 1/1     Running     0             10m
c-db2wh1112a-etcd-0                                 1/1     Running     0             10m
c-db2wh1112a-restore-morph-7dtfr                    0/1     Completed   0             98s
c-db2wh1112a-tools-6445674f8d-j7r7n                 1/1     Running     2 (10m ago)   10m
db2u-day2-ops-controller-manager-755bbfd686-s9slq   1/1     Running     0             14m
db2u-operator-manager-6ffc9d848f-kvnpp              1/1     Running     0             14m
```


# 4. 手順6) Db2コマンドライン・プロセッサ(CLP)の動作確認
次のページを参考にしてpod内でシェルを起動し、ユーザーをdb2inst1に変更してCLPを起動します。
- [Db2マニュアル：Exec into the Db2 pod](https://www.ibm.com/docs/en/db2/11.5?topic=db2-exec-into-pod-catalog-partition)

```
[admin@bastion ~]$ oc exec -it c-db2wh1112a-db2u-0 -- bash
Defaulted container "db2u" out of: db2u, instdb (init), init-labels (init), init-kernel (init)

[db2uadm@c-db2wh1112a-db2u-0 /]$ su - db2inst1

[db2inst1@c-db2wh1112a-db2u-0 - Db2U db2inst1]$ db2
(c) Copyright IBM Corporation 1993,2007
Command Line Processor for DB2 Client 11.5.8.0

db2 =>
```
前節（手順5）でクラスターのCRDにおいてパーティション数を2個に設定しました。このキーは`spec.environment.partitionConfig.total`で、値が2となっています。次のコマンドを実行して確認すると、パーティションが2つ存在することがわかります。
```
db2 => list dbpartitionnums
DATABASE PARTITION NUMBER
----------------------------
                           0
                           1
  2 record(s) selected.
```
表を作成し、レコードが2つのパーティションに分散されて保存されることを確認します。
```
db2 => create table お寿司1112e (番号 int, 名前 nvarchar(10), よみがな nvarchar(10))
DB20000I  The SQL command completed successfully.

db2 => describe table お寿司1112e
                                Data type                     Column
Column name                     schema    Data type name      Length     Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
番号                            SYSIBM    INTEGER                      4     0 Yes
名前                            SYSIBM    VARCHAR                     40     0 Yes
よみがな                        SYSIBM    VARCHAR                     40     0 Yes

db2 => insert into お寿司1112e values (1,'鯵','あじ'), (2,'穴子','あなご'), (3,'甘海老','あまえび'), (4,'鮑','あわび'), (5,'烏賊','いか'), (6,'鰯','いわし'), (7,'海胆','うに'), (8,'海老','えび'), (9,'縁側','えんがわ'), (10,'間八','かんぱち'), (11,'金目鯛','きんめだい'), (12,'小鰭','こはだ'), (13,'鯖','さば'), (14,'秋刀魚','さんま'), (15,'鮭','さけ'), (16,'鯛','たい'), (17,'玉子','たまご'), (18,'鰤','ぶり'), (19,'帆立','ほたて'), (20,'鮪','まぐろ')
DB20000I  The SQL command completed successfully.

db2 => select *, dbpartitionnum(番号) as パーティション番号 from お寿司1112e order by 番号

番号        名前                 よみがな             パーティション番号
----------- -------------------- -------------------- ---------------------------
          1 鯵                   あじ                                           0
          2 穴子                 あなご                                         0
          3 甘海老               あまえび                                       0
          4 鮑                   あわび                                         0
          5 烏賊                 いか                                           0
          6 鰯                   いわし                                         1
          7 海胆                 うに                                           0
          8 海老                 えび                                           1
          9 縁側                 えんがわ                                       0
         10 間八                 かんぱち                                       0
         11 金目鯛               きんめだい                                     1
         12 小鰭                 こはだ                                         1
         13 鯖                   さば                                           0
         14 秋刀魚               さんま                                         1
         15 鮭                   さけ                                           1
         16 鯛                   たい                                           1
         17 玉子                 たまご                                         0
         18 鰤                   ぶり                                           0
         19 帆立                 ほたて                                         0
         20 鮪                   まぐろ                                         0
  20 record(s) selected.
```


# 5. エラー例) Podが作成されない
Db2オペレーターとDb2 Warehouseクラスターのnamespaceが異なる場合、私が試した範囲ではDb2 Warehouseのpodが生成されませんでした。次のページに複数のnamespaceを登録する方法が載っていますが、この方法に従ったつもりでもpodは生成されませんでした。
- [Db2マニュアル：Watching multiple namespaces from a single namespace installation](https://www.ibm.com/docs/en/db2/11.5?topic=db2-watching-multiple-namespaces-from-one-namespace)

この問題に対して本記事ではDb2オペレーターとDb2 Warehouseクラスターを同じnamespaceに導入して回避しました。手順3がそのようになっています。


# 6. 参考資料
- Db2マニュアル
    - What's new in Db2 11.5.4 for Red Hat OpenShift (Db2 Universal container)
    https://www.ibm.com/docs/en/db2/11.5?topic=1154-whats-new-in-db2

	- Partitioned database with symmetric multiprocessor environment（SMP、論理パーティション2個の図）
	https://www.ibm.com/docs/en/db2/11.5?topic=environments-database-partition-processor#d24742e277

    - Db2 database product editions and Db2 offerings（Community Editionの説明）
    https://www.ibm.com/docs/en/db2/11.5?topic=editions-db2-database-product-offerings

    - Db2 for Red Hat OpenShift and Kubernetes
    https://www.ibm.com/docs/en/db2/11.5?topic=deployments-db2-rhos-k8s

    - Installing the Db2 Operator from the IBM Operator Catalog
    https://www.ibm.com/docs/en/db2/11.5?topic=operator-installing-from-catalog

    - SecurityContextConstraints Requirements
    https://www.ibm.com/docs/en/db2/11.5?topic=db2-deploying#deploy_db2_rhos_cluster_11-5-8__title__7

    - Exec into the Db2 pod
    https://www.ibm.com/docs/en/db2/11.5?topic=db2-exec-into-pod-catalog-partition

    - Watching multiple namespaces from a single namespace installation
    https://www.ibm.com/docs/en/db2/11.5?topic=db2-watching-multiple-namespaces-from-one-namespace

- Db2 Warehouseマニュアル
    - Db2 Warehouse on Red Hat OpenShift and Kubernetes
    https://www.ibm.com/docs/en/db2-warehouse?topic=db2-warehouse-rhos-k8s

    - Deploying Db2 Warehouse using the Db2uInstance custom resource
    https://www.ibm.com/docs/en/db2-warehouse?topic=resource-deploying-db2-warehouse-using-db2uinstance-custom

    - Example of a complete Db2uInstance CR
    https://www.ibm.com/docs/en/db2-warehouse?topic=resource-deploying-db2-warehouse-using-db2uinstance-custom#db2_cluster_api_11-5-7__title__17

- Qiita記事
    - ROKSへのDb2 11.5.8導入手順/ログ <<分散ストレージ構成>>
    https://qiita.com/mi-kana/items/82ad881172b715b73ffe

    - Db2uInstance(11.5.8-cn2)デプロイYaml
    https://qiita.com/mi-kana/items/1eca7f1a737ef4882637