[05] FAN 콜아웃 (Callouts)을 이용한 서비스 자동 재배치 방법

서비스를 이용해서 워크로드를 관리해보니 로드 밸런싱과 Failover 부분은 아주 좋은 것 같습니다. 그런데 문제점이 하나 있습니다. 노드가 복구된 후에도 Failover된 서비스들이 원래 노드로 이동하지 않습니다. 현재는 수동으로 서비스 stop/start를 수행해서 재배치를 하고 있습니다만 자동으로 서비스 재배치가 가능할까요?

네! 가능합니다. FAN 콜아웃 (Callouts)을 이용하면 서비스 자동 재배치가 가능합니다. 그럼 한번 살펴볼까요?

5-1. FAN 이벤트란?


Fast Application Notification (FAN)은 오라클 10g부터 제공되는 기능으로써 가용성을 향상시킬 목적으로 도입된 기능입니다. 가용성을 향상시키기 위해서는 클러스터 노드 내에 문제가 발생했는 때 아주 빠르게 문제 상황을 전파할 필요가 있습니다. 오라클은 이러한 문제가 발생했을 때 FAN 메시지를 클러스터 내에 신속하게 전파함으로써 문제 상황을 빠르게 응대할 수 있도록 합니다. FAN 메시지의 유형은 크게 3가지로 구분됩니다.

  1. 서비스 (애플리케이션, 인스턴스) up/down 관련 이벤트
  2. 노드 up/down 관련 이벤트
  3. 로드 밸런싱 관련 이벤트

이번 포스팅에서 다룰 내용은 인스턴스 up/down시에 발생하는 FAN 메시지를 활용한 콜아웃 수행 방법입니다.

5-2. FAN 콜아웃 (Callouts)이란?


이름이 다소 생소할 수 있는 FAN 콜아웃은 클러스터 내에서 FAN 메시지가 발생했을 때, 자동으로 수행되는 사용자 정의 스크립트 (및 프로그램)를 의미합니다. 콜아웃은 Shell 프로그램, Perl 프로그램, C Executable등, 실행할 수 있는 형태의 파일이면 모두 가능합니다. 콜아웃은 $GRID_HOME/racg/usrco 디렉토리에 저장하면 됩니다.

5-3. FAN 콜아웃은 누가 수행할까요?


테스트 결과, FAN 콜아웃은 oraagent.bin 프로세스가 수행합니다. (검증 방법은 테스트-1 참조)

테스트-1. FAN 콜아웃 수행 프로세스 확인방법

[oracle@racnode01h ~]$ cd /u01/app/12.1.0/grid/racg/usrco
[oracle@racnode01h usrco]$ vi sleep.sh
#!/bin/bash
sleep 120
exit
[oracle@racnode01h usrco]$ chmod 700 sleep.sh 

[oracle@racnode01h usrco]$ ps -ef | grep pmon
oracle    1681     1  0 06:28 ?        00:00:00 asm_pmon_+ASM1
oracle    3359     1  0 06:35 ?        00:00:00 ora_pmon_OOW1

[oracle@racnode01h usrco]$ kill -9 3359

[oracle@racnode01h usrco]$ ps -ef | grep sleep
oracle    4404  1323  0 06:56 ?        00:00:00 /bin/bash /u01/app/12.1.0/grid/racg/usrco//sleep.sh INSTANCE VERSION=1.0 service=oow database=oow instance=OOW1 host=racnode01h status=up reason=USER timestamp=2016-06-26 09:56:28 timezone=-04:00 db_domain=
[oracle@racnode01h usrco]$ ps -ef | grep 1323
oracle    1323     1  0 06:27 ?        00:00:11 /u01/app/12.1.0/grid/bin/oraagent.bin

Note
참고로, FAN 메시지는 Oracle Notification Service (ONS)가 청취하는 것으로 알려져 있으나, 테스트 결과 ONS 데몬을 다운시킨 상태에서도 FAN 메시지는 oraagent.bin에게 전달되는 것을 확인했습니다. 이것이 “그림-1″에 ONS와 oraagent.bin 간의 관계를 “?”로 한 이유입니다.

그림-1. FAN 콜아웃 수행 구조도

05-1

5-4. FAN 메시지 구성 요소


FAN 메시지는 7개의 구성요소로 이루어집니다. FAN 메시지 유형 중에서 애플리케이션 up/down 및 인스턴스 up/down과 관련된 메시지는 다음과 같습니다.


예시-1. ONLINE_SRV 서비스가 up된 경우의 FAN 메시지

아규먼트[0] SERVICE
아규먼트[1] VERSION=1.0
아규먼트[2] service=ONLINE_SRV
아규먼트[3] database=oow
아규먼트[4] instance=OOW2
아규먼트[5] host=racnode02h
아규먼트[6] status=up

아규먼트[0] SERVICEMEMBER
아규먼트[1] VERSION=1.0
아규먼트[2] service=ONLINE_SRV
아규먼트[3] database=oow
아규먼트[4] instance=OOW3
아규먼트[5] host=racnode03h
아규먼트[6] status=up

예시-2. OOW1 인스턴스가 up된 경우의 FAN 메시지

아규먼트[0] INSTANCE
아규먼트[1] VERSION=1.0
아규먼트[2] service=oow
아규먼트[3] database=oow
아규먼트[4] instance=OOW1
아규먼트[5] host=racnode01h
아규먼트[6] status=up

5-5. FAN 메시지를 이용한 자동 재배치(Auto Rebalancing) 콜아웃 설정


인스턴스가 기동 된 직후에 “예시-2″와 같은 FAN 메시지를 제공받게 되므로, 해당 FAN 메시지를 이용해서 자동 재배치 기능을 구현할 수 있습니다. 자동 재배치를 위한 auto_rebalance.sh를 $GRID_HOME/racg/usrco 에 저장한 후 파일 퍼미션을 700으로 변경합니다.

[oracle@racnode01h usrco]$ vi auto_rebalance.sh

#!/bin/bash
export LANG=C
export LOG=/u01/app/12.1.0/grid/racg/log/auto_rebalance.log
export ORACLE_HOME=/u01/app/12.1.0/grid/
export PATH=$PATH:$ORACLE_HOME/bin
export HOST=`hostname | cut -f 1 -d .`

touch $LOG

if [ "$1" = "INSTANCE" ]; then
argmts=($*)
INSTANCE_NAME=`echo ${argmts[4]}|cut -d '=' -f 2`
HOST_NAME=`echo ${argmts[5]}|cut -d '=' -f 2`
INSTANCE_STATUS=`echo ${argmts[6]}|cut -d '=' -f 2`

if [[ "$INSTANCE_STATUS" = "up" && "$HOST_NAME" = "$HOST" ]]; then
echo "[`date`] Starting the rebalance of services on Node $INSTANCE_NAME" >> $LOG

services=`srvctl config service -d OOW | egrep '(Service name|Preferred)' | awk '{print $NF}'| paste -s -d",\n" | grep $INSTANCE_NAME | cut -d ',' -f1`

for i in $services
do
echo $i
srvctl stop  service -s $i -d OOW
srvctl start service -s $i -d OOW
done

echo -e "The following services have been relocated to $INSTANCE_NAME:\n$services " >> $LOG
fi
fi

[oracle@racnode01h usrco]$ chmod 700 auto_rebalance.sh

Note
쉘 프로그램 출처: http://www.learnoracledba.com/auto-services-rebalancing-using-fan-cluster-callouts

5-6. 자동 재배치 콜아웃 설정 후 테스트 수행


자동 재배치 콜아웃 테스트 결과, OOW1 인스턴스가 시작한 직후에 3번 노드로 Failover된 ONLINE_SRV 서비스가 1번 노드로 자동으로 재배치 된 것을 확인할 수 있습니다. 이와 같이, FAN 콜아웃을 이용하면 자동 재배치 뿐 아니라, FAN 관련 이벤트에 대한 다양한 처리를 할 수 있습니다. RAC 운영 시에 한번쯤 생각해보면 좋은 기능인 것 같습니다.

[oracle@racnode01h usrco]$ srvctl status service -d OOW
Service BATCH_SRV  is running on instance(s) OOW3
Service ONLINE_SRV is running on instance(s) OOW2,OOW3

[oracle@racnode01h usrco]$ ps -ef | grep pmon
oracle    1681     1  0 06:28 ?        00:00:00 asm_pmon_+ASM1
oracle    1980     1  0 06:29 ?        00:00:00 ora_pmon_OOW1

[oracle@racnode01h usrco]$ kill -9 1980

[oracle@racnode01h usrco]$ srvctl status service -d OOW
Service BATCH_SRV  is running on instance(s) OOW3
Service ONLINE_SRV is running on instance(s) OOW2,OOW3

-- OOW1 인스턴스 up 직후에 ONLINE_SRV 서비스가 자동으로 재배치됨 
[oracle@racnode01h usrco]$ ps -ef | grep pmon
oracle    1681     1  0 06:28 ?        00:00:00 asm_pmon_+ASM1
oracle    3359     1  0 06:35 ?        00:00:00 ora_pmon_OOW1

[oracle@racnode01h usrco]$ srvctl status service -d OOW
Service BATCH_SRV  is running on instance(s) OOW3
Service ONLINE_SRV is running on instance(s) OOW1,OOW2

글을 마치며


오라클 서비스를 이용한 워크로드 관리를 설명하다가 FAN 콜아웃까지 설명을 하게 되었습니다. 필드에서 “서비스”를 범용적으로 사용하는지는 잘 모르겠으나 꽤 좋은 기능인 것만은 확실합니다. “서비스”에 대한 학습을 한 김에 다음 포스팅은 “서비스”를 이용한 성능관리 방안에 대해서 정리할 예정입니다.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s