로드 밸런싱 어드바이저 (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은 애플리케이션이 다른 활성 노드로 트래픽을 자동으로 리디렉션하도록 보장합니다.
- 데이터베이스 롤링 업그레이드를 시작하기 전에 FAN이 모든 애플리케이션에 올바르게 구성되었는지 확인합니다.
- 업그레이드 과정에서 `srvctl status service -d
` 명령어를 사용하여 서비스 상태를 모니터링합니다. - 업그레이드 후 모든 서비스가 `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을 올바르게 구성하고 활용함으로써 애플리케이션은 클러스터의 상태 변화에 신속하게 대응하여 중단 시간을 최소화하고 사용자 경험을 향상시킬 수 있습니다.