본문 바로가기

Real Application Cluster

CRS 와 10G REAL APPLICATION CLUSTERS

CRS 와 10G REAL APPLICATION CLUSTERS
===================================
 

PURPOSE
-------
이 문서는, 10g Real Application Cluster의 CRS (Cluster Ready Services)에 대한 추가적인
정보를 제공하는 것을 목적으로 한다.

Explanation
-----------
1. CRS 와 10g REAL APPLICATION CLUSTERS
 
CRS (Cluster Ready Services)는 10g Real Application Cluster의 새로운 기능으로,
모든 플랫폼에 대해 표준화된 클러스터 인터페이스를 제공 해 주고, 이전 버전에서는 없었던
새로운 고가용 서비스를 제공해 준다.


2. CRS 핵심 기능

CRS와 10g RAC를 설치하기 전에, CRS및 10g RAC에 대해 사전에 알아 두어야 할 사항이 있다 :

- 10g RAC를 설치를 위해서는 CRS는 사전에 설치 되고 실행되어야 한다.

- CRS는 하드웨어 공급 업체에서 제공하는 클러스터 제품 (예 : Sun Cluster,
  HP Serviceguard, IBM HACMP, TruCluster, Veritas Cluster, Fujitsu Primecluster,
  기타 ...) 위에서 실행 될 수도 있고, 하드웨어 공급 업체에서 제공하는 클러스터 제품
  없이도 실행될 수 있다. 하드웨어 업체에서 공급하는 클러스터 제품은 9i RAC까지는 반드시
  필요했지만, 10g RAC에서는 선택 사항이다.

- CRS HOME 과 ORACLE_HOME 은 반드시 다른 디렉토리에 설치 되어야 한다.

- CRS를 설치하기 전에, voting 파일 또는 OCR (Oracle Configuration Repository) 파일을
  설치 할 수 있는 공유된 디렉토리 또는 디바이스가 셋업되어야 한다. voting file은 최소 20MB 정도
  크기이며, OCR 파일은, 최소 100MB 크기가 되어야 한다.

- CRS 및 RAC를 설치하기 위해서는 다음과 같은 네트워크 인터페이스가 구성되어야 한다 :
  - Public Interface
  - Private Interface
  - Virtual (Public) Interface
  관련된 추가적인 정보는 <Bulletin No: 22345> 참조.

- CRS 설치 후 root.sh를 실행시키면 CRS 서비스를 구동시킨다. 만약 CRS가 정상적으로
  구동되지 않는다면, Note 240001.1 참조.

- RAC 노드당 1개의 CRS 데모만 실행 가능.

- 유닉스 시스템의 경우, CRS 서비스는 /etc/inittab 상의 ‘respawn’ entry로 등록되어 있다.

- 네트워크 split이 있을 경우 (노드간 통신 두절) data corruption을 방지 하기 위해 하나
  또는 그 이상의 노드에서 리부팅이 발생할 수 있다.

- CRS 서비스를 구동시키는 올바른 방법은 장비를 부팅시키는 것이다.

- 서비스를 중단시키는 올바른 방법은, 장비를 shutdown 시키거나, "init.crs stop" 명령을
  실행시키는 것이다.

- CRS 데몬을 kill 시키는 것은 올바른 방법이 아니며, 오직 설치된 CRS를 제거한 경우에만
  적용해도 되는 방법이다. (Bulletin No: 22343 참조) 이것은 , 플래그 파일에 불일치가 발생 할
  수 있기 때문이다.

- 시스템 유지 보수를 위해서는, OS를 단일 사용자 모드 (single user mode)로 전환한다.

서비스 스택이 구동되면, ps -ef 명령으로 관련된 데몬 프로세스를 확인 할 수 있다 :

[rac1]/u01/home/beta> ps -ef | grep crs

 oracle  1363   999  0 11:23:21 ?  0:00 /u01/crs_home/bin/evmlogger.bin -o /u01
 oracle   999     1  0 11:21:39 ?  0:01 /u01/crs_home/bin/evmd.bin
 root    1003     1  0 11:21:39 ?  0:01 /u01/crs_home/bin/crsd.bin
 oracle  1002     1  0 11:21:39 ?  0:01 /u01/crs_home/bin/ocssd.bin


3. CRS DAEMON 기능

다음은 각각의 CRS 데몬 프로세스에 대한 간략한 설명이다 :

CRSD:
- HA 작업을 위한 엔진
- '애플리케이션 자원'관리
- '애플리케이션 자원'을 구동, 정지, fail over 처리
- 애플리케이션 자원 구동/정지/점검 하기 위한 별도의 'actions'을 spawn
- OCR(Oracle Configuration Repository)의 구성 프로파일 관리
- OCR의 현재 알려진 상태를 저장
- root 권한으로 실행
- 장애 발생시 자동으로 재 구동됨

OCSSD:
- OCSSD는 RAC의 일부로, ASM과 함께 단일 인스턴스를 구성함
- 노드 멤버쉽에 대한 액세스를 제공
- 그룹 서비스 제공
- 기본적인 클러스터 lock 기능 제공
- 하드웨어 공급 업체에서 제공하는 클러스터 소프트웨어가 설치되어 있을 경우, 통합을 실시
- 하드웨어 공급 업체에서 제공하는 클러스터 소프트웨어 없이도 실행 가능
- 오라클 계정으로 실행
- 장애로 인한 종료시 시스템 리부팅됨
--- 리부팅은 split brain 현상 발생시, 데이터 corruption 방지를 목적으로 함.

EVMD:
- 특정한 사건 발생 시 이벤트 생성
- 자식 프로세스로 evmlogger를 spawn 시킴
- Evmlogger는 필요시 자식 프로세스를 spawn 시킴
- callout directory를 스캔하고 callout을 호출
- 오라클 계정으로 실행.
- 장애로 인한 종료시 자동으로 재 구동됨


4. CRS 로그 디렉토리

CRS 문제의 원인을 추적할 때는, CRS 홈 디렉토리 아래 디렉토리를 살펴보는 것이 중요하다.

$ORA_CRS_HOME/crs/log - 이 디렉토리는, CRS 자원들에 대한 트레이스를 포함하며,
CRS에 의해 식별된 가입(joining), 탈퇴(leaving), 재구동(restarting), 재배치(relocating)와
관련된 정보들이 기록된다.

$ORA_CRS_HOME/crs/init - crsd.bin 데몬과 관련된 모든 core dump가 기록된다.

$ORA_CRS_HOME/css/log - css 로그는, 재구성(reconfiguration)이나, 성공하지
못한 체크인 (missed checkin), 클라이언트의 css listener로 부터 발생한 연결(connect) 및
연결해제(disconnect)와 관련된 모든 액션을 기록한다. 때에 따라서는 로거에서는 (auth.crit)
유형의 메시지를 남기는데 이것은 오라클에 의해 리부팅이 발생할 때 남는다. 이 정보는
리부팅이 정확히 언제 발생했는지를 확인하는데 사용될 수 있다.

$ORA_CRS_HOME/css/init - 기본적으로는 ocssd로 부터의 core dump 파일을 저장하며, 프로세스의
종료가 심각한 문제로 간주되는 css 데몬의 pid 정보 또한 기록된다. css의 비정상 재 구동이 발생할
경우, core 파일은, core.<pid> 형태로 기록된다.

$ORA_CRS_HOME/evm/log - evn과 evmlogger 데몬의 로그 파일이 기록된다. CRS 또는 CSS 관련 디렉토리
처럼 디버깅 용도로 자주 사용되지는 않는다.

$ORA_CRS_HOME/evm/init - EVM의 pid와 lock 파일이 저장된다. EVM으로 부터 발생한 core 파일 또한
이 디렉토리에 저장된다. 디버깅을 위해서는 Note 1812.1 참조.

$ORA_CRS_HOME/srvm/log - OCR을 위한 로그 파일.


5. CRS 자원의 상태

RAC를 설치하고, RAC root.sh을 실행시키면 VIPCA (Virtual IP Configuration Assistant)가
구동된다. crs_stat 명령을 이용하여 모든 CRS 자원을 확인할 수 있다. 예 :

 cd $ORA_CRS_HOME/bin
 ./crs_stat

 NAME=ora.rac1.gsd
 TYPE=application
 TARGET=ONLINE
 STATE=ONLINE
 
 NAME=ora.rac1.oem
 TYPE=application
 TARGET=ONLINE
 STATE=ONLINE

 NAME=ora.rac1.ons
 TYPE=application
 TARGET=ONLINE
 STATE=ONLINE

 NAME=ora.rac1.vip
 TYPE=application
 TARGET=ONLINE          
 STATE=ONLINE

 NAME=ora.rac2.gsd
 TYPE=application
 TARGET=ONLINE
 STATE=ONLINE
 
 NAME=ora.rac2.oem
 TYPE=application
 TARGET=ONLINE
 STATE=ONLINE
 
 NAME=ora.rac2.ons
 TYPE=application
 TARGET=ONLINE
 STATE=ONLINE

 NAME=ora.rac2.vip
 TYPE=application
 TARGET=ONLINE
 STATE=ONLINE

CRS 자원을 읽기 쉬운 형태로 확인하기 위한 스크립트 또한 사용할 수 있다.
다음은 shell script의 예이다 :

--------------------------- Begin Shell Script -------------------------------

#!/usr/bin/ksh
#
# Sample 10g CRS resource status query script
#
# Description:
#    - Returns formatted version of crs_stat -t, in tabular
#      format, with the complete rsc names and filtering keywords
#   - The argument, $RSC_KEY, is optional and if passed to the script, will
#     limit the output to HA resources whose names match $RSC_KEY.
# Requirements:
#   - $ORA_CRS_HOME should be set in your environment

RSC_KEY=$1
QSTAT=-u
AWK=/usr/xpg4/bin/awk    # if not available use /usr/bin/awk

# Table header:echo ""
$AWK \
  'BEGIN {printf "%-45s %-10s %-18s\n", "HA Resource", "Target", "State";
          printf "%-45s %-10s %-18s\n", "-----------", "------", "-----";}'

# Table body:
$ORA_CRS_HOME/bin/crs_stat $QSTAT | $AWK \
 'BEGIN { FS="="; state = 0; }
  $1~/NAME/ && $2~/'$RSC_KEY'/ {appname = $2; state=1};
  state == 0 {next;}
  $1~/TARGET/ && state == 1 {apptarget = $2; state=2;}
  $1~/STATE/ && state == 2 {appstate = $2; state=3;}
  state == 3 {printf "%-45s %-10s %-18s\n", appname, apptarget, appstate; state=0;}'

--------------------------- End Shell Script -------------------------------

실행 결과 예시 :

[opcbsol1]/u01/home/usupport> ./crsstat
HA Resource                                   Target     State            
-----------                                   ------     -----            
ora.V10SN.V10SN1.inst                         ONLINE     ONLINE on opcbsol1
ora.V10SN.V10SN2.inst                         ONLINE     ONLINE on opcbsol2        
ora.V10SN.db                                  ONLINE     ONLINE on opcbsol2
ora.opcbsol1.ASM1.asm                         ONLINE     ONLINE on opcbsol1
ora.opcbsol1.LISTENER_OPCBSOL1.lsnr           ONLINE     ONLINE on opcbsol1
ora.opcbsol1.gsd                              ONLINE ONLINE on opcbsol1
ora.opcbsol1.ons                              ONLINE     ONLINE on opcbsol1
ora.opcbsol1.vip                              ONLINE     ONLINE on opcbsol1
ora.opcbsol2.ASM2.asm                         ONLINE     ONLINE on opcbsol2
ora.opcbsol2.LISTENER_OPCBSOL2.lsnr           ONLINE     ONLINE on opcbsol2
ora.opcbsol2.gsd                              ONLINE     ONLINE on opcbsol2
ora.opcbsol2.ons                              ONLINE     ONLINE on opcbsol2
ora.opcbsol2.vip                              ONLINE     ONLINE on opcbsol2

 

6. CRS 자원 관리

자원을 관리하기 위해서는, srvctl 명령을 사용한다. 다음은 명령어 문법 예제이다.


1) CRS 자원 상태

srvctl status database -d <database-name> [-f] [-v] [-S <level>]
srvctl status instance -d <database-name> -i <instance-name> >[,<instance-name-list>]
       [-f] [-v] [-S <level>]
srvctl status service -d <database-name> -s <service-name>[,<service-name-list>]
       [-f] [-v] [-S <level>]
srvctl status nodeapps [-n <node-name>]
srvctl status asm -n <node_name>

예제:

데이터베이스의 상태, 모든 인스턴스와 모든 서비스
        srvctl status database -d ORACLE -v
이름이 부여된 인스턴스의 상태와 현재 서비스
        srvctl status instance  -d ORACLE -i RAC01, RAC02 -v
이름이 부여된 서비스의 상태.
        srvctl status service -d ORACLE -s ERP  -v
데이터베이스 애플리케이션을 지원하는 모든 노드의 상태.
        srvctl status node


2) CRS 자원의 구동

srvctl start database -d <database-name> [-o < start-options>]
       [-c <connect-string> | -q]
srvctl start instance -d <database-name> -i <instance-name>
       [,<instance-name-list>] [-o <start-options>] [-c <connect-string> | -q]
srvctl start service -d <database-name> [-s <service-name>[,<service-name-list>]]
       [-i <instance-name>]  [-o <start-options>] [-c <connect-string> | -q]
srvctl start nodeapps -n <node-name>
srvctl start asm -n <node_name> [-i <asm_inst_name>] [-o <start_options>]

예제:

데이터베이스를 모든 활성화된 인스턴스와 함께 구동.
        srvctl start database -d ORACLE
이름이 부여된 인스턴스의 구동. 
        srvctl start instance  -d ORACLE -i RAC03, RAC04
이름이 부여된 서비스의 구동. 연관된 인스턴스는 필요시 구동됨.
        srvctl start service -d ORACLE -s CRM
이름이 부여된 인스턴스의 서비스의 구동.
        srvctl start  service -d ORACLE -s CRM -i RAC04
노드 애플리케이션의 구동.
        srvctl start  nodeapps -n myclust-4

 

3) CRS 자원의 정지

srvctl stop database -d <database-name> [-o <stop-options>] 
       [-c <connect-string> | -q]
srvctl stop instance -d <database-name> -i <instance-name> [,<instance-name-list>]
       [-o <stop-options>][-c <connect-string> | -q]
srvctl stop service -d <database-name> [-s <service-name>[,<service-name-list>]]
       [-i <instance-name>][-c <connect-string> | -q] [-f]
srvctl stop nodeapps -n <node-name>
srvctl stop asm -n <node_name> [-i <asm_inst_name>] [-o <start_options>]

예제:

데이터베이스, 모든 인스턴스, 모든 서비스를 정지 시킴.
        srvctl stop database -d ORACLE
이름이 부여된 인스턴스를 정지 시킴. 그 전에 우선 존재하는 모든 서비스를 재배치 함.
        srvctl stop instance  -d ORACLE -i RAC03,RAC04
서비스를 정지시킴.
        srvctl stop service -d ORACLE -s CRM
이름이 부여된 인스턴스의 서비스를 정지 시킴.
        srvctl stop  service -d ORACLE -s CRM -i RAC04
노드 애플리케이션을 정지 시킴. 인스턴스와 서비스 역시 정지됨.
        srvctl stop  nodeapps -n myclust-4


4) CRS 자원의 추가

srvctl add database -d <name> -o <oracle_home> [-m <domain_name>] [-p <spfile>]
       [-A <name|ip>/netmask] [-r {PRIMARY | PHYSICAL_STANDBY | LOGICAL_STANDBY}]
       [-s <start_options>] [-n <db_name>]
srvctl add instance -d <name> -i <inst_name> -n <node_name>
srvctl add service -d <name> -s <service_name> -r <preferred_list>
       [-a <available_list>] [-P <TAF_policy>] [-u]
srvctl add nodeapps -n <node_name> -o <oracle_home>
       [-A <name|ip>/netmask[/if1[|if2|...]]]
srvctl add asm -n <node_name> -i <asm_inst_name> -o <oracle_home>

OPTIONS:

-A      vip range, node, and database, address specification. The format of
        address string is:
        [<logical host name>]/<VIP address>/<net mask>[/<host interface1[ |
        host interface2 |..]>] [,] [<logical host name>]/<VIP address>/<net mask>
        [/<host interface1[ | host interface2 |..]>]
-a      for services, list of available instances, this list cannot include
        preferred instances
-m      domain name with the format “us.mydomain.com”
-n      node name that will support one or more instances
-o      $ORACLE_HOME to locate Oracle binaries
-P      for services, TAF preconnect policy - NONE, PRECONNECT
-r      for services, list of preferred instances, this list cannot include
        available instances.
-s      spfile name
-u      updates the preferred or available list for the service to support the
        specified instance. Only one instance may be specified with the -u
        switch.  Instances that already support the service should not be
        included.

예제:

새로운 노드의 추가.
        srvctl add nodeapps -n myclust-1 -o $ORACLE_HOME  ?A 
        139.184.201.1/255.255.255.0/hme0
새로운 데이터 베이스의 추가. 
        srvctl add  database  -d ORACLE -o $ORACLE_HOME
이미 존제하는 데이터베이스에 이름이 부여된 인스턴스 추가.
        srvctl add instance -d ORACLE -i RAC01 -n myclust-1
        srvctl add instance -d ORACLE -i RAC02 -n myclust-2
        srvctl add instance -d ORACLE -i RAC03 -n myclust-3
서비스를 이미 존재하는 데이터베이스에 추가하며, 선호되는 인스턴스를 지정 (-r)하고,
가용한 인스턴스를 지정함(-a). 가용 인스턴스에 대해서는 기본 failover를 사용함.
        srvctl add service -d ORACLE -s STD_BATCH -r RAC01,RAC02 -a RAC03,RAC04
이미 존재하는 데이터베이스에 선호되는 인스턴스를 list 1, 가용한 인스턴스를 list 2에
추가함. 가용 인스턴스에 대해서는 사전연결 (preconnect) 방식을 사용함.
        srvctl add service -d ORACLE -s STD_BATCH -r RAC01,RAC02 -a RAC03,RAC04  -P PRECONNECT


5) CRS RE자원의 제거

srvctl remove database -d <database-name> 
srvctl remove instance  -d <database-name> [-i <instance-name>]
srvctl remove service -d <database-name> -s <service-name> [-i <instance-name>] 
srvctl remove nodeapps -n <node-name>

예제:

데이터베이스에 대한 애플리케이션의 제거.
        srvctl remove database  -d ORACLE
이미 존재하는 데이터베이스의 이름이 부여된 인스턴스에 대한 애플리케이션 제거.
        srvctl remove instance -d ORACLE -i  RAC03
        srvctl remove instance -d ORACLE -i  RAC04
서비스 제거.
        srvctl remove  service -d ORACLE -s STD_BATCH
인스턴스로부터 서비스 제거.
        srvctl remove  service  -d ORACLE -s STD_BATCH -i RAC03,RAC04
노드로 부터 모든 노드 애플리케이션 제거.
        srvctl remove  nodeapps -n myclust-4


6) CRS 자원의 변경

srvctl modify database -d <name> [-n <db_name] [-o <ohome>] [-m <domain>]
       [-p <spfile>]  [-r {PRIMARY | PHYSICAL_STANDBY | LOGICAL_STANDBY}]
       [-s <start_options>]
srvctl modify instance -d <database-name> -i <instance-name> -n <node-name>
srvctl modify instance -d <name> -i <inst_name> {-s <asm_inst_name> | -r}
srvctl modify service -d <database-name> -s <service_name> -i <instance-name>
       -t <instance-name> [-f]
srvctl modify service -d <database-name> -s <service_name> -i <instance-name>
       -r  [-f]
srvctl modify nodeapps -n <node-name> [-A <address-description> ] [-x]

OPTIONS:

-i <instance-name> -t <instance-name>  the instance name (-i) is replaced by the
   instance name (-t)
-i <instance-name> -r the named instance is modified to be a preferred instance
-A address-list for VIP application, at node level
-s <asm_inst_name> add or remove ASM dependency

예제:

인스턴스가 다른 노드에서 실행되도록 변경.
        srvctl moinstance  -d ORACLE  -n myclust-4
서비스가 다른 노드에서 실행되도록 변경.
        srvctl modify service -d ORACLE  -s HOT_BATCH -i  RAC01 -t RAC02
인스턴스가 서비스의 선호되는 인스턴스가 되도록 변경.
        srvctl modify service -d ORACLE  -s HOT_BATCH -i  RAC02 ?r


7) SERVICE의 재 배치

srvctl relocate service -d <database-name> -s <service-name> [-i <instance-name >]-t<instance-name > [-f]

예제:

서비스를 한 인스턴스에서 다른 인스턴스로 재 배치
        srvctl relocate  service -d ORACLE -s CRM -i RAC04 -t RAC01

 

8) CRS 자원을 활성화 (자원은 이 기능을 사용할 당시 실행중이거나, 정지된 상태일 수 있음)

srvctl enable database -d <database-name>
srvctl enable instance -d <database-name> -i <instance-name> [,<instance-name-list>]
srvctl enable service -d <database-name> -s <service-name>] [, <service-name-list>] [-i <instance-name>] 

예제:

데이터베이스를 활성화.
        srvctl enable database -d ORACLE
이름이 부여된 인스턴스의 활성화. 
        srvctl enable instance  -d ORACLE -i RAC01, RAC02
서비스의 활성화. 
        srvctl enable  service -d ORACLE -s ERP,CRM
이름이 부여된 인스턴스에서 서비스의 활성화.
        srvctl enable  service -d ORACLE -s CRM -i RAC03


9) CRS 자원의 비활성화 (자원은 이 기능을 사용할 당시 정지된 상태 이어야만 함)

srvctl disable database -d <database-name>
srvctl disable instance -d <database-name> -i <instance-name> [,<instance-name-list>]
srvctl disable service -d <database-name> -s <service-name>] [,<service-name-list>] [-i <instance-name>] 

예제:

데이터베이스를 전역(global) 비활성화 시킴.
        srvctl disable database -d ORACLE
이름이 부여된 인스턴스의 비활성화. 
        srvctl disable instance  -d ORACLE -i RAC01, RAC02
서비스를 전역(global) 비활성화. 
        srvctl disable  service -d ORACLE -s ERP,CRM
이름이 부여된 인스턴스상의 서비스를 비 활성화.
        srvctl disable  service -d ORACLE  -s CRM -i RAC03,RAC04

 

추가 정보는 Oracle10g Real Application Clusters Administrator's Guide - Appendix B 참조

 

 

'Real Application Cluster' 카테고리의 다른 글

Oracle RAC GCS Monitoring  (0) 2016.02.02