[Database] Clusterware 11gR2 – Setting up an Active/Passive failover configuration

Oracleはデータベースの高可用性を確保するためのソリューションを幅広く提供しています。DataGuard、RAC、そしてこの二つの組み合わせ(MAA-Maximum Available Architectureで推奨しています)がよく事例としてあるソリューションです。
しかし、フェールオーバ機能を用いたActive/Passiveアーキテクチャのシステムを保護する場合にはどうでしょう。他社のクラスタシステムを使うことを考慮されることが多いと思います。
Oracle Clusterwareテクノロジーは、Oracle DatabaseやOracle Unbreakable Linuxに追加費用は不要であることは多くの人がご存じのことですが、Oracle RACと関連づけてらっしゃることが多いため、ほとんどフェールオーバソリューションを構築する際に使われることがありません。

Oracle 11gR2 Grid Infrastructureの1コンポーネントであるOracle Clusterware 11gR2は、自動フェールオーバ構成を設定するための総合的なフレームワークを提供します。
実際に、ほとんどすべてのアプリケーション(簡単なxclockからもっとも複雑なアプリケーションサーバまで)をフェールオーバさせることができ、そして保護することができます。
Oracle Clusterwareは、単一サーバーをクラスタリングすることで、単一のシステムとして機能させるポータブル・クラスタ・システムです。また、 Oracle Clusterwareは、Oracle Real Application Clusters(RAC)に必要なインフラストラクチャを提供します。さらに、すべてのOracleアプリケーションや、クラスタ内にある他のあらゆる種類のアプリケーションを保護します。
次の数行で、この目的を達成するための違う手順を提示しようと思っています。
動作する11gR2データベースを自動フェイルオーバー機能によって完全に保護する

読者がOracle Database 11gR2やOracle Grid Infrastructure 11gR2をLinux上にインストールすることに慣れており、(共有ストレージとして使っているので)ASMの構成も全く問題ないものと仮定します。もしそうでないなら、Oracleの製品ドキュメントをご覧ください。
Oracle VirtualBox環境でテストを実施しました。スクリプトはテスト済みで、問題なく動作していますが、スクリプト中の文字にTypoや間違いがある可能性もあります。
このエントリはClusterware Frameworkに関連する教育コースを置き換えるものではありません。Clusterwareの機能が非常に強力であることを知って頂きたいと思います。

注意:このエントリはPhilip Newlanのコメントを受けて改訂されています。

事前に準備しておくもの
  • OSレベルが一致するLinuxが動作するハードウェア2台(OELCluster01、OELCluster02)
    • 今回はOEL5u5とEnterprise Kernelを使用
  • VirtualBox上に共有ストレージ(SAN)
    • 今回はOpenfireを使ってSANをシミュレーショトしました。
  • Oracle Database 11gR2  (11.2.0.1)
  • Oracle Grod Infrastructure 11gR2 (11.2.0.1)
Step-1 ソフトウェアをインストール
  • asmlibを使って3個のASMディスクを作成(ASM_CRS、ASM_DTA、ASM_FRA)
  • クラスタ用にGrid Infrastructureをインストール(OELCluste01、OELCluster02の2ノードがクラスタを構成)
    • ASM_CRS:Voting DiskとOCRを格納
    • SCANを使用
  • 両ノードにOracle Databaseをスタンドアロン構成でインストール
    • asmcaを使って両ノードにディスクグループをチェックおよびマウント
    • dbcaを使ってプライマリノードにデータベースを作成し構成
      • インスタンス名はDB11G
      • pfileをもう一方のノードへコピー
      • adumpディレクトリを他方のノードで作成
Step-2 保護するリソースをセットアップ 

dbcaで作成後、Grid Infratructureで利用可能なOracle RestartテクノロジーがDBを自動的に保護しますので、クラッシュした場合(kill -9 smonなど)には(可能であれば)自動的に再起動します。
データベースリソースはCluster Registryに作成されていて、次のコマンドで監視することができます。このコマンドは ora.dba11g.db エントリを表示します。
crsctl status resource ora.dba11g.db
では以下の手順でこのリソース定義を保存しておきましょう。
  • mkdir -p /crs/11.2.0/HA_scripts
  • chown oracle:oinstall /crs/11.2.0/HA_scripts
  • crsctl status resource ora.db.11g.db -p > /crs/11.2.0/HA_scripts/myResource.txt
興味深いことではあるけれども、Oracle Restartはクラスタに気づいていないので、クラスタ構成している他方のノード上のデータベースを再起動することはできません。そのため、OCR(訳注:OCR=Oracle Cluster Registry)の設定情報から削除してしまいましょう。
  • srvctl stop database -d DB11G
  • srvctl remove database -d DB11G
削除したリソースに代わって、cluster_resourceという新しいリソースを作成します。
  • スクリプトを作成します。
    /crs/11.2.0/HA_scripts/my_ActivePassive_Cluster.sh
    #!/bin/bash

    export ORACLE_HOME=/oracle/product/11.2.0/dbhome_1
    export ORACLE_SID=DB11G

    case $1 in
    'start')
      $ORACLE_HOME/bin/sqlplus /nolog <<EOF
      connect / as sysdba
      startup
    EOF
      RET=0
      ;;
    'stop')
      $ORACLE_HOME/bin/sqlplus /nolog <<EOF
      connect / as sysdba
      shutdown immediate
    EOF
      RET=0
      ;;

    'clean')
      $ORACLE_HOME/bin/sqlplus /nolog <<EOF
      connect / as sysdba
      shutdown abort
      ##for i in `ps -ef | grep -i $ORACLE_SID | awk '{print $2}' ` ;do kill -9 $i; done
    EOF
      RET=0
      ;;

    'check')
       ok=`ps -ef | grep smon | grep $ORACLE_SID | wc -l`
       if [ $ok = 0 ]; then
         RET=1
       else
         RET=0
       fi
       ;;
    '*')  
      RET=0
      ;;
    esac

    if [ $RET -eq 0 ]; then
       exit 0
    else
       exit 1
    fi 
このスクリプトには、少なくともデータベースの開始、停止、削除、チェックのためのメソッドを含む必要があります。このスクリプトは一目瞭然で、特別なものは含んでいません。実行権限(+x)があること、Oracleユーザーとして実行(ACLプロパティのため。後述します)し、環境を知る必要があることを認識しておきましょう。このスクリプトはクラスタの各ノードに配置しておく必要があります
さらに、11.2では削除メソッドは必須で、shutdown abortか、もしくはkill -9で残っているプロセスをすべて停止する機能を用意しておく必要があります。
  • chmod +x /crs/11.2.0/HA_scripts/my_ActivePassive_Cluster.sh
  • scp  /crs/11.2.0/HA_scripts/my_ActivePassive_Cluster.sh   oracle@OELCluster02:/crs/11.2.0/HA_scripts
myResource.txtで取得した情報から、新しいリソースファイルを作成します。myResource.txtの中身を以下に掲載しておきます。ご覧になってわかるように、ora.database.typeリソースをora.db11g.dbという名前で定義しています。多くのプロパティがこのリソースタイプと関連していますが、cluster_resourceのために使う必要がないプロパティも含まれています。
NAME=ora.db11g.db
TYPE=ora.database.type
ACL=owner:oracle:rwx,pgrp:oinstall:rwx,other::r--
ACTION_FAILURE_TEMPLATE=
ACTION_SCRIPT=
ACTIVE_PLACEMENT=1
AGENT_FILENAME=%CRS_HOME%/bin/oraagent%CRS_EXE_SUFFIX%
AUTO_START=restore
CARDINALITY=1
CHECK_INTERVAL=1
CHECK_TIMEOUT=600
CLUSTER_DATABASE=false
DB_UNIQUE_NAME=DB11G
DEFAULT_TEMPLATE=PROPERTY(RESOURCE_CLASS=database) PROPERTY(DB_UNIQUE_NAME= CONCAT(PARSE(%NAME%, ., 2), %USR_ORA_DOMAIN%, .)) ELEMENT(INSTANCE_NAME= %GEN_USR_ORA_INST_NAME%)
DEGREE=1
DESCRIPTION=Oracle Database resource
ENABLED=1
FAILOVER_DELAY=0
FAILURE_INTERVAL=60
FAILURE_THRESHOLD=1
GEN_AUDIT_FILE_DEST=/oracle/admin/DB11G/adump
GEN_USR_ORA_INST_NAME=
GEN_USR_ORA_INST_NAME@SERVERNAME(oelcluster01)=DB11G
HOSTING_MEMBERS=
INSTANCE_FAILOVER=0
LOAD=1
LOGGING_LEVEL=1
MANAGEMENT_POLICY=AUTOMATIC
NLS_LANG=
NOT_RESTARTING_TEMPLATE=
OFFLINE_CHECK_INTERVAL=0
ORACLE_HOME=/oracle/product/11.2.0/dbhome_1
PLACEMENT=restricted
PROFILE_CHANGE_TEMPLATE=
RESTART_ATTEMPTS=2
ROLE=PRIMARY
SCRIPT_TIMEOUT=60
SERVER_POOLS=ora.DB11G
SPFILE=+DTA/DB11G/spfileDB11G.ora
START_DEPENDENCIES=hard(ora.DTA.dg,ora.FRA.dg) weak(type:ora.listener.type,uniform:ora.ons,uniform:ora.eons) pullup(ora.DTA.dg,ora.FRA.dg)
START_TIMEOUT=600
STATE_CHANGE_TEMPLATE=
STOP_DEPENDENCIES=hard(intermediate:ora.asm,shutdown:ora.DTA.dg,shutdown:ora.FRA.dg)
STOP_TIMEOUT=600
UPTIME_THRESHOLD=1h
USR_ORA_DB_NAME=DB11G
USR_ORA_DOMAIN=haroland
USR_ORA_ENV=
USR_ORA_FLAGS=
USR_ORA_INST_NAME=DB11G
USR_ORA_OPEN_MODE=open
USR_ORA_OPI=false
USR_ORA_STOP_MODE=immediate
VERSION=11.2.0.1.0
myResource.txtからデータベースタイプに関連するエントリを削除し、少々手を加えて、以下のようなmyNewResource.txtを作成します。注意すべき点は以下の通りです。
  • NAMEプロパティにはora.をつけない
  • TYPEプロパティはora.database.typeではないが、cluster_resourceである
  • ACTION_SCRIPTの定義をしておく
  • HOSTING_MEMBERSでクラスタメンバーを列挙しておく(olsnodesコマンドの返値)
NAME=DB11G.db
TYPE=cluster_resource
DESCRIPTION=Oracle Database resource
ACL=owner:oracle:rwx,pgrp:oinstall:rwx,other::r--
ACTION_SCRIPT=/crs/11.2.0/HA_scripts/my_ActivePassive_Cluster.sh
PLACEMENT=restricted
ACTIVE_PLACEMENT=0
AUTO_START=restore
CARDINALITY=1
CHECK_INTERVAL=10
DEGREE=1
ENABLED=1
HOSTING_MEMBERS=oelcluster01 oelcluster02
LOGGING_LEVEL=1
RESTART_ATTEMPTS=1
START_DEPENDENCIES=hard(ora.DTA.dg,ora.FRA.dg) weak(type:ora.listener.type,uniform:ora.ons,uniform:ora.eons) pullup(ora.DTA.dg,ora.FRA.dg)
START_TIMEOUT=600
STOP_DEPENDENCIES=hard(intermediate:ora.asm,shutdown:ora.DTA.dg,shutdown:ora.FRA.dg)
STOP_TIMEOUT=600
UPTIME_THRESHOLD=1h
そしてリソースを登録します。リソースタイプに注意しましょう。ora.database.typeリソースではなく、cluster_resourceです(Oracleの推奨)。
  • crsctl add resource DB11G.db  -type cluster_resource -file /crs/11.2.0/HA_scripts/myNewResource.txt
Step-3 リソースを起動
  • crsctl start resource DB11G.db
このコマンドでACTION_SCRIPTを起動し、クラスタのプライマリノード上のパラメータをチェックします。

Step-4 テスト

2個のメソッドを使ってセットアップをテストします。
  • crsctl relocate resource DB11G.db
このコマンドは(両ノードの)ACTION_SCRIPTを呼び出し、アクティブノードのデータベースを停止し、別のノードのデータベースを起動します。もう一度実行したら、元のノードに戻すことができますが、今度はデータベース稼働中のサーバの電源を落としてみましょう。ちょっとの遅延のあと、データベースがノード1(訳注:もとのノード)に戻ることを確認してください。

結論

ソフトウェアをインストールし、スタンドアロンのデータベースを作成するという、非常に一般的で通常の作業をした後の手順は非常に簡単です。
  1. 実行スクリプトをクラスタを構成するすべてのノードに配置
  2. リソースファイルを作成
  3. リソースファイルを使ってOCRにリソースを作成・登録
  4. リソースの開始
このソリューションは他社のソリューションの代替となり得る、非常に興味深いものです。

参考URL

原文はこちら。
http://blogs.oracle.com/xpsoluxdb/2011/02/clusterware_11gr2_setting_up_an_activepassive_failover_configuration.html

0 件のコメント:

コメントを投稿