IT기술/Oracle

03 RAC 기반에서 Load Balancing 과 Application Failover (2/2)

dobbby 2021. 6. 18. 17:20
반응형

2. Application Failover 설정하기

이번 장에서는 장애 상황을 대비한 RAC의 탁월한 Application Failover 기능인 Transparent Application Failover (이하 TAF 라고 하겠습니다) 와
Connection Time Failover (이하 CTF 라고 하겠습니다) 에 대해서 자세하게 살펴보겠습니다.

Client 는 tnsnames.ora 파일에 지정되어 있는 설정 값을 참고해서 RAC 서버로 접속을 하게 됩니다.
그런데 만약 RAC1 에 장애가 있어 접속이 안될 경우 관리자의 간섭이나 별다른 조치 없이 자동으로 RAC2 를 찾아서 접속을 하게 만들어서 Storage 에 저장되어 있는 데이터에 접근할 수 있도록 만들어 주는 기능을 CTF 라고 부릅니다.
즉, 사용자 입장에서는 장애를 알 수 없고 서비스는 계속 접속이 되는 경우입니다. 
단, 기존에 RAC1 에 접속되어 있던 사용자는 접속이 끊어지고 재 접속을 할 경우 자동으로 RAC2 로 연결이 되며 
하고 있던 작업 중 commit 안된 작업은 모두 취소됩니다.  

이 CTF 라는 기능은 RAC 를 구현할 경우 tnsnames.ora 에 설정된 정보를 참고하여 기본적으로 지원이 됩니다
그런데 CTF 의 단점은 위 예의 경우 새로운 접속 요청은 RAC2 로 연결되어 문제가 없지만 장애가 발생한 RAC1 에서 작업하던 세션들은 모두 중단되고 RAC2 로 새로 접속해서 다시 시작해야 한다는 것입니다.

이런 문제를 해결하기 위해 등장한 해결방법이 TAF 라는 기술입니다.
즉 TAF 를 구현하면 RAC1 에 장애가 발생되어 인스턴스가 비정상 종료되어도 RAC1 에서 작업을 하던 사용자의 작업이 RAC2 로 그대로 넘어가서 사용자는 끊임이 없는 작업을 지속할 수 있다는 것입니다.
단, 이 작업은 조회하는 ( SELECT ) 작업에만 적용이 됩니다.
TAF 기능은 Client 의 tnsnames.ora 파일의 설정을 변경하여 구현할 수 있으며 TAF 와 관련된 파라미터는 FAILOVER 와 FAILOVER_MODE 가 있습니다.

FAILOVER 는 FAILOVER 를 사용할 것인가를 설정하는 파라미터 이며 ON / OFF 또는 YES / NO 의 값을 설정할 수 있고 기본값은 OFF 입니다.
FAILOVER_MODE 는 TYPE 과 METHOD 의 세부 항목을 가지고 있습니다.
이 중에서 TYPE 에는 SESSION , SELECT  , NONE 의 값이 올 수 있으며 의미는 아래와 같습니다.

* SESSION : 이 방식은 Client 가 select 를 수행하고 있는 도중에 해당 인스턴스가 장애 나서 중단 될 경우 
수행되던 SELECT 문은 에러가 발생하고 중단됩니다. 그리고 문제가 없는 다른 서버로 자동으로 재 접속이 됩니다. 

* SELECT : 이 방식은 위의 SESSION 보다 발전한 방법으로 기존 서버에서 수행 중이던 SELECT 문장을 새로운 서버에 접속 한 후 계속 수행해서 오류 없이 결과를 만들어 주는 방법입니다. MATHOD 항목에는 BASIC 과 PRECONNECT 값이 올 수 있으며 그 의미는 아래와 같습니다.

* BASIC : 장애가 발생할 경우 다른 서버를 찾아서 접속을 시도하는 방식입니다.
* PRECONNECT : 처음 접속을 할 때 장애를 대비해서 두 개의 접속을 미리 수행하는 방식입니다. 

즉 RAC1 에 접속할 때 장애를 대비해서 RAC2 에 미리 접속을 해 두었다가 장애가 발생했을 때 새로운 서버를 찾아 접속하는 시간을 줄이는 방식입니다. 
이 방식은 만일의 경우를 위해 현재 사용하지 않는 세션을 하나 더 연결해서 리소스를 낭비 할 수 있으므로 주의해야 합니다.
위에서 살펴본 여러 가지 설정들을 직접 실습을 통해 확인해 보겠습니다.

 

*CASE 1 : TAF 기능을 사용 하지 않은 경우 (CTF 기능만 작동)
Step 1. Client 의 tnsnames.ora 의 설정은 아래와 같습니다.

 

 

Step 2. PC에서 sqlplus 로 RAC 에 접속한 후 접속한 인스턴스를 확인합니다.

 

 

Step 3. 장애를 발생시키기 위해 rac2 에 직접 접속해서 shutdown abort 시킬 준비합니다.
SQL> shutdown abort ;

Step 4. Client PC 에서 select * from dba_tables ; 를 수행한 후 위 Step 3 에서 접속한 서버에서 shutdown abort 를 수행합니다.
SQL> shutdown abort ;

위와 같이 rac1 에 장애를 발생 시킨 후 pc 에서 select 를 수행했던 창을 확인합니다.

 

 

위 화면과 같이 서버에서 접속이 강제로 종료되어서 수행되던 SELECT 문장이 실패하게 됩니다.
이 상황에서 PC 에서 새로운 창을 열어 rac 에 접속 시도를 합니다.

 

 

신규 접속은 잘 되는 것이 확인됩니다.  이런 CTF 상태가 RAC를 구축하면 기본으로 설정됩니다.

* CASE 2: TAF 사용 - TYPE = SESSION , METHOD = BASIC 설정 테스트하기
Step 1. Client 의 tnsnames.ora 파일에 아래의 항목을 추가한 후 저장합니다.

 

위 설정에서 TYPE = SESSION 이라는 부분이 중요합니다.

Step 2. PC에서 rac 로 접속 한 후 확인하니 rac2 에 접속한 것이 확인됩니다.

 

 

Step 3. 위와 같이 Client 창(PC) 에서 select * from dba_tables 를 실행한 후 몇 초 후 아래와 같이 rac2 서버의 터미널에서 shutdown abort 로 강제 종료합니다.
SQL> shutdown abort ;

Step 4. PC 에서 수행되던 select 가 강제 종료 된 것을 확인 할 수 있습니다.
그리고 현재 접속된 서버를 확인하니까 원래 rac2 에 접속해 있었는데 rac1 으로 변경된 것이 확인됩니다.

 

 

정리하면 FAILOVER_MODE 의 TYPE = SESSION 으로 설정하게 되면 수행되던 SELECT 문장은 실패하지만 
현재 연결되어 있는 접속은 다른 서버로 재 접속 시켜 준다는 것입니다.

* CASE 3: TAF 사용 - TYPE = SELECT , METHOD = BASIC 설정 테스트하기
Step 0. crs_start  -all 명령을 수행해서 모든 노드가 정상적으로 OPEN 되는지 확인 합니다.
Step 1. Client 의 tnsnames.ora 파일을 아래와 같이 변경 후 저장합니다

 


Step 2. Client 에서 sqlplus 로 아래와 같이 접속한 후 노드를 확인합니다.

 

 

 

Step 3. rac1 노드에 직접 접속해서 shutdown abort 로 장애 발생 준비합니다.
SQL> shutdown abort ;

Step 4. Client 에서 select * from dba_tables 를 조회한 후 rac1 에서 shutdown abort; 를 수행해서 장애를 발생 시킵니다. 
그리고 Client 창을 확인합니다.

 

 

위 화면을 보면 rac2 노드로 바뀐 것이 확인됩니다.
이 화면에는 나오지 않지만 rac1 노드의 터미널에서 shutdown abort ; 를 했을 때 위 화면에서 출력이 되다가 
잠시 멈춘 후 계속 조회가 되는 것이 확인이 됩니다

* CASE 4: TAF 사용 - TYPE = SELECT , METHOD = PRECONNECT 설정 테스트하기
Step 0. crs_start -all 명령으로 모든 노드를 정상적으로 Open 시킵니다.
Step 1. 클라이언트(여기서는 PC)의 tnsnames.ora 파일을 아래와 같이 변경합니다.
( 주의 : PRECONNECT 방식을 쓰기 위해서는 아래와 같이 backup 설정이 되어야 합니다.)

 

 

Step 2. 클라이언트에서 접속을 한 후 접속 내용을 조회합니다.

 

 

위와 같이 접속하기 위해서는 당연히 서버에 scott 계정이 생성되어 있어야 합니다.
그리고 위와 같이 접속을 조회하기 위해서는 scott 계정이 dba 권한이 있어야 합니다

위에서 사용한 se.sql 의 내용은 아래와 같습니다.

 

 

아래의 화면은 서버에서 직접 동일한 쿼리를 조회해서 확인한 화면입니다..

 

 

Step 3. 위에서 rac1 번에 접속한 것으로 확인되므로 rac1 에서 접속테스트를 수행합니다.
방법은 위에서 했던 방법으로 클라이언트에서 select * from dba_tables 를 조회 ->
rac1 서버의 터미널에서 인스턴스를 강제 종료 -> 클라이언트에서 접속 확인 순으로 합니다

 

 

 

 

 

 

* CASE 5: TAF 사용 - TYPE = SESSION , METHOD = PRECONNECT 설정 테스트하기
Step 0. crs_start -all 명령으로 모든 노드를 정상적으로 Open 시킵니다.
Step 1. 클라이언트(여기서는 PC)의 tnsnames.ora 파일을 아래와 같이 변경합니다.

 

 

Step 2. 클라이언트에서 접속을 한 후 접속 내역을 확인합니다.

 

 

아래의 화면은 서버에서 직접 조회한 화면입니다.

 

 

 

Step 3. 위에서 rac1 번에 접속한 것으로 확인되므로 rac1 에서 접속테스트를 수행합니다.
방법은 위에서 했던 방법으로 클라이언트 창 에서 select * from dba_tables 를 조회 ->
rac1 서버의 터미널에서 인스턴스를 강제 종료 -> 클라이언트에서 접속 확인 순으로 합니다.

 

 

 

 

 

위 테스트로 확인한 것처럼 PRECONNECT 방법은 만약을 위해 미리 접속을 하나 더 해 놓는 것으로 실제 운영에서는 서버의 세션을 하나 더 사용하기 때문에 문제가 될 수 있습니다.
그래서 일반적으로는 잘 사용하지 않습니다.
주로 많이 사용하는 Failover 방법은 일반적인 OLTP 환경일 경우 Case 2의 TYPE = SESSION , METHOD = BASIC 방법 을 많이 사용하고 만약 시간이 오래 걸리는 배치 작업이나 통계 조회같은 SQL 이 많이 동작하는 경우는 Case 3 인 TYPE=SELECT , METHOD = BASIC 방법을 많이 사용합니다. 

이상으로 RAC 의 강력한 기능인 Failover 기능과 Load Balance 기능에 대해 자세히 살펴보았습니다.

반응형