DRCP에 대한 연결 드레이닝 (Connection Draining) 종료

DRCP(Database Resident Connection Pooling) 소개

Oracle Database Resident Connection Pooling(DRCP)은 데이터베이스 서버에 연결된 클라이언트 연결을 재사용하여 리소스 사용률을 최적화하는 기능입니다. DRCP를 통해 애플리케이션은 데이터베이스에 빠르게 연결 및 연결 해제할 수 있어, 웹 애플리케이션과 같이 연결/해제가 빈번한 환경에서 성능을 향상시킬 수 있습니다.

연결 드레이닝 종료(Connection Draining)의 필요성

연결 드레이닝은 애플리케이션 서버 또는 특정 DRCP 풀을 안전하게 종료하거나 유지보수하기 위해 필요한 절차입니다. 연결 드레이닝을 통해 기존 활성 연결을 정상적으로 종료하고, 더 이상 새로운 연결이 해당 풀에 할당되지 않도록 함으로써 다운타임을 최소화하고 데이터 무결성을 보장합니다.

DRCP 풀 종료 방법

DRCP 풀을 종료하는 방법은 다음과 같습니다.

1. 기본 DRCP 풀 종료

기본 DRCP 풀은 `SYS_DEFAULT_CONNECTION_POOL`로 명명되어 있으며, 데이터베이스 시작 시 자동으로 활성화됩니다. 이 풀을 종료하려면 SYS 권한을 가진 사용자로 데이터베이스에 접속하여 다음 명령을 실행합니다.

EXEC DBMS_CONNECTION_POOL.STOP_POOL('SYS_DEFAULT_CONNECTION_POOL');

이 명령은 기본 풀을 종료하고 더 이상 새로운 연결을 허용하지 않습니다. 기존 연결은 정상적으로 종료될 때까지 유지됩니다.

2. 사용자 정의 DRCP 풀 종료

사용자 정의 풀을 종료하려면 풀 이름을 지정하여 `DBMS_CONNECTION_POOL.STOP_POOL` 명령을 실행합니다.

EXEC DBMS_CONNECTION_POOL.STOP_POOL('MY_DRCP_POOL');

연결 드레이닝 (Connection Draining) 활성화

연결 드레이닝 종료는 특정 풀을 종료하기 전에 활성 연결이 모두 해제되도록 보장합니다. 연결 드레이닝을 활성화하는 방법은 다음과 같습니다.

1. TNS 리스너 설정

TNS 리스너 설정을 변경하여 특정 DRCP 풀에 대한 연결 요청을 지정된 시간 동안만 허용하도록 설정할 수 있습니다. `LISTENER.ORA` 파일에 다음과 같은 설정을 추가합니다.

(SID_DESC =
  (GLOBAL_NAME = myservice.example.com)
  (SID_NAME = orcl)
  (FAILOVER_MODE =
  (TYPE = SESSION)
  (METHOD = BASIC)
  (RETRIES = 240)
  (DELAY = 1)
  )
)

여기서 `RETRIES`는 재시도 횟수를, `DELAY`는 재시도 간 간격을 초 단위로 설정합니다. 이 설정은 지정된 시간 동안 연결 요청을 재시도하도록 하며, 이후에는 연결을 거부합니다.

2. 연결 제한 시간 설정

애플리케이션 코드 또는 연결 문자열에서 연결 제한 시간을 설정하여 데이터베이스 서버에 대한 연결 시도를 제한할 수 있습니다. Java JDBC 연결 문자열의 예시는 다음과 같습니다.

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=myhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myservice)(UR=A)(SERVER=DEDICATED)))?connectTimeout=10;

여기서 `connectTimeout=10`은 연결 시도 후 10초 이내에 연결이 설정되지 않으면 오류를 반환하도록 지정합니다.

실전 예시: DRCP 풀 종료 및 연결 드레이닝 시나리오

다음은 실제 운영 환경에서 DRCP 풀을 안전하게 종료하고 연결 드레이닝을 수행하는 시나리오입니다.

1. 시나리오

웹 애플리케이션 서버를 재시작해야 하며, 이 과정에서 DRCP 풀 `MY_WEB_POOL`을 종료해야 합니다. 활성 연결을 안전하게 종료하고 새로운 연결을 막기 위해 연결 드레이닝을 수행합니다.

2. 절차

  1. DRCP 풀 중지:
    EXEC DBMS_CONNECTION_POOL.STOP_POOL('MY_WEB_POOL');
  2. 리스너 재시작:

    TNS 리스너를 재시작하여 새로운 연결을 막습니다. (선택 사항)

    lsnrctl stop
    lsnrctl start
  3. 애플리케이션 서버 재시작:

    애플리케이션 서버를 재시작하여 기존 연결을 정상적으로 종료합니다.

3. 주의 사항

풀 종료 전에 활성 연결이 모두 종료되었는지 확인해야 합니다. `V$CIRCUIT` 뷰를 사용하여 활성 연결을 확인할 수 있습니다.

문제 해결 및 추가 고려 사항

DRCP 풀 종료 시 다음과 같은 문제들이 발생할 수 있으며, 이에 대한 해결책은 다음과 같습니다.

  • 활성 연결로 인한 풀 종료 지연:

    `V$CIRCUIT` 뷰를 통해 활성 연결을 확인하고, 해당 연결을 사용하는 세션을 종료하거나 애플리케이션에서 연결을 닫도록 유도합니다.

  • 애플리케이션 오류:

    연결 제한 시간 설정이 너무 짧으면 애플리케이션에서 연결 오류가 발생할 수 있습니다. 연결 제한 시간을 적절히 조정하여 애플리케이션이 정상적으로 연결을 종료할 수 있도록 합니다.

  • 데이터 무결성 문제:

    연결 드레이닝 과정에서 커밋되지 않은 트랜잭션이 있는지 확인하고, 필요한 경우 롤백하거나 커밋합니다.

결론

DRCP 환경에서 연결 드레이닝 종료는 데이터베이스 및 애플리케이션의 안정적인 운영을 위해 필수적인 절차입니다. 위에 제시된 방법과 예시를 통해 DRCP 환경을 효율적으로 관리하고 유지보수할 수 있습니다.

위로 스크롤