로드 균형 조정 권고 (Load Balancing Advisory) FAN 이벤트 수신

로드 밸런싱 어드바이저 (FAN) 이벤트 개요

Oracle Real Application Clusters (RAC) 환경에서 애플리케이션은 서비스 품질과 가용성을 유지하기 위해 워크로드를 여러 노드에 분산합니다. 로드 밸런싱 어드바이저 (FAN)는 이 과정을 자동화하고 최적화하는 핵심 메커니즘입니다. FAN 이벤트는 RAC 클러스터의 상태 변화 (예: 노드 다운, 서비스 시작/종료)를 실시간으로 애플리케이션에 알립니다. 애플리케이션은 이 정보를 사용하여 트래픽을 가장 건강한 노드로 지능적으로 리디렉션함으로써 중단 시간을 최소화하고 사용자 경험을 개선할 수 있습니다.

FAN 이벤트 유형

FAN 이벤트는 크게 다음과 같은 유형으로 나뉩니다:

  • UP: 서비스가 사용 가능하게 되었음을 나타냅니다. 새로운 인스턴스 시작 또는 기존 인스턴스 복구 후에 발생합니다.
  • DOWN: 서비스가 더 이상 사용 불가능함을 나타냅니다. 노드 장애, 인스턴스 종료 등의 이유로 발생합니다.
  • LOAD_BALANCING ADVISORY: 연결 시 선호하는 인스턴스 목록을 제공합니다. 워크로드 레벨에서의 로드 변화에 따라 리스트는 동적으로 바뀔 수 있습니다.

FAN 이벤트 설정 및 활용 방법

FAN 이벤트를 활용하려면 다음 단계를 따릅니다:

1. OCI (Oracle Call Interface) 기반 애플리케이션

OCI 기반 애플리케이션의 경우, 런타임 연결 로드 밸런싱은 Oracle Database 11g Release 1 (11.1) 이후 버전에서 기본적으로 활성화되어 있습니다. FAN HA(Fast Application Notification)를 사용하려면 OCI 환경을 스레드 라이브러리와 연결하고, 로드 밸런싱 목표를 세션에 맞게 구성해야 합니다. OCI_ATTR_SVCCTX를 사용하여 서비스에 대한 FAN HA를 활성화합니다. 다음은 OCI 애플리케이션에서 FAN을 구성하는 데 필요한 코드 조각의 예시입니다:

    
    /* OCI 환경 설정 */
    OCIEnvCreate(&envhp, OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0,
                 (dvoid * (*)(dvoid *, dvoid *, size_t)) 0, (void (*)(dvoid *, dvoid *)) 0,
                 (size_t)0, (dvoid **)0);
    /* 서비스 컨텍스트 핸들 획득 */
    OCIHandleAlloc(envhp, (dvoid**)&svchp, OCI_HTYPE_SVCCTX, (size_t)0, (dvoid **)0);
    /* FAN HA 속성 설정 */
    OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, &OCI_FAN_HA_ENABLE, (ub4)sizeof(OCI_FAN_HA_ENABLE), OCI_ATTR_HA, errhp);
    
  

여기서 `envhp`는 OCI 환경 핸들이고, `svchp`는 서비스 컨텍스트 핸들, `errhp`는 에러 핸들입니다. `OCI_FAN_HA_ENABLE` 속성은 FAN HA를 활성화하는 데 사용됩니다.

2. OCCI (Oracle C++ Call Interface) 기반 애플리케이션

OCCI 애플리케이션의 경우, OCI와 마찬가지로 스레드 라이브러리와의 연결, 세션 구성이 필요합니다. 다음은 OCCI에서 FAN을 활성화하는 데 필요한 단계의 예시입니다.

    
   /* OCCI 환경 설정 */
    Environment* env = Environment::createEnvironment(Environment::DEFAULT);
    /* 연결 풀 생성 */
    ConnectionPool* pool = env->createConnectionPool(username, password, connectString, 1, 5, ConnectionPool::ConnectionMode::SESSION_MODE);
   /* 세션 구성, FAN 활성화는 기본적으로 활성화 */
   Connection* conn = pool->createConnection();
    
  

3. JDBC (Java Database Connectivity) 기반 애플리케이션

JDBC 환경에서 런타임 연결 로드 밸런싱은 Oracle Database 10g Release 2 (10.2) 이후 버전에서 기본적으로 활성화되어 있습니다. Fast Connection Failover (FCF) 풀링을 사용하면 애플리케이션이 FAN 이벤트를 활용할 수 있습니다. 다음은 JDBC 연결 문자열의 예시입니다:

      
jdbc:oracle:thin:@(DESCRIPTION=
    (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=racnode1)(PORT=1521))
                   (ADDRESS=(PROTOCOL=TCP)(HOST=racnode2)(PORT=1521)))
    (CONNECT_DATA=(SERVICE_NAME=myservice.example.com))
    (LOAD_BALANCE=on)(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)))
      
    

연결 문자열에 `LOAD_BALANCE=on`을 설정하여 로드 밸런싱을 활성화하고, `FAILOVER_MODE`를 설정하여 장애 발생 시 동작을 정의합니다. `TYPE=SELECT`는 장애 발생 시 연결을 재시도하고, `METHOD=BASIC`은 기본적인 장애 처리 방법을 사용함을 의미합니다.

4. ODP.NET 기반 애플리케이션

ODP.NET 애플리케이션의 경우, 연결 문자열에 다음 속성을 추가하여 런타임 연결 로드 밸런싱을 활성화합니다:

      
Load Balancing=true;
HA Events=true;
      
    

`Load Balancing=true`는 로드 밸런싱을 활성화하고, `HA Events=true`는 FAN 이벤트를 활용하도록 ODP.NET을 구성합니다. 서비스 이름은 다음과 같이 구성됩니다:

    
Data Source= (DESCRIPTION =
    (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = racnode1)(PORT = 1521))
                   (ADDRESS = (PROTOCOL = TCP)(HOST = racnode2)(PORT = 1521)))
    (CONNECT_DATA = (SERVICE_NAME = myservice.example.com)))
    
  

실전 예제: 롤링 업그레이드 시 FAN 이벤트 활용

RAC 환경에서 데이터베이스 롤링 업그레이드를 수행하는 동안 FAN 이벤트를 사용하여 애플리케이션의 가용성을 유지할 수 있습니다. 노드 업그레이드 시 해당 노드의 서비스가 일시적으로 중단되지만, FAN은 애플리케이션이 다른 활성 노드로 트래픽을 자동으로 리디렉션하도록 보장합니다.

  1. 데이터베이스 롤링 업그레이드를 시작하기 전에 FAN이 모든 애플리케이션에 올바르게 구성되었는지 확인합니다.
  2. 업그레이드 과정에서 `srvctl status service -d ` 명령어를 사용하여 서비스 상태를 모니터링합니다.
  3. 업그레이드 후 모든 서비스가 `UP` 상태인지 확인합니다.

샘플 코드

다음은 FAN HA를 사용할 수 있도록 OCI 애플리케이션을 수정하는 방법을 보여 주는 샘플 코드 스니펫입니다. 이 코드에서는 연결 풀이 만들어지고, FAN HA 속성이 설정됩니다.

    
#include 

int main()
{
    /* OCI 변수 */
    OCIEnv *envhp = (OCIEnv *)0;
    OCISvcCtx *svchp = (OCISvcCtx *)0;
    OCIError *errhp = (OCIError *)0;

    /* OCI 환경 생성 */
    OCIEnvCreate(&envhp, OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0,
                 (dvoid * (*)(dvoid *, dvoid *, size_t)) 0, (void (*)(dvoid *, dvoid *)) 0,
                 (size_t)0, (dvoid **)0);
    /* 에러 핸들 생성 */
    OCIHandleAlloc((dvoid *)envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);

    /* 서비스 컨텍스트 획득 */
    OCIHandleAlloc((dvoid *)envhp, (dvoid **)&svchp, OCI_HTYPE_SVCCTX, (size_t)0, (dvoid **)0);

    /* HA 속성 지정 */
    ub4 ha_val = OCI_FAN_HA_ENABLE;
    OCIAttrSet((dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)&ha_val, (ub4)sizeof(ha_val), OCI_ATTR_HA, errhp);

    /* ... 데이터베이스 작업 수행 ... */
    /* 핸들 해제 */
    OCIHandleFree((dvoid *)svchp, OCI_HTYPE_SVCCTX); 
    OCIHandleFree((dvoid *)envhp, OCI_HTYPE_ENV); 
    return 0;
}
    
  

결론

로드 밸런싱 어드바이저 (FAN) 이벤트는 Oracle RAC 환경에서 애플리케이션의 가용성과 성능을 보장하는 데 필수적인 요소입니다. FAN을 올바르게 구성하고 활용함으로써 애플리케이션은 클러스터의 상태 변화에 신속하게 대응하여 중단 시간을 최소화하고 사용자 경험을 향상시킬 수 있습니다.

위로 스크롤