Standard Edition高可用性(SEHA)環境の構築

SE RACが使用できなくなった代わりに、Standard EditionでもOracleの標準機能でクラスタリングを実現するための仕組みが、19.7 で追加されている。

Standard Edition高可用性について (oracle.com)

Oracle Databaseの作成および構成

少し癖のある方法で構成する必要があるのでメモとして残しておく。

OS側の事前準備

ネットワーク構成を決める

ネットワーク構成の要件はRACとまったく一緒。パブリックネットワーク、VIP、SCAN、プライベートネットワークのIPアドレスとホスト名を決めておく必要がある。

今回は以下のような構成としている。

ノード1

種別ホスト名IPアドレス
パブリックsehan1.dn.home192.168.100.67
VIPsehan1-vip.dn.home192.168.100.68
プライベート192.168.1.67

SCAN

ホスト名IPアドレス
sehascan.dn.home192.168.100.71
同上192.168.100.72
同上192.168.100.73

ノード2

種別ホスト名IPアドレス
パブリックsehan2.dn.home192.168.100.69
VIPsehan2-vip.dn.home192.168.100.70
プライベート192.168.1.69

DNSには上記名前解決が行えるように適宜設定を行い、各ノードにパブリックとプライベートのIPアドレスを固定で設定する。

ファイアウォールの停止

# systemctl stop firewalld
# systemctl disable firewalld

Preinstallation RPM の実行

Preinstallation RPMをインストールして、動作要件を自動で設定する。

# yum install oracle-database-preinstall-19c.x86_64

ユーザ・グループの作成と修正

Preinstallation RPMではgridユーザは作られないので別途作成し、必要なグループも追加する。

# useradd -u 54322 -g oinstall -G dba grid
# groupadd -g 54327 asmdba
# groupadd -g 54328 asmoper
# groupadd -g 54329 asmadmin
# usermod -g oinstall -G asmdba,asmoper,asmadmin grid
# usermod -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba,asmdba oracle

パスワードの設定。

# passwd grid
# passwd oracle

インストール先のディレクトリ作成

# mkdir -p /u01/app/19.0.0/grid
# mkdir -p /u01/app/grid
# mkdir -p /u01/app/oracle
# chown -R grid:oinstall /u01
# chown oracle:oinstall /u01/app/oracle
# chmod -R 775 /u01/

リソース制限の設定

Preinstallation RPMを実行すると、oracleユーザに対するリソース制限は行われているが、gridユーザに対しては未設定のため、以下を追加する。

/etc/security/limits.d/oracle-database-preinstall-19c.conf

grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536
grid soft stack 10240
grid hard stack 32768

Grid Infrastructureのインストール

Grid Infrastructureのインストール手順はRACの場合とまったく一緒。

必要なファイルの展開(gridユーザ)

Grid Infrastructureのzipファイルを展開する。

$ unzip -d /u01/app/19.0.0/grid /tmp/V982068-01.zip

RUを適用するため、OPatchを最新のものに置き換える。

$ mv /u01/app/19.0.0/grid/OPatch /u01/app/19.0.0/grid/OPatch_org
$ unzip -d /u01/app/19.0.0/grid /tmp/p6880880_190000_Linux-x86-64.zip

RU 19.16を展開する

$ unzip -d /tmp/RU16 /tmp/p34130714_190000_Linux-x86-64.zip

ASMディスクの準備

必要なディスク構成もRACと同等で、クラスタを構成するすべてのノードからアクセス可能な共有ディスクを用意する必要がある。

今回は共有ディスクがすでに両ノードに接続されている前提。ASMFDを使うためのラベル付けを行う。

ディスク構成は以下。今回は検証用に外部冗長性で構成するため、デバイスは1つずつとなっている。

用途デバイスラベル
OCR・投票ディスク用/dev/sdcOCR
データファイル格納用/dev/sddDATA
# export ORACLE_HOME=/u01/app/19.0.0/grid
# export ORACLE_BASE=/tmp
# $ORACLE_HOME/bin/asmcmd afd_label OCR /dev/sdc --init
# $ORACLE_HOME/bin/asmcmd afd_label DATA /dev/sdd --init

インストーラの実行(gridユーザ)

RUの適用とインストールの実行を同時に行う。

$ /u01/app/19.0.0/grid/gridSetup.sh -applyRU /tmp/RU16/34130714

RUの適用が成功すると、OUIでインストーラが起動する。

「新しいクラスタ用のOracle Grid Infrastructureの構成」を選択。

「Oracle スタンドアロン・クラスタの構成」を選択。

SCAN名を事前にDNSに登録したものに変更して次へ。

[追加]ボタンでクラスタを構成するノードを指定し、追加する。

[SSH接続]ボタンを押して、ノード間でSSH接続ができるようにgridユーザのパスワードを指定、「設定」ボタンを押す。

ネットワークインターフェースの選択画面。プライベートネットワークに使用するインターフェースが適切に選択されていることを確認する。

ASMを使うのでそのままの設定で進める。

存在意義のわからないGIMRは構成してはならない。経験上、これがあると余計なメモリを消費する、SYSAUXが肥大化してディスクグループを圧迫する、パスワードの期限切れでパッチ適用時に障害を起こすなど、安定稼働を阻害する要素が多い割に役に立ったことはなく、百害あって一利なし。

ディスクグループの選択画面で、「Error 49802 initializing ADR」というメッセージが表示されて候補ディスクが表示されない場合がある。

これは、/u01/app/oracle 配下に root が所有する diag というディレクトリが作られていることが原因。このディレクトリを削除してから一度前の画面に戻り、再度この画面に進めば候補ディスクが表示されるようになる。

[root@sehan1 oracle]# ls -l /u01/app/oracle
合計 0
drwxrwxr-x. 4 root root 32  8月 27 22:39 diag
[root@sehan1 oracle]# rm -rf diag/

OCRと投票ディスクの格納先ディスクグループを選択する。先にラベル付けしたディスクを選択する。ディスクグループ名は「OCR」としている。

ASMインスタンスの管理者パスワードを設定。

この辺りはハードウェア依存。今回は使用しない。

事前にCloud ControlのAgentをインストール済みの場合は、ここで登録作業が行える。今回は設定しない。

グループの選択。通常は自動で選択されているのでそのまま次へ。

ORACLE_BASEの選択。デフォルトだと別のディレクトリが指定されているので、選択しなおす。

インベントリディレクトリの選択。自動で選択されているもののまま次へ。

rootの構成スクリプトを自動実行するように指定して次へ。

前提条件チェックで警告が出た場合は適宜対応する。自動修正可能なものは「修正および再チェック」で修正スクリプトを生成・実行すればよい。物理メモリやスワップサイズの警告は今回は無視する。

インストールを開始。完了を待つ。

インストールが完了したら、gridユーザの.bash_profileに環境変数を設定しておく。

ノード1側

umask 022
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/19.0.0/grid
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=+ASM1
export LANG=ja_JP.UTF-8
export NLS_LANG=Japanese_Japan.AL32UTF8

ノード2側

umask 022
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/19.0.0/grid
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=+ASM2
export LANG=ja_JP.UTF-8
export NLS_LANG=Japanese_Japan.AL32UTF8

Databaseのインストール

データベースのインストールに関しては、Restart構成に近い。

必要なファイルの展開(oracleユーザ)

Databaseのzipファイルを展開する。

$ mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1
$ unzip -d /u01/app/oracle/product/19.0.0/dbhome_1 /tmp/V982063-01.zip

RUを適用するため、OPatchを最新のものに置き換える。

$ mv /u01/app/oracle/product/19.0.0/dbhome_1/OPatch /u01/app/oracle/product/19.0.0/dbhome_1/OPatch_org
$ unzip -d /u01/app/oracle/product/19.0.0/dbhome_1 /tmp/p6880880_190000_Linux-x86-64.zip

インストーラの実行(oracleユーザ)

適用するRUはGIにあてたものと同じでよい。

$ /u01/app/oracle/product/19.0.0/dbhome_1/runInstaller -applyRU /tmp/RU16/34130714

RUの適用が成功すると、OUIでインストーラが起動する。

インストール・オプションには「ソフトウェアのみの設定」を選択して進める。

RACと異なるのは、「単一インスタンス・データベースのインストール」を選択する点。

エディションの選択は、当然「Standard Edition 2」

ORACLE_BASEを選択する。

グループを選択する。デフォルトで作成済のものが選択されているのでそのまま次へ。

構成スクリプトを自動実行できるようにrootのパスワードを入力。

GIのインストール時点でチェックはパスしているはずなので特に問題はないはずだが、警告が出る場合は対処する。今回はスワップサイズの警告は無視する。

インストールを開始し、正常に完了するのを待つ。

インストールが完了したら、oracleユーザの.bash_profileに環境変数を設定しておく。

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export LANG=ja_JP.UTF-8
export NLS_LANG=Japanese_Japan.AL32UTF8

Oracle Databaseのほかノードへの展開

データベースソフトウェアのインストールがシングル構成と同等だったことからわかるように、この時点ではクラスタを構成する別ノードにデータベースのORACLE_HOMEはインストールされていない。

ほかノードへの展開は、手動で行う必要がある。

SSH等価設定

oracleユーザがノード間でパスワードなしのSSH通信ができるように、手動でSSH等価設定を行う必要がある。

各ノードのoracleユーザでRSAキーペアを作成する。passphrase を聞かれるが、何も入力せずEnter。

$ mkdir ~/.ssh 
$ chmod 700 ~/.ssh
$ cd ~/.ssh
$ ssh-keygen -t rsa

生成された公開鍵(id_rsa.pub)をお互いのノードにコピーする。

(ノード1 → ノード2)

scp ~/.ssh/id_rsa.pub oracle@sehan2.dn.home:/home/oracle/id_rsa.pub.1

(ノード2 → ノード1)

scp ~/.ssh/id_rsa.pub oracle@sehan1.dn.home:/home/oracle/id_rsa.pub.2

お互いの authorized_keys に公開鍵を追記する。

(ノード1)

cat ~/id_rsa.pub.2 ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

(ノード2)

cat ~/id_rsa.pub.1 ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

この時点でパスワードなしでSSH接続できることを確認しておく。

ORACLE_HOME をほかノードへのコピー

$ORACLE_HOME/addnode/addnode.sh -silent CLUSTER_NEW_NODES=sehan2.dn.home
[oracle@sehan1 ~]$ $ORACLE_HOME/addnode/addnode.sh -silent CLUSTER_NEW_NODES=sehan2.dn.home
[WARNING] [INS-13014] ターゲット環境は、いくつかのオプションの要件を満たしていません。
   原因: 一部のオプションの前提条件が満たされていません。詳細はログを参照してください。/u01/app/oraInventory/logs/addNodeActions2022-08-28_00-54-51AM.log
   アクション: ログから失敗した前提条件チェックのリストを確認します: /u01/app/oraInventory/logs/addNodeActions2022-08-28_00-54-51AM.log。次 に、ログ・ファイルまたはインストレーション・マニュアルのいずれかから、前提条件を満たす適切な構成を見つけ、手動で修正してください。

構成の準備が進行中です。

構成の準備が正常に終了しました。
..................................................   7% 完了しました。

リモート・ノードへのファイルのコピーが進行中です。
..................................................   12% 完了しました。
..................................................   18% 完了しました。
..............................
リモート・ノードへのファイルのコピーが正常に終了しました。
このインストール・セッションのログは次の場所にあります:
 /u01/app/oraInventory/logs/addNodeActions2022-08-28_00-54-51AM.log

ファイルを初期化しますが進行中です。

ファイルを初期化しますが正常に終了しました。
..................................................   52% 完了しました。

クラスタ・インベントリを保存していますが進行中です。
..................................................   89% 完了しました。

クラスタ・インベントリを保存していますが正常に終了しました。
/u01/app/oracle/product/19.0.0/dbhome_1のクラスタ・ノードの追加が成功しました。
詳細は'/u01/app/oraInventory/logs/silentInstall2022-08-28_00-54-51AM.log'を確認してください。

Oracleベースの設定が進行中です。

Oracleベースの設定が正常に終了しました。
..................................................   96% 完了しました。

rootユーザーとして次のスクリプトを実行します:
        1. /u01/app/oracle/product/19.0.0/dbhome_1/root.sh

次のノードで/u01/app/oracle/product/19.0.0/dbhome_1/root.shを実行してください:
[sehan2.dn.home]


Successfully Setup Software with warning(s).
..................................................   100% 完了しました。

ちなみに、自分の環境では以下のエラーが出てしまった。

[oracle@sehan1 ~]$ $ORACLE_HOME/addnode/addnode.sh -silent CLUSTER_NEW_NODES=sehan2.dn.home
[FATAL] [INS-30131] インストーラの検証実行に必要な最初の手順が失敗しました。
   原因: システムがインストールの要件を満たしていないため、インストールを続行できません。
*追加情報:*
Exception details
 - PRVF-4008 : ユーザー等価は、指定したすべてのノードで使用できません PRVF-4098 : ノード"sehan2"に対するユーザー等価が見つかりません

等価設定をしているにもかかわらずこのエラーになってしまう。いろいろ試行錯誤した結果わかったのは、authorized_keys にはドメイン名を含まないエントリが必要らしいということ。

ssh-rsa AAAA...略...K8GT oracle@sehan1.dn.home
ssh-rsa AAAA...略...K8GT oracle@sehan1  ← これを手動で追加

自分の環境は、ホスト名をすべてDNSで解決しており、ssh-keygen コマンドが生成する公開鍵にもドメイン名を含むエントリのみ含まれていたのだが、どうもそれではだめらしい。鍵自体は一緒でいいので、手動で追記が必要。ドメイン名を含まないホスト名で一度SSHアクセスして known_hosts にも登録させておく必要がある。

また、addnode.sh 実行時に出る INS-13014 に関しては、ログを見て致命的なエラー出ないことを確認しておく必要がある。今回はスワップサイズに関するエラーだったので、無視することにする。

追加したノードで root.sh を実行

rootユーザで構成スクリプトを実行する。

# /u01/app/oracle/product/19.0.0/dbhome_1/root.sh

oracleユーザの.bash_profileへの環境変数の設定も行う。

umask 022
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export LANG=ja_JP.UTF-8
export NLS_LANG=Japanese_Japan.AL32UTF8

追加のディスクグループの作成

GIインストール時に作成したOCR・投票ディスク用のディスクグループのほかに、データベース格納用のディスクグループを作成する。

gridユーザでASMインスタンスに接続して、以下のようにディスクグループを作成。

$ sqlplus / as sysasm

SQL> create diskgroup DATA external redundancy disk 'AFD:DATA' 
     attribute 'compatible.asm' = '19.0', 'compatible.rdbms' = '19.0', 'compatible.advm' = '19.0';

作成できたら、ディスクグループリソースを開始しておく。

$ srvctl start diskgroup -diskgroup data

データベースの作成

Database Configuration Assistant(DBCA)でデータベースを作成する。ここもRestart構成の場合とほぼ同様の流れ。要点だけ記載すると以下の通り。

データベースの作成モードは「拡張構成」を選択。

作成するデータベースのタイプは「Oracle単一インスタンス・データベース」

データベースの記憶域にはASM上のディスクグループを選択する。

リスナーはGI側で起動しているものを使用する。

これ以外はRestartや通常のシングルインスタンスと同様に設定して作成する。

データベースリソースの構成変更

データベースの作成を「Oracle単一インスタンス・データベース」としているので、当然データベースリソースが登録されているのは作成を行った単一ノードのみ。

クラスタを構成するほかのノードを以下のように追加する必要がある。

$ srvctl modify database -db db19 -node sehan1,sehan2

また、通常のシングルインスタンスと同様、LOCAL_LISTENERパラメータが設定されている。GIのAgentプロセスが動的にLOCAL_LISTENERを登録できるよう、設定をリセットする必要がある。

SQL> alter system reset local_listener;

設定反映のため再起動。

$ srvctl stop database -db db19
$ srvctl start database -db db19

すると以下のように、ローカルのVIPアドレスがLOCAL_LISTENERに自動的に設定されるようになる。

SQL> show parameter local_listener

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string       (ADDRESS=(PROTOCOL=TCP)(HOST=
                                                 192.168.100.68)(PORT=1521))

パスワードファイルのコピー

パスワードファイルがファイルシステム上に存在するため、gridユーザでASM上にコピーする。

この時、ASMCMD-9453 が出るが問題ない。

$ asmcmd pwcopy --dbuniquename db19 /u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwdb19 +DATA/DB19/orapwdb19
copying /u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwdb19 -> +DATA/DB19/orapwdb19
ASMCMD-9453: パスワード・ファイルをCRSリソースとして登録できませんでした

別途以下のようにデータベースリソースのパスワードファイルの設定を変更する。

$ srvctl modify database -db db19 -pwfile +DATA/DB19/orapwdb19

以上で、SEHAの構成は完了。

コメント