CentOS6.6のLinux-HAでPacemakerによるOracleの起動・停止を制御する

# 前置き

[CentOS6.6のLinux-HAでDRBD上にOracleデータベースを構築する](http://qiita.com/takusamar/items/134fbb8fbb736fd8a8a6)
の続きです。

２台のマシンに入れたOracleデータベースを、DRBDがMasterのノードで起動し、Slaveのノードでは停止するよう、pacemakerで管理するように設定します。

# 設定手順

## Oracleリスナー・データベースを停止

まず、Oracleリスナー・データベースを停止しておきます。

### 仮想IPで接続（Master側のノードに接続）

* oracleユーザで実行

Oracle DBの起動状態を確認し、Oracle DBが起動していたら停止します。

```sh:
sqlplus /nolog			
SQL>	conn sys as sysdba		
SQL>	select STATUS from v$instance;
SQL>	shutdown
```

Oracle リスナーの起動状態を確認し、リスナーが起動していたら停止します。

```sh:
lsnrctl status
lsnrctl stop
```

## Oracleの設定追加前のconfig確認

* rootで実行

`crm configure show`

```sh:
node 740103621: OraSv1 \
       attributes standby=off
node 740103622: OraSv2 \
       attributes standby=off
primitive VIP1 IPaddr2 \
       params ip=192.168.10.100 nic=eth0 cidr_netmask=24 \
       op start interval=0s timeout=20s \
       op stop interval=0s timeout=20s \
       op monitor interval=30s
primitive drbd_ora ocf:linbit:drbd \
       params drbdconf="/etc/drbd.conf" drbd_resource=r0 \
       op start interval=0s timeout=240s \
       op monitor interval=10 role=Slave \
       op monitor interval=11 role=Master \
       op stop interval=0 timeout=100s on-fail=block
primitive fs_ora Filesystem \
       params run_fsck=no device="/dev/drbd0" directory="/ora"
fstype=ext4 \
       op start interval=0s timeout=60s \
       op monitor interval=15 timeout=40s \
       op stop interval=0 timeout=60s on-fail=ignore
group grpora fs_ora VIP1
ms ms-drbd_ora drbd_ora \
       meta notify=true
colocation coloc-drbd_fs inf: fs_ora ms-drbd_ora:Master
order order-drbd_fs inf: ms-drbd_ora:promote fs_ora:start
property cib-bootstrap-options: \
       dc-version=1.1.12-561c4cf \
       cluster-infrastructure=corosync \
       no-quorum-policy=ignore \
       stonith-enabled=false
rsc_defaults rsc-options: \
       resource-stickiness=INFINITY \
       migration-threshold=1
```

## Oracleの設定追加

Oracleリスナー、データベースを登録します。
【SID】には各自作成したデータベースのSIDを入れてください。

`crm configure`

```sh:
primitive OraLSN oralsnr \
params sid=【SID】\
op start interval=0s timeout=60s \
op stop interval=0s timeout=60s \
op monitor interval=30 timeout=60 depth=0

colocation OraLSN-with-FS inf: fs_ora OraLSN
order OraLSN-after-FS inf: fs_ora OraLSN

primitive OraSrv oracle \
params sid=【SID】 home="/u01/app/oracle/product/12.1.0/dbhome_1"
user=oracle \
op start interval=0s timeout=120 \
op stop interval=0s timeout=120 \
op monitor interval=120s timeout=60s

colocation OraLSN-with-OraSrv inf: OraLSN OraSrv
order OraSrv-after-OraLSN inf: OraLSN OraSrv

commit
exit
```

追加した設定は以下の通りです。

* Oracleリスナー（OraLSN）を登録
* DRBDのファイルシステム（fs_ora）とOraLSNは同一ノードで起動すること
* fs_oraの起動後にOraLSNを起動すること

* Oracleデータベース（OraSrv）を登録（SID, ORACLE_HOME, ユーザをパタメタで指定）
* Oracleリスナー（OraLSN）とOraSrvは同一ノードで起動すること
* OraLSNの起動後にOraSrvを起動すること

どのノードで起動するか、また各リソースの起動順序に気をつけて設定してください。

> 私の場合、マシンがしょぼかったのでOracleの起動に時間がかかり、120秒のタイムアウトではエラーになってしまったので、タイムアウト秒数を増やして回避しました。
>上記の設定でうまく起動しないという時は、タイムアウト秒数を調整してみてください。

## pacemaker状態確認

追加したOraLSN, OraSrvが正しく起動するか、確認します。

`crm_mon`

```sh:
Online: [ OraSv1 OraSv2 ]

Master/Slave Set: ms-drbd_ora [drbd_ora]
    Masters: [ OraSv1 ]
    Slaves: [ OraSv2 ]
OraLSN  (ocf::heartbeat:oralsnr):       Started OraSv1
OraSrv  (ocf::heartbeat:oracle):        Started OraSv1
Resource Group: grpora
    fs_ora     (ocf::heartbeat:Filesystem):    Started OraSv1
    VIP1       (ocf::heartbeat:IPaddr2):       Started OraSv1
```

このように、OraLSN, OraSrvがfs_oraと同一ノードで起動（Started）になればOKです。

あとは、ノードの切り替えをしながら、crm_monでOraLSN, OraSrvの起動ノードが正しく切り替わるかを確認してください。

```sh:
crm node standby OraSv1
crm node online OraSv1

crm node standby OraSv2
crm node online OraSv2

```

# Oracleの設定追加後のconfig確認

`crm configure show`

```sh:
node 740103621: OraSv1 \
       attributes standby=off
node 740103622: OraSv2 \
       attributes standby=off
primitive OraLSN oralsnr \
       params sid=【SID】 \
       op start interval=0s timeout=60s \
       op stop interval=0s timeout=60s \
       op monitor interval=30 timeout=60 depth=0
primitive OraSrv oracle \
       params sid=【SID】 home="/u01/app/oracle/product/12.1.0/dbhome_1"
user=oracle \
       op start interval=0s timeout=120 \
       op stop interval=0s timeout=120 \
       op monitor interval=120s timeout=60s
primitive VIP1 IPaddr2 \
       params ip=192.168.10.100 nic=eth0 cidr_netmask=24 \
       op start interval=0s timeout=20s \
       op stop interval=0s timeout=20s \
       op monitor interval=30s
primitive drbd_ora ocf:linbit:drbd \
       params drbdconf="/etc/drbd.conf" drbd_resource=r0 \
       op start interval=0s timeout=240s \
       op monitor interval=10 role=Slave \
       op monitor interval=11 role=Master \
       op stop interval=0 timeout=100s on-fail=block
primitive fs_ora Filesystem \
       params run_fsck=no device="/dev/drbd0" directory="/ora"
fstype=ext4 \
       op start interval=0s timeout=60s \
       op monitor interval=15 timeout=40s \
       op stop interval=0 timeout=60s on-fail=ignore
group grpora fs_ora VIP1
ms ms-drbd_ora drbd_ora \
       meta notify=true
colocation OraLSN-with-FS inf: grpora OraLSN
colocation OraLSN-with-OraSrv inf: OraLSN OraSrv
colocation coloc-drbd_fs inf: grpora ms-drbd_ora:Master
order OraLSN-after-FS inf: grpora OraLSN
order OraSrv-after-OraLSN inf: OraLSN OraSrv
order order-drbd_fs inf: ms-drbd_ora:promote grpora:start
property cib-bootstrap-options: \
       dc-version=1.1.12-561c4cf \
       cluster-infrastructure=corosync \
       no-quorum-policy=ignore \
       stonith-enabled=false
rsc_defaults rsc-options: \
       resource-stickiness=INFINITY \
       migration-threshold=1						
```

# あとがき

そもそもMySQLやPostgreSQLではなく、わざわざOracleを入れたのはOracle APEXを使いたいから、というのが本来の理由でした。
素直にOracleのHA構成を使えばいいんですが、いろいろと事情がありまして今回このような無茶をしてみました。

他にも同じようなことをしようとしている方の参考になれば幸いです。