[Oracle Cloud] DBaaS (VM) を使ってみる

# はじめに
DBaaSを触れそうなOracle Cloudの案件があるため、どんな感じになるか見てみた。

# 作る
作り方は大きく2つ。コンソールから画面でポチポチか、oci cliを使うか。
oci cliのほうが指定が大変なのだが、(現時点で) oci cliのほうが優れてそうな点を一つ発見。DBユニーク名を指定できる!
画面でポチポチの場合、DBユニーク名を指定できそうな画面がない。そのまま作ると、ランダムな文字列がDB名の後ろに付与された。

・oci cliで--db-unique-name を指定した場合

```
$ srvctl config database
ora19c ★ 指定した値がそのままDBユニーク名になる

$ crsctl stat res -t -w "TYPE == ora.database.type"
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details       
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ora19c.db
      1        ONLINE  ONLINE       db19c                    Open,HOME=/u01/app/o
                                                             racle/product/19.0.0
                                                             .0/dbhome_1,STABLE
--------------------------------------------------------------------------------
```

・画面でポチポチした場合

```
$ srvctl config database
db19c2_nrt148 ★ _xxxの文字が自動で付与される(DB名はdb19c2で指定)

$ crsctl stat res -t -w "TYPE == ora.database.type"
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details       
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.db19c2_nrt148.db ★ DBユニーク名でクラスタ登録される
      1        ONLINE  ONLINE       db19c2                   Open,HOME=/u01/app/o
                                                             racle/product/19.0.0
                                                             .0/dbhome_1,STABLE
--------------------------------------------------------------------------------

```

# 構成
構成で気づいたことをざっくばらんに。

全体的に、ODA(Oracle Database Appliance)のSMモデルに似た構成。

## OS設定関連
### sshd_config
Computeインスタンスを普通に作成した場合と違うところ。以下のディレクティブが追加されてる。

```
# grep -v ^# /etc/ssh/sshd_config |grep -v ^$
PermitRootLogin no
ClientAliveInterval 900
ClientAliveCountMax 0
AllowUsers opc 
UseDNS no
AllowUsers grid
AllowUsers oracle
```

特に、ClientAliveCountMaxとClientAliveIntervalの設定が追加されていることにより、15分間何も操作しないと、sshの接続が切れてしまう。

接続切れると困るような場合は、ssh接続時に以下のようにKeepAliveを15分以内(ClientAliveInterval 以下の値)に送信するようにオプションをつけとくとよさそう

```
$ ssh -o ServerAliveInterval=60 opc@db19c.xxx.xxx.xx
```

### ntp
OEL7ベースではあるが、chronyではなくてntpがインストールされて動作している

普通のコンピュートインスタンスの場合

```
# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 169.254.169.254               2  10   377   437  -3280ns[-6289ns] +/-   20ms
```

DBaaS(VM)インスタンスの場合

```
#  chronyc sources
-bash: chronyc: command not found

# ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 162.159.200.1   .STEP.          16 u    - 1024    0    0.000    0.000   0.000
 195.154.223.198 .STEP.          16 u    - 1024    0    0.000    0.000   0.000
 45.63.54.13     .STEP.          16 u    - 1024    0    0.000    0.000   0.000
 178.79.152.182  .STEP.          16 u    - 1024    0    0.000    0.000   0.000
*169.254.169.254 192.168.0.151    2 u  412 1024  377    0.407    0.073   0.155
※169.254.169.254以外の時刻ソースは、デフォルトのx.rhel.pool.ntp.org

# ps -ef |grep ntp |grep -v grep
ntp      15315     1  0 Feb06 ?        00:00:00 /usr/sbin/ntpd -u ntp:ntp -g
stepへの切り替え閾値を変更するオプション(-x)はついてないようだ
```

### カーネルパラメータ
チューニングされてるパラメータを見ると面白い。インストールの前提パラメータ以外にもチューニングされている。

```
# grep -v ^# /etc/sysctl.d/* |grep -v ^$
…
/etc/sysctl.d/99-sysctl.conf:fs.suid_dumpable=1
/etc/sysctl.d/99-sysctl.conf:kernel.core_pattern=core.%e.%p
/etc/sysctl.d/99-sysctl.conf:net.ipv4.conf.all.arp_announce=2
/etc/sysctl.d/99-sysctl.conf:net.ipv4.conf.all.arp_ignore=1
/etc/sysctl.d/99-sysctl.conf:net.ipv4.conf.all.arp_filter=1
/etc/sysctl.d/99-sysctl.conf:net.core.rmem_max=134217728
/etc/sysctl.d/99-sysctl.conf:net.core.wmem_max=134217728
/etc/sysctl.d/99-sysctl.conf:net.ipv4.tcp_rmem=4096 87380 134217728
/etc/sysctl.d/99-sysctl.conf:net.ipv4.tcp_wmem=4096 65536 134217728
/etc/sysctl.d/99-sysctl.conf:net.core.netdev_max_backlog=300000
/etc/sysctl.d/99-sysctl.conf:net.ipv4.tcp_moderate_rcvbuf=1
/etc/sysctl.d/99-sysctl.conf:net.ipv6.conf.all.disable_ipv6 = 1
/etc/sysctl.d/99-sysctl.conf:net.ipv6.conf.default.disable_ipv6 = 1
/etc/sysctl.d/99-sysctl.conf:vm.min_free_kbytes=524288
/etc/sysctl.d/99-sysctl.conf:net.ipv4.conf.all.accept_redirects = 0
/etc/sysctl.d/99-sysctl.conf:net.ipv4.conf.default.accept_redirects = 0
/etc/sysctl.d/99-sysctl.conf:kernel.pid_max = 99999
/etc/sysctl.d/99-sysctl.conf:vm.nr_hugepages=4032

```

SGAを増やしたいは、nr_hugepagesに注意が必要そう。nr_hugepagesも一緒に増やす必要がある。
※上記は、ShapeにVM.Standard2.1を指定した場合の値

### OS Watcherが動いてる
ODAと同じように、/etc/rc.localから起動していると思ったら、

```
# grep -i osw /etc/rc.local 
runuser root -c "/opt/oracle/oak/oswbb/startOSWbb.sh 10 504 gzip /opt/oracle/oak/oswbb/archive " 1>/dev/null
```

実際に動いているプロセスは、tfaから起動しているぽい

```
# ps -ef |grep -i osw
grid     44809     1  0 13:02 ?        00:00:12 /bin/sh ./OSWatcher.sh 30 48 NONE /u01/app/grid/tfa/repository/suptools/db19c/oswbb/grid/archive
grid     45215 44809  0 13:02 ?        00:00:02 /bin/sh ./OSWatcherFM.sh 48 /u01/app/grid/tfa/repository/suptools/db19c/oswbb/grid/archive
```

なんで？と思い、/etc/rc.localのコマンドを実行してみて納得

```
# runuser root -c "/opt/oracle/oak/oswbb/startOSWbb.sh 10 504 gzip /opt/oracle/oak/oswbb/archive "
bash: /opt/oracle/oak/oswbb/startOSWbb.sh: Permission denied

# ll /opt/oracle/oak/oswbb/startOSWbb.sh
-rw-r--r-- 1 root root 2574 Jul 15  2019 /opt/oracle/oak/oswbb/startOSWbb.sh

# grep "Permission denied" /var/log/messages 
Feb  5 21:58:38 localhost rc.local: bash: /opt/oracle/oak/oswbb/startOSWbb.sh: Permission denied

# tfactl toolstatus
…
.------------------------------------------------------------------.
|                    TOOLS STATUS - HOST : db19c                   |
+----------------------+--------------+--------------+-------------+
| Tool Type            | Tool         | Version      | Status      |
+----------------------+--------------+--------------+-------------+
| Development Tools    | orachk       |   12.2.0.1.3 | DEPLOYED    |
+----------------------+--------------+--------------+-------------+
| Support Tools Bundle | oswbb        |        8.1.2 | RUNNING     |★
|                      | prw          | 12.1.13.11.4 | NOT RUNNING |
…
```

### dcs-agent

ODAと同じように、dcs-agentが起動している。

```
# systemctl status initdcsagent
● initdcsagent.service - Oracle dcs-agent startup
   Loaded: loaded (/etc/systemd/system/initdcsagent.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-02-06 14:10:52 JST; 5h 53min ago
 Main PID: 43233 (sh)
   CGroup: /system.slice/initdcsagent.service
           ├─43233 /bin/sh -c /bin/java -Xms128m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+DisableExplicitGC -XX:ParallelGCThr...
           └─43234 /bin/java -Xms128m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+DisableExplicitGC -XX:ParallelGCThreads=4 -XX:...

Feb 06 14:10:52 db19c systemd[1]: Started Oracle dcs-agent startup.

ODAと同じならば、dbcliコマンドとかでジョブを実行したときに、実行の主体となっているのがこいつになると思われる。まれによくハングしてたりするんだよな、、こいつ。
```
### firewall
通常のコンピュートインスタンスはfirewalldが起動しているが、DBaaSのインスタンスは、iptablesによって設定されており、firewalldはインストールすらされていない

```
# rpm -q firewalld
package firewalld is not installed

# iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
1017K 4143M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
   66  5544 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
48243   30M ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
   43  8164 ACCEPT     all  --  ens4   *       0.0.0.0/0            0.0.0.0/0           
   13   780 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:1521 /* Required for access to Database Listener, Do not remove or modify.  */
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:6200 /* This rule is recommended and enables the Oracle Notification Services (ONS) to communicate about Fast Application Notification (FAN) events.  */
   17  1020 ACCEPT     tcp  --  *      *       169.254.0.0/16       0.0.0.0/0            state NEW tcp dpt:7070 /* Required for instance management by the Database Service, Do not remove or modify.  */
★ 169.254.0.0/16からdcs-agentへの通信許可
   16   960 ACCEPT     tcp  --  *      *       169.254.0.0/16       0.0.0.0/0            state NEW tcp dpt:7060 /* Required for instance management by the Database Service, Do not remove or modify.  */
★ 169.254.0.0/16からdcs-controllerへの通信許可
    0     0 ACCEPT     tcp  --  *      *       169.254.0.0/16       0.0.0.0/0            state NEW tcp dpt:22 /* Required for instance management by the Database Service, Do not remove or modify.  */
   69 37289 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

```

## GIの構成
ディスクの格納先にASMを選んだ場合、シングルデータベースでもGIがインストールされる。
OracleインスタンスやリスナーがORA-600などで落ちたときにリスタートしてくれるので、少しでも可用性をあげたいならASMのほうがよさそう。

RestartではなくシングルRACのような変わった構成。vipも存在しているが、物理IPと同じアドレスで定義されてる。※シングルだから
無意味に192.168.16.0/24のネットワーク(ens4)も存在してASM Listenerも起動してる。ODAはよく触ってるので見慣れた感じはするが、初めて触る人は戸惑いそう。

```
$ ip -f inet -o addr 
  1: lo    inet 127.0.0.1/8 scope host lo\  ///
★2: ens3    inet 10.0.2.17/24 brd 10.0.2.255 scope global dynamic ens3\ ///
  3: ens4    inet 192.168.16.18/24 brd 192.168.16.255 scope global ens4\ ///

$  srvctl config vip -node $(hostname -s)
VIP exists: network number 1, hosting node db19c2
VIP Name: db19c2-vip.xxx.xxx.xx.xx
VIP IPv4 Address: 10.0.2.17 ★ 物理IPと同じ
VIP IPv6 Address: 
VIP is enabled. ★
…
```

scanも(同じIPで)構成されているが無効化されてる。(※シングルだから)

```
$  srvctl config scan
SCAN name: db19c2-scan, Network: 1
Subnet IPv4: 10.0.2.0/255.255.255.0/ens3, static ★ 物理IPと同じ
Subnet IPv6: 
SCAN 1 IPv4 VIP: 10.0.2.17
SCAN VIP is disabled. ★
```

## ディスク構成

コンソールでは、ストレージの容量を以下の画面で指定する。

![Db01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/82b2bffc-015f-4758-e6d3-d2b6f5d877c4.png)

この「使用可能なストレージ(GB)」と、「合計ストレージの容量(GB)」の差分は何なのかについて調べた。

上記画面のように構成すると、物理ディスクが以下のように構成される。
・指定したサイズの1/4のサイズのディスクが4本付与されて、DATAディスクグループを構成
・指定したサイズの1/4のサイズのディスクが4本付与されて、RECOディスクグループを構成
・インストールバイナリ用に200GB (/u01ファイルシステム)

```
# lsblk
NAME                        MAJ:MIN    RM  SIZE RO TYPE MOUNTPOINT
sda                           8:0       0   58G  0 disk 
|-sda1                        8:1       0  486M  0 part /boot/efi
|-sda2                        8:2       0  1.4G  0 part /boot
`-sda3                        8:3       0 52.2G  0 part 
  |-VolGroupSys4-LogVolRoot 249:0       0   35G  0 lvm  /
  `-VolGroupSys4-LogVolSwap 249:1       0   16G  0 lvm  [SWAP]
sdb                           8:16      0   64G  0 disk ★DATA DG用
sdc                           8:32      0   64G  0 disk ★DATA DG用 
sdd                           8:48      0   64G  0 disk ★DATA DG用
sde                           8:64      0   64G  0 disk ★DATA DG用
sdf                           8:80      0   64G  0 disk ★RECO DG用
sdg                           8:96      0   64G  0 disk ★RECO DG用
sdh                           8:112     0   64G  0 disk ★RECO DG用
sdi                           8:128     0   64G  0 disk ★RECO DG用
sdj                           8:144     0  200G  0 disk /u01 ★インストールバイナリ用
asm!commonstore-237         248:121345  0    5G  0 disk /opt/oracle/dcs/commonstore

※2020.09に確認したところ、ローカルディスクサイズが変わったみたいです。
===========================================
# lsblk
NAME                        MAJ:MIN    RM  SIZE RO TYPE MOUNTPOINT
sda                           8:0       0   68G  0 disk ★
|-sda1                        8:1       0  486M  0 part /boot/efi
|-sda2                        8:2       0  1.4G  0 part /boot
`-sda3                        8:3       0 61.5G  0 part 
  |-VolGroupSys0-LogVolRoot 249:0       0   45G  0 lvm  /
  `-VolGroupSys0-LogVolSwap 249:1       0   16G  0 lvm  [SWAP]
…
===========================================

$  asmcmd lsdg
State    Type    Rebal  Sector  Logical_Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
MOUNTED  EXTERN  N         512             512   4096  4194304    262144   253532                0          253532              0             Y  DATA/
MOUNTED  EXTERN  N         512             512   4096  4194304    262144   258524                0          258524              0             N  RECO/
↑ 外部冗長性

$ asmcmd lsdsk -p
Group_Num  Disk_Num      Incarn  Mount_Stat  Header_Stat  Mode_Stat  State   Path
        1         2  4042417267  CACHED      MEMBER       ONLINE     NORMAL  /dev/DATADISK1
        1         1  4042417268  CACHED      MEMBER       ONLINE     NORMAL  /dev/DATADISK2
        1         0  4042417266  CACHED      MEMBER       ONLINE     NORMAL  /dev/DATADISK3
        1         3  4042417265  CACHED      MEMBER       ONLINE     NORMAL  /dev/DATADISK4
        2         0  4042417283  CACHED      MEMBER       ONLINE     NORMAL  /dev/RECODISK1
        2         1  4042417282  CACHED      MEMBER       ONLINE     NORMAL  /dev/RECODISK2
        2         2  4042417281  CACHED      MEMBER       ONLINE     NORMAL  /dev/RECODISK3
        2         3  4042417284  CACHED      MEMBER       ONLINE     NORMAL  /dev/RECODISK4

$ ll /dev/*DISK*
lrwxrwxrwx 1 root root 3 Feb  6 19:04 /dev/DATADISK1 -> sdb
lrwxrwxrwx 1 root root 3 Feb  6 19:04 /dev/DATADISK2 -> sdc
lrwxrwxrwx 1 root root 3 Feb  6 19:04 /dev/DATADISK3 -> sdd
lrwxrwxrwx 1 root root 3 Feb  6 19:04 /dev/DATADISK4 -> sde
lrwxrwxrwx 1 root root 3 Feb  6 19:03 /dev/RECODISK1 -> sdf
lrwxrwxrwx 1 root root 3 Feb  6 19:03 /dev/RECODISK2 -> sdg
lrwxrwxrwx 1 root root 3 Feb  6 19:03 /dev/RECODISK3 -> sdh
lrwxrwxrwx 1 root root 3 Feb  6 19:04 /dev/RECODISK4 -> sdi

$ cat /etc/udev/rules.d/70-names.rules 
KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="360c68fxxx", SYMLINK+="DATADISK1",  OWNER="grid",  GROUP="asmadmin",  MODE="0660"
KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="360f84fxxx", SYMLINK+="DATADISK2",  OWNER="grid",  GROUP="asmadmin",  MODE="0660"
KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="3606a79xxx", SYMLINK+="DATADISK3",  OWNER="grid",  GROUP="asmadmin",  MODE="0660"
KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="360a021xxx", SYMLINK+="DATADISK4",  OWNER="grid",  GROUP="asmadmin",  MODE="0660"
KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="360fa8cxxx", SYMLINK+="RECODISK1",  OWNER="grid",  GROUP="asmadmin",  MODE="0660"
KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="360d01xxx", SYMLINK+="RECODISK2",  OWNER="grid",  GROUP="asmadmin",  MODE="0660"
KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="360298xxx", SYMLINK+="RECODISK3",  OWNER="grid",  GROUP="asmadmin",  MODE="0660"
KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="360877xxx", SYMLINK+="RECODISK4",  OWNER="grid",  GROUP="asmadmin",  MODE="0660"
KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="360f41xxx", SYMLINK+="localdisk",  OWNER="grid",  GROUP="asmadmin",  MODE="0660"
```

DATAから、ACFS用のボリュームが切り出されて、ACFS(/opt/oracle/dcs/commonstore)が作成される。ここには、walletなどが格納されている。

```
$ ll /opt/oracle/dcs/commonstore/wallets/tde/*/
total 28
-rw------- 1 oracle asmadmin 5864 Feb  6 13:41 cwallet.sso
-rw------- 1 oracle asmadmin 5819 Feb  6 13:40 ewallet.p12
-rw------- 1 oracle asmadmin 2555 Feb  6 13:40 ewallet_2020020604405730_defaultTag.p12

$ asmcmd volinfo -G DATA -a
Diskgroup Name: DATA

         Volume Name: COMMONSTORE
         Volume Device: /dev/asm/commonstore-237
         State: ENABLED
         Size (MB): 5120
         Resize Unit (MB): 64
         Redundancy: UNPROT
         Stripe Columns: 8
         Stripe Width (K): 1024
         Usage: ACFS
         Mountpath: /opt/oracle/dcs/commonstore 

# acfsutil info fs /opt/oracle/dcs/commonstore/
/opt/oracle/dcs/commonstore/
    ACFS Version: 19.0.0.0.0
    on-disk version:       49.0
    compatible.advm:       19.0.0.0.0
    ACFS compatibility:    19.0.0.0.0
    flags:        MountPoint,Available,KiloSnap
    creation time:   Thu Feb  6 15:30:16 2020
    mount time:      Thu Feb  6 19:57:24 2020
    mount sequence number: 0
    number of nodes:       1
    allocation unit:       4096
    metadata block size:   4096
    volumes:      1
    total size:   5368709120  (   5.00 GB )
    total free:   4964773888  (   4.62 GB )
    file entry table allocation: 8650752
    primary volume: /dev/asm/commonstore-125
        label:                 
        state:                 Available
        major, minor:          248, 64001
        logical sector size:   512
        size:                  5368709120  (   5.00 GB )
        free:                  4964773888  (   4.62 GB )
        metadata read I/O count:         2112
        metadata write I/O count:        10
        total metadata bytes read:       8650752  (   8.25 MB )
        total metadata bytes written:    40960  (  40.00 KB )
        ADVM diskgroup:        DATA
        ADVM resize increment: 67108864
        ADVM redundancy:       unprotected
        ADVM stripe columns:   8
        ADVM stripe width:     1048576
    number of snapshots:  0
    snapshot space usage: 0  ( 0.00 )
    replication status: DISABLED
    compression status: DISABLED
```