AWS/OCIではgrid infrastructure構築不可

grid infrastructureをGIと略します。
クラウドでの構築事例がないので検証してみました。
OracleRAC, SEHAの構築にはGIが必須ですが、AWS(EC2)/OCI(Compute)ではその仕様上構築ができません。
今回はWindowsServerで試しましたが、OS依存ではないところ(各クラウドサービスの仕様)で引っかかったため、RHELなどでも同様と思われます。

# AWSで不可な理由
  
- EC2にサブネットを2つ持てないため
    - GI要件で、2つ以上の異なるネットワークアドレスのIPが必要だが、AWSではEC2は1つのサブネット上に構築する仕様。そのため、EC2が複数のサブネットにまたがったり、構築されているサブネット以外のサブネットのネットワークインターフェースを追加することはできない
        - というGIの制限はリファレンスではあるが、試しにネットワークインターフェースを追加して、2つのNICを持たせて(どちらも同じサブネット)、GIのインストールをしようとすると、パブリック/プライベートおよびASMの各サブネットを各ネットワークインターフェースに割り当てるところで、パブリック/プライベートおよびASMに割り当てようとしているネットワークサブネットが同じです、といったエラーメッセ－ジで先に進めない
- また、EC2上にvirtual boxやHyper-Vといった仮想サーバを立てることはできない。その制約から、virtual boxをインストールして仮想マシンを作成してみると、32bitのマシンしか選択できない。Hyper-Vは無効にされている。(BareMetalならできるのかもしれませんが試してません)

# OCIで不可な理由
- 仕様上マルチキャスト/ブロードキャストが通らないため
    - Computeではネットワークアドレスの異なる別サブネットのVNICを追加できるため、パブリック/プライベートおよびASM用のNIC割り当ての先まで進め、GIのインストール開始を走らせることができた。しかし、インストール中に、プライベートサブネットでマルチキャストとブロードキャストができないエラーがでてインストールがコケた。

```
Failures were encountered during execution of CVU verification request "stage -post crsinst".
Verifying Multicast or broadcast check ...FAILED
node2: PRVG-11352 : Interface "10.0.2.24" on node "node2" is not able to
       communicate with interface "10.0.2.24" on node "node2" with broadcast
       address "255.255.255.255"
node2: PRVG-11352 : Interface "10.0.2.209" on node "node1" is not able to
       communicate with interface "10.0.2.24" on node "node2" with broadcast
       address "255.255.255.255"
node1: PRVG-11138 : Interface "priv" on node "node2" is not able to communicate
       with interface "priv" on node "node1" over multicast group "224.0.0.251"
node1: PRVG-11138 : Interface "priv" on node "node1" is not able to communicate
       with interface "priv" on node "node1" over multicast group "224.0.0.251"
node1: PRVG-11138 : Interface "priv" on node "node2" is not able to communicate
       with interface "priv" on node "node1" over multicast group "230.0.1.0"
node1: PRVG-11138 : Interface "priv" on node "node1" is not able to communicate
       with interface "priv" on node "node1" over multicast group "230.0.1.0"
node1: PRVG-11352 : Interface "10.0.2.24" on node "node2" is not able to
       communicate with interface "10.0.2.209" on node "node1" with broadcast
       address "255.255.255.255"
node1: PRVG-11352 : Interface "10.0.2.209" on node "node1" is not able to
       communicate with interface "10.0.2.209" on node "node1" with broadcast
       address "255.255.255.255"
node1: PRVG-11138 : Interface "pub" on node "node2" is not able to communicate
       with interface "pub" on node "node1" over multicast group "224.0.0.251"
node1: PRVG-11138 : Interface "pub" on node "node1" is not able to communicate
       with interface "pub" on node "node1" over multicast group "224.0.0.251"
Verifying Single Client Access Name (SCAN) ...WARNING
node2: PRVG-11368 : A SCAN is recommended to resolve to "3" or more IP
       addresses, but SCAN "node-cluster-scan" resolves to only "/10.0.1.233"
node1: PRVG-11368 : A SCAN is recommended to resolve to "3" or more IP
       addresses, but SCAN "node-cluster-scan" resolves to only "/10.0.1.233"
```

- また、AWS同様、仮想化サーバがサポートされていないため、VirtualBoxで仮想マシン作成時に64bitを選択することができなく、Hyper-vも無効になっている。(こちらもBareMetalならできるのかもしれませんが試してません)

# あとがき

AWS/OCIどちらも、共有ディスクの仕組み(AWSではEBS Multi Attach, OCIではブロックボリューム共有) があるのと、NIC/IPも複数持てるため、もしかしたらと思ったのですが、やはりGIの構築要件に適合することができませんでした。
そのため、GI(OracleRAC/SEHA)の構築/検証には今まで通りオンプレにESXi/Hyper-V/virtual box等仮想環境を立てるなどして行う必要がありそうです。
今回Azureは検証していません。Azureで、共有ディスク/異なるサブネットのNIC追加/プライベートサブネットでのマルチキャストとブロードキャスト等GIの要件を満たすことができれば、構築可能かと思います。

# めも
- Active Directoryは立てず、VIPやSCANの名前解決は各ノードのhostsで行った
    - OCIではこんな感じ(各ノードで同じ設定)
    - node1, node2は各ノードのホスト名

```
10.0.1.132	node1              ※node1: Primary VNIC
10.0.1.201	node1-vip          ※node1: Primary VNICのセカンダリIP
10.0.1.21	node2              ※node2: Primary VNIC
10.0.1.22	node2-vip          ※node2: Primary VNICのセカンダリIP
10.0.1.233	node-cluster-scan  ※node1: Primary VNICのセカンダリIP

10.0.2.209	node1-priv         ※node1: 追加したVNICのIP
10.0.2.24	node2-priv         ※node2: 追加したVNICのIP
```

- OCIで追加したVNICを有効にするには、コンパネのネットワークアダプタで対象のネットワークインターフェースを有効化したあと、OCIで提供されているPowerShellスクリプトを実行する ```secondary_vnic_windows_configure.ps1```
- OCIのWindowsServerではインスタンス作成時にホスト名を指定しても、実際のコンピュータに適用されない(無視されて、instance-202107のような感じになる)
    - GIではホスト名で通信できる必要があるので、ホスト名を正しく設定する
    - WindowsServerではWindows標準の手順で問題なかった(システムのプロパティからコンピュータ名を変更して再起動)。リファレンスではLinuxの手順しか存在しないので、本当に正しいかは不明
    - LinuxではOS標準の設定に加え、/etc/oci-hostname.confを設定する必要がある

- AWSではMulti AttachしたEBSは自動的にディスクの管理で認識される。OCIではiSCSIイニシエータの設定画面で認識設定をする。
    - 認識後、簡単なDISKPARTまたはPowerShellコマンドでGIで利用可能なRAWデバイスとしてフォーマットできる(後述の参考サイトを参考にさせていただきました)

```
Get-Disk | Sort-Object Number
$Disk = Get-Disk -Number 1
$Disk | Initialize-Disk -PartitionStyle MBR
$Disk | New-Partition -MbrType Extended -UseMaximumSize
$Disk | New-Partition -UseMaximumSize
```

- クラスタノード選択画面でnode2を追加して進むときにユーザー等価チェックのエラーがでるときは、インストールユーザでのnode間の```net use \\nodex\c$```がうまくできていないので解決が必要。インストールユーザ以外の権限(アカウント)で張ってもだめ。
- GIインストーラでASMディスク作成画面でRAWデバイスを検出するためには、ディスクをスタンプをクリックして対象のRAWデバイスに対してスタンプ付けを行う必要がある
- 18c以降だとインストールバグがあるので対応必須 ```PRVF-0002 : COULD NOT RETRIEVE LOCAL NODE NAME``` (インストーラに含まれる各バッチをエディタで開いて直す)
- GIインストールエラーの切り分けで、vcruntime140.dll不足でCVUが実行できないって言ってたのでVC2019の再配布用パッケージ(VC_redist.x64.exe, 64bitの方)をインストールしてみたけど、あれは意味があったのだろうか(dllエラーは消えたけど、それが重要だったのかどうか不明。あとCVU(-verifyオプション)手動で実行してみたけど動かない。これWindowsで単体で使えるんだろうか)
- なんだかんだactive directory立てちゃったほうが楽
- OCIのDBサービスはRACなので、マネージドであるDBサービス内ではマルチキャスト/ブロードキャストが許可されていると推測
- AWSでも検索すると非公式でOracleRACのAMIとかあるんだけどこれはどうやって動いてるんだろう

# 参考
**OCI よくある質問**
https://www.oracle.com/jp/cloud/networking/virtual-cloud-network-faq.html
> VCN内でのIPマルチキャストまたはブロードキャストはサポートされていますか？
> いいえ、今のところサポートしていません。

**参考にさせていただいたサイト**
https://blog.shibata.tech/entry/2015/09/17/221849