오라클 RAC에 사용자 셸스크립트를 등록하는 방법을 소개하겠습니다.
RAC는 대표적인 오라클 HA(High Avalibility) 솔루션입니다. HA란 한쪽 서버에 문제가 생겼을때 다른쪽에서 서비스를 연속적으로 중단없이 하는 것을 의미합니다.
1번 DB서버가 장애가 발생하여 셧다운되는 경우 1번 서버에 있던 VIP(Virtual IP)가 2번 서버로 넘어가는 행위가 발생합니다.
이때, 사용자 어플리케이션이나 셸스크립트의 경우도 이렇게 넘겨주는(Fail Over) 것이 가능합니다.
이걸 하려면, RAC Cluster (CRS) 에 사용자 어플리케이션을 등록시켜주면 됩니다.
정확히 말하면 Cluster Resource에 User Defined Application 을 등록하는 과정입니다.
아래 오라클 매뉴얼에 자세히 나와 있습니다.
▶ Making Applications Highly Available Using Oracle Clusterware
이걸 참고해서 한번 따라해봤는데, 제가 실습한 과정을 포스팅합니다.
먼저 실습을 위해, 두개의 스크립트를 미리 준비합니다.
------------------------------------------------------------------------------------ -- 파일 생성: /tmp/Hello.sh (( 실제 실행 어플리케이션 )) ------------------------------------------------------------------------------------ while true do echo "----------------------------------------------------------------------------------" echo " Hello ~~~~ "`date` echo "----------------------------------------------------------------------------------" echo "" sleep 5 done
위 스크립트는 테스트를 위한 실제 돌아야하는 어플리케이션 이라고 보면 됩니다.
테스트를 위해 일부러 준비한 간단한 스크립트입니다.
실제 적용하는 경우는 이런 스크립트가 아니라 실제 어플리케이션으로 대체하면 되겠습니다.
아래 스크립트는 위 스크립트를 Start/Stop/Check 하는 스크립트입니다.
CRS 리소스에 등록할때 이런 스크립트가 필요합니다. 매뉴얼에 그렇게 나옵니다~
Hello.sh 이 아닌 실제 어플리케이션을 사용할 때는 아래 스크립트에서 Hello.sh 을 어플리케이션 이름으로 바꿔주면 됩니다. 물론 디렉토리도 /tmp 가 아닌 다른 것을 바꿔줘야 겠죠~~
------------------------------------------------------------------------------------ -- 파일 생성: /tmp/myHello.sh (( Hello.sh 을 Start/Stop/Check 하는 스크립트 )) -- *) 파일 실행권한 중요함. -- *) sh 파일인 경우, 맨위에 #!/bin/sh 지시자 없으면 crsctl start 안됨. ------------------------------------------------------------------------------------ #!/bin/sh BIN_DIR=/tmp LOG_DIR=/tmp BIN_NAME=Hello.sh exit_code=0 if [ ! -d $BIN_DIR ] then echo "start failed" exit 2 fi PID=`ps -ef | grep $BIN_NAME | grep -v grep | grep -v myHello.sh | awk '{ print $2 }'` case $1 in 'start') if [ "$PID" != "" ] then status="running" else if [ -x $BIN_DIR/$BIN_NAME ] then umask 002 nohup ${BIN_DIR}/${BIN_NAME} >${LOG_DIR}/${BIN_NAME}.log & status="started" else echo `basename $0`": $BIN_NAME: Executable not found" exit_code=1 fi fi echo "$BIN_NAME: $status" exit $exit_code ;; 'stop') if [ "${PID}" != "" ] then kill -9 ${PID} && echo "$BIN_NAME daemon killed" else echo "$BIN_NAME: no running Process!" fi exit $exit_code ;; 'check') if [ "$PID" != "" ] then echo "running" exit 0 else echo "not running" exit 1 fi ;; *) echo "Usage: "`basename $0`" {start|stop|check}" ;; esac
위 두 스크립트를 /tmp 디렉토리에 만들어둡니다.
RAC 모든 노드에 똑같이 만들어줘야 합니다.
1번 노드에서 장애시 2번 노드에서 똑같이 실행하려면 당연히 2번 노드에 똑같은 위치에 똑같은 파일이 있어야 하니까요~~
또, CRS 가 우리 대신 실행시켜줘야 하기 때문에 실행이 가능하도록 파일실행권한 주는 것도 잊지말아야 합니다. (chmod 755)
CRS 에 등록하기 전에 스크립트가 잘 실행되는지 먼저 테스트 해봅니다.
아래는 전반적으로 정리한 등록 구문 및 테스트 구문 입니다.
------------------------------------------------------------------------------------ -- 리소스 등록 및 Failover 테스트 ------------------------------------------------------------------------------------ /* 1) 리소스 등록 */ crsctl add resource myHello.sh -type cluster_resource -attr \ "AUTO_START=always, \ RESTART_ATTEMPTS=2, \ START_TIMEOUT=100, \ STOP_TIMEOUT=100, \ CHECK_INTERVAL=60, \ ACTION_SCRIPT=/tmp/myHello.sh, \ START_DEPENDENCIES=hard(type:ora.cluster_vip_net1.type) pullup(type:ora.cluster_vip_net1.type), \ STOP_DEPENDENCIES=hard(intermediate:type:ora.cluster_vip_net1.type)" /* 2) 리스소 등록된 것 확인 */ crsctl stat res -t /* 3) 리소스 Start */ crsctl start resource myHello.sh /* 4) VIP 강제 Failover -- 1번 vip 를 넘기면 myHello.sh 도 1번에서 2번으로 넘어감. -- 2번 vip 를 넘기면 myHello.sh 도 2번에서 1번으로 넘어감. -- 하지만, 이미 넘어간 vip 가 되돌아오는 경우에는 myHello.sh 도 같이 따라서 돌아오지는 않음. 이건 수동으로... */ crsctl relocate res ora.ol6rac1.vip -f crsctl relocate res ora.ol6rac2.vip -f
1)
crsctl add resource 명령으로 등록합니다.
위에서 만든 /tmp/myHello.sh 파일을 myHello.sh 이라는 이름으로 리소스에 등록합니다.
마지막에 START_DEPENDENCIES, STOP_DEPENDENCIES 에 cluster_vip 등등이 나옵니다.
그래서 이게 vip 가 넘어갈때 얘도 따라서 같이 넘어갑니다.
2)
리소스 등록 여부는 crsctl stat res -t 커맨드로 확인할 수 있습니다.
3)
등록된 리소스를 Startup 시킬 때는 crsctl start 커맨드를 사용해야 합니다.
스크립트를 그냥 실행시키면 안됩니다. 그러면 상태가 계속 OFFLINE 으로 나옵니다.
crsctl start 할때 특별히 노드를 지정하지 않았기 때문에 현재는 2번 노드에서 기동되었습니다.
1번에서 띄우려면 crsctl start resource myHello.sh -n ol6rac1 와 같이 노드를 지정하면 됩니다.
실제로, 2번 노드에서 Hello.sh 이 기동되어 실행중인지 확인해봅니다.
Hello.sh.log 로그파일이 생성되어 있고, check 명령으로 running 인 것을 확인할 수 있습니다.
4)
이제 Failover 테스트만 남았습니다.
crsctl relocatecrsctl relocate res ora.ol6rac1.vip -f 커맨드는 vip 를 강제로 넘기는 커맨드입니다. 장애상황처럼 만드는 것이죠~
이 명령을 실행하면 1번 노드에 있는 vip 를 2번 노드로 옮깁니다. 이때 myHello.sh 도 반대편에서 자동으로 기동시켜줍니다.
지금은 2번 노드에 떠 있으니까 crsctl relocatecrsctl relocate res ora.ol6rac2.vip -f 커맨드를 사용해서 2번 노드의 vip 를 1번으로 강제로 넘겨보겠습니다.
vip 넘어가는 메시지가 나오면서 myHello.sh 도 ol6rac1 노드로 성공적으로 넘어갔다고 메시지가 나오네요.
1번 노드에 가서 확인해보면 자동으로 기동된 것을 확인할 수 있습니다.
crsctl stat res -t 커맨드로 확인해 보면, vip 1,2 번 둘다 ol6rac1 노드에 가있고, myHello.sh 도 1번 노드에서 online 중이라는 것을 확인할 수 있습니다.
이렇게 해서 우리가 만든 사용자 스크립트 myHello.sh 이 정상적으로 Failover 되는 것을 확인해봤습니다.
테스트로 만든 사용자리소스를 CRS 에서 제거하려면 아래의 커맨드를 사용하면 됩니다.
------------------------------------------------------------------------------------ -- 리소스 Stop 및 제거 ------------------------------------------------------------------------------------ crsctl stop resource myHello.sh crsctl delete resource myHello.sh