IT기술/Oracle

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

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

1. RAC Load Balancing
Load Balancing 이란 용어 자체가 의미하는 것처럼 Load (서버에 걸리는 업무량) 을 Balancing (균형이 맞게 배분) 하는 것을 의미합니다.

이렇게 Load Balancing 을 구현하는 방법은 Client (주로 접속하는 PC) 쪽에서 설정하는 방식이 있고 Server 쪽에서 설정하는 방법이 있습니다. 

우선 먼저 Client 쪽에서 설정하는 방법부터 살펴보겠습니다.

 

 

위 그림에서 Client 의 tnsnames.ora 파일에 Load Balancing 설정을 하는 방법입니다.

이 설정을 하려면 당연히 Client 역할을 하는 PC 나 Server 에 Oracle Client 프로그램이 설정되어 있어야 합니다. 

 

1) Client 기반의 Load Balancing 설정하기

tnsnames.ora 파일에

RAC =

(DESCRIPTION =

(LOAD_BALANCE = YES)

(ADDRESS_LIST = 

...

 

2) Server 기반의 Load Balancing 
이 방법은 접속 요청을 받은 Listener 가 다른 서버에 있는 Listener 의 업무부하를 보고 자신보다 한가하면 
지금 접속 요청 된 Client 에서 다른 Listener 를 찾아가라고 안내(Re-Direct)를 해 주는 것입니다.

 

(1) Dynamic Register
Oracle 8i 이전 버전까지 Listener 가 서비스를 해 주는 instance 정보는 관리자가 수동(Static) 으로 listener.ora 파일에 등록을 해야 했습니다. 
그러나 8i 버전부터는 PMON 프로세스가 listener 에게 instance 들의 정보들을 자동(Dynamic)으로 알려 줄 수 있도록 변경되었습니다.
이때 PMON 에 의해 관리되는 주요 정보는 Listener 별로 1분 동안 접속한 접속 자 수와 load 관련된 정보들입니다. 

이 기능을 사용하려면 초기화 파라미터 파일( pfile이나 spfile )에 SERVICE_NAMES 파라미터를 사용하여 
서비스 하고 싶은 이름을 명시적으로 등록하면 되고 만약 이 설정이 없으면 자동으로 설치 시 지정한 DB_NAME 을 사용하게 됩니다. 


이 책에서는 RAC 로 자동 설정되어 있습니다.
그리고 local_listener 파라미터를 설정 해 줍니다. 
이 파라미터는 PMON 이 인스턴스 정보를 알려 줄 Listener 를 지정하는 용도입니다.
이 파라미터를 지정하지 않을 경우 현재 서버의 1521 번 포트를 사용하는 Listener 에게 자동으로 알려주게 됩니다.

서버에서 현재 listener 에 등록된 서비스 목록을 살펴보겠습니다.

 

[oracle@rac1 admin]$ lsnrctl services

LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 29-SEP-2013 05:27:10

Copyright (c) 1991, 2007, Oracle.   All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

Services Summary...

Service "rac" has 2 instance(s).

Instance "rac1", status READY, has 2 handler(s) for this service...

Handler(s):

"DEDICA TED" established:2 refused:0 state:ready

LOCAL SERVER

"DEDICATED" established:0 refused:0 state:ready

REMOTE SERVER

(ADDRESS=(PROTOCOL=TCP)(HOST=rac1)(PORT=1521))

Instance "rac2", status READY, has 1 handler(s) for this service...

Handler(s):

"DEDICATED" established:1 refused:0 state:ready

REMOTE SERVER

(ADDRESS=(PROTOCOL=TCP)(HOST=rac2)(PORT=1521))

Service "racXDB" has 2 instance(s).

Instance "rac1", status READY, has 1 handler(s) for this service...

Handler(s):

"D000" established:0 refused:0 current:0 max:1022 state:ready

DISPATCHER <machine: rac1, pid: 4979>

(ADDRESS=(PROTOCOL=tcp)(HOST=rac1)(PORT=34742))

Instance "rac2", status READY, has 1 handler(s) for this service...

Handler(s):

"D000" established:0 refused:0 current:0 max:1022 state:ready

DISPATCHER <machine: rac2, pid: 6897>

(ADDRESS=(PROTOCOL=tcp)(HOST=rac2)(PORT=34654))

Service "rac_XPT" has 2 instance(s).

Instance "rac1", status READY, has 2 handler(s) for this service...

Handler(s):

"DEDICATED" established:2 refused:0 state:ready

LOCAL SERVER

"DEDICATED" established:0 refused:0 state:ready

REMOTE SERVER

(ADDRESS=(PROTOCOL=TCP)(HOST=rac1)(PORT=1521))

Instance "rac2", status READY, has 1 handler(s) for this service...

Handler(s):

"DEDICATED" established:1 refused:0 state:ready 

REMOTE SERVER

(ADDRESS=(PROTOCOL=TCP)(HOST=rac2)(PORT=1521))

The command completed successfully

 

위의 경우는 별도 설정 없이 기본값으로 서비스가 진행되고 있어서 자동으로 서비스명도 등록되고 Port 도 1521 번으로 설정되어 있습니다. 

그러나 실제 서비스에서는 보안등의 이유로 기본으로 설정되어 있는 1521 번 Port 를 사용하지않고 Port 를 다르게 변경하는 경우도 많으므로 

여기서는 Dynamic Listener 설정을 하면서 RAC 서비스를 하는 Port 를 9001 번으로 변경하는 것을 해 보겠습니다.

 

Step  1.  현재  운영중인  서버의  spfile  에  LOCAL_LISTENER  값을  확인  후  새로운  이름으로  변경합니다. 

(  이  책에서는  새로운  listener  이름을  LOCAL  로  했습니다.)

 

SQL> show parameter spfile;

NAME                TYPE      VALUE

----------------------- ----------- ------------------------------

spfile                string       /dev/raw/raw28

 

SQL> show parameter local_listener ;

NAME                TYPE       VALUE

---------------------- ----------- ------------------------------

local_listener           string

 

위  value  값이  없다는  것은  특정  listener  를  사용하지  않고  기본  설정  값을  쓴다는  의미입니다.

앞에서  살펴본  대로  9i  이후부터는  자동으로  1521  Port  를  사용하는  Dynamic  Listener  기능이  on 되어  있습니다.

이것을  port  를  9001  로  지정한  "LOCAL"  이라는  이름의  listener  를  사용하도록  변경하겠습니다.

이  예와  같이  Listener  이름을  변경하거나  사용하는  Port  를  변경하려면  반드시  서버의 listener.ora  파일에  내용을  변경해  주어야  하며

local_listener  설정값을  지정해  주어야  합니다.

 

SQL> alter system set local_listener=local scope=spfile;

System altered.

 

Step 2.  재  시작  후부터  적용이  되기  때문에  crs  전체를  중단합니다.

[oracle@rac2 ~]$ crs_stop -all

Attempting to stop `ora.rac1.gsd` on member `rac1`

Attempting to stop `ora.rac2.gsd` on member `rac2`

Attempting to stop `ora.rac2.ons` on member `rac2`

Attempting to stop `ora.rac.db` on member `rac2`

(  중간  생략합니다  )

 

Step 3. RAC1  서버의  listener.ora  파일의  내용에  아래의  내용을  변경합니다.

 

 

 

Step 4. RAC1  서버의  tnsnames.ora  파일의  내용에  기존의  내용  아래에  다음  내용을  추가합니다

 

 

 

Step 5. RAC2  서버의  listener.ora  파일의  내용에  아래의  내용을  변경합니다

 

 

 

Step 6. RAC2  서버의  tnsnames.ora  파일의  내용에  기존의  내용  아래에  다음  내용을  추가합니다

 

 

 

Step 7. CRS  를  재  시작하여  확인합니다.

[root@rac2 ~]# crs_start -all

Attempting to start `ora.rac1.vip` on member `rac1`

Attempting to start `ora.rac2.vip` on member `rac2`

Attempting to start `ora.rac.rac1.inst` on member `rac1`

Attempting to start `ora.rac.rac2.inst` on member `rac2`

Start of `ora.rac2.vip` on member `rac2` succeeded.

Start of `ora.rac1.vip` on member `rac1` succeeded.

(  중간  결과는  생략합니다  )

 

[oracle@rac2 admin]$ lsnrctl services

LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 06-OCT-2013 17:08:11

Copyright (c) 1991, 2007, Oracle.   All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

Services Summary...

Service "PLSExtProc" has 1 instance(s).

Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

Handler(s):

"DEDICATED" established:0 refused:0

LOCAL SERVER

Service "rac" has 2 instance(s).

Instance "rac1", status READY, has 1 handler(s) for this service...

Handler(s):

"DEDICATED" established:0 refused:0 state:blocked

REMOTE SERVER

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=9001))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=rac)))

Instance "rac2", status READY, has 1 handler(s) for this service...

Handler(s):

"DEDICATED" established:0 refused:0 state:blocked

REMOTE SERVER

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac2-vip)(PORT=9001))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=rac)))

Service "racXDB" has 2 instance(s).

Instance "rac1", status READY, has 1 handler(s) for this service...  

Handler(s):

"D000" established:0 refused:0 current:0 max:1022 state:ready

DISPATCHER <machine: rac1, pid: 28240>

(ADDRESS=(PROTOCOL=tcp)(HOST=rac1)(PORT=34054))

Instance "rac2", status READY, has 1 handler(s) for this service...

Handler(s):

"D000" established:0 refused:0 current:0 max:1022 state:ready

DISPATCHER <machine: rac2, pid: 7824>

(ADDRESS=(PROTOCOL=tcp)(HOST=rac2)(PORT=33913))

Service "rac_XPT" has 2 instance(s).

Instance "rac1", status READY, has 1 handler(s) for this service...

Handler(s):

"DEDICA TED" established:0 refused:0 state:blocked

REMOTE SERVER

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=9001))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=rac)))

Instance "rac2", status READY, has 1 handler(s) for this servic e...

Handler(s):

"DEDICATED" established:0 refused:0 state:blocked

REMOTE SERVER

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac2-vip)(PORT=9001))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=rac)))

The command completed successfully

 

 

Step 8.  접속  테스트를  할  클라이언트의  tnsnames.ora  파일을  아래와  같이  수정합니다.

 

 

 

위 그림에서 Port 부분이 9001 로 설정 되도록 하시면 됩니다.



Client 에서 아래와 같이 rac 에 접속을 시도합니다

sqlplus sys/oracle@rac as sysdba

반응형