블로그 이미지
redkite

카테고리

분류 전체보기 (291)
00.SI프로젝트 산출물 (0)
00.센터 운영 문서 (0)
01.DBMS ============.. (0)
01.오라클 (117)
01.MS-SQL (15)
01.MySQL (30)
01.PostgreSql (0)
01.DB튜닝 (28)
====================.. (0)
02.SERVER ==========.. (0)
02.서버-공통 (11)
02.서버-Linux (58)
02.서버-Unix (12)
02.서버-Windows (2)
====================.. (0)
03.APPLICATION =====.. (11)
====================.. (0)
04.ETC =============.. (0)
04.보안 (5)
====================.. (0)
05.개인자료 (1)
06.캠핑관련 (0)
07.OA관련 (1)
Total
Today
Yesterday

달력

« » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

최근에 올라온 글

4 단계 : 시스템의 과부하

 

 
   

로드밸런싱 (Load Balancing)

 
 

하나의 시스템을 운영하다 보면 다양한 종류의 애플리케이션들이 실행됩니다. 대용량의 데이터가 변경되는 오퍼레이션, 한달간 발생한 매출정보를 집계하는 마감작업, 소량의 데이터를 검색하는 오퍼레이션 등, 그 종류는 매우 다양할 것 입니다.

하지만, 처리하려고 하는 데이터의 양과 작업시간에 따라 각각의 오퍼레이션에 소요되는 시스템의 메모리와 CPU 사용시간 등은 제각각 틀릴 것입니다. 문제점은 이러한 오퍼레이션들이 다른 시간대에 따로 수행된다면 문제가 없겠지만, 같은 시간대에 동시에 발생한다면 시스템의 자원(메모리, CPU, 디스크 등) 문제로 인해 원할한 작업이 이루어지지 않을 것 입니다. 많은 데이터를 처리해야 하고 많은 시간이 소요되는 작업은 보다 많은 시스템 자원을 사용하려 할 것이기 때문입니다. 이런 경우, 대부분의 해결방법은 시스템에서 발생하는 작업들을 분석하여 시스템의 자원을 골고루 사용할 수 있도록 분배해 주는 방법일 것 입니다. 이러한 기능을 해주는 대표적인 소프트웨어를 미들웨어라고 말 합니다.

오라클 데이터베이스에서는 시스템이 여러 대인 경우 하나의 시스템이 아닌 여러 대의 시스템으로 작업을 분산시킬 수 있는 로드밸런싱 기능을 다음과 같이 제공해 줍니다.

    
  
   
  

$ cd $TNS_ADMIN

$ vi tnsnames.ora

 

ORA90 =

(DESCRIPTION =

(FAILOVER=on)

(Load_Balance=on)

(ADDRESS_LIST =

(ADDRESS=(PROTOCOL=tcp)(HOST=recruit4you)(PORT=1521))

(ADDRESS=(PROTOCOL=tcp)(HOST=recruit5you)(PORT=1522))

)

(CONNECT_DATA = (SID = ORA90))

)

 

:wq!

   
 

TNSNAMES,ORA 파일에 [LOAD_BALANCE = ON] 절을 정의하면, 첫 번째 리스너 프로세스에게 접속을 요청할 때 만약 BUSY 한 상태라면 접속을 거부하고 두 번째 정의된 리스너 프로세스에게 작업을 넘기게 됩니다. 즉, 정의된 리스너 프로세스 중 여유 있는 프로세스에게 작업을 넘겨서 전체적인 로드밸런싱을 유지하게 되는 것 입니다.

[FAILOVER] 절은 여러 대의 시스템을 사용하다 보면 시스템이 사용 가능한 상태가 아닌 경우도 발생합니다. 이런 경우가 발생하면 FAILOVER 기능에 의해 두 번째 정의된 리스너 프로세스에게 작업을 넘기게 됩니다. 메인 서버와 백업서버가 존재하는 네트워크 환경에서 메 인 서버에 문제가 발생하는 경우 사용자들도 모르게 자동으로 백업서버로 연결해야 하는 경우에도 적용할 수 있습니다.

[ADDRESS_LIST] 절에 정의되는 첫 번째 ADDRESS 조건은 처음에 요청할 리스너 프로세스에 대한 정보이고, 두 번째 ADDRESS 절은 로드밸런싱 또는 FAILOVER 기능에 의해 요청되는 리스
너 프로세스에 대한 정보를 정의합니다.

물론, 이 기능은 하나의 시스템에 여러 개의 데이터베이스가 설치되어 있는 환경에서도 적용할 수 있습니다.

    

  
    

자원 관리자 (Resource Manager)

  
    
 

데이터베이스 사용자는 자신이 처리하는 어떤 작업이 시스템의 자원(CPU, 메모리, 디스크 크기, 네트워크)을 얼마만큼 사용하고 있는지를 알지 못하며 또한 어떤 작업을 하기 위해 데이터베이스에 접속할 때 자신이 할당 받게 될 시스템의 자원이 얼마나 될 것인지를 아는 사용자는 거의 없을 것입니다. 데이터베이스 자원 관리자는 사용자가 처리하는 업무의 성격에 따라 CPU와 시스템의 자원을 차별적으로 사용할 수 있는 방법을 제공 해 줍니다.

예를 들어, ABC 회사에서는 고객에게 정보를 제공해주는 업무가 가장 중요한 일이라면OLTP(Online-Transaction Processing) 업무를 처리하는 사용자에게는 더 많은 시스템 자원을 할당해 주고 DSS(Discussion Support System) 업무와 유지보수(MAINTENANCE) 업무를 처리하는 사용자에게는 보다 작은 시스템 자원을 할당해야 할 것입니다. 즉, 보다 중요한 일을 처리하는 사용자에게 원할한 작업을 위해 시스템 자원을 충분하게 할당해 주고 그렇지 못한 사용자에게는 최소한의 자원을 할당해 주는 방법입니다.

    
 

구성요소

 
    
 

데이터베이스 자원 관리자는 다음과 같이 3가지 구성요소로 만들어집니다. 자원 소비자 그룹(RESOURCE CONSUMER GROUP)은 유사한 업무를 처리하는 데이터베이스 사용자(마감작업 또는 통계 분석작업 등)나 요구하는 시스템의 자원이 비슷한 업무(온라인 업무 또는 배치 업무)를 처리하는 사용자들의 그룹을 의미합니다.

자원사용 계획(RESOURCE PLANS)은 자원 소비자 그룹에게 할당해줄 시스템의 자원사용에 대한 계획명을 의미합니다.
마지막으로, 자원사용계획 다이렉티브(RESOURCE PLANS DIRECTIVES)는 자원사용 계획에 대한 구체적인 계획을 의미합니다.

    

  
    

생성 방법

  
    
 

다음 예제는 BATCH 업무 사용자를 위한 자원사용 계획을 생성하는 절차입니다.
자원사용자 그룹명은 "BATCH"이고 자원사원 계획은 "NIGHT"이며 CPU를 100% 사용할 수 있도록 하고 병렬처리를 위해 20개의 프로세스를 사용할 수 있는 자원사용 계획을 세우는 절차입니다. 자원 관리자는 다음의 5단계 과정으로 설정할 수 있습니다.

    
 

자원계획을 실행하는 사용자는 데이터베이스 관리자로 부터 자원계획을 생성할 수 있는 권한(ADMINISTER_RESOURCE_MANAGER 권한)을 부여받아야 만 사용할 수 있습니다. SCOTT 사용자에게 자원계획을 생성할 수 있는 권한을 부여하되 SCOTT 사용자가 다시 이 권한을 다른 사용자에게는 부여할 수는 없습니다.

 
    
 

먼저, 자원계획을 저장할 데이터베이스 공간을 할당해야 합니다.(이 작업은 한번만 실행하면 됩니다.) 공간할당이 끝나면 자원소비자 그룹 "BATCH"를 생성하십시오. COMMENT라는 인수를 통해 해당 자원 소비자그룹에 대한 주석을 작성하십시오.

 
    
 

다음은 자원 사용계획을 생성합니다. 새롭게 생성되는 자원계획은 ①에서 생성한 저장공간에 저장됩니다.

 
    
 

자원사용 다이렉티브를 생성 해 보십시오. CPU를 100% 사용할 수 있도록 하고 병렬처리를 위해 20개의 프로세스를 사용할 수 있는 자원사용 계획을 작성하십시오.

 
    
 

지금까지 작성한 자원계획이 제대로 작성되었는지 검증을 해 보십시오. 패키지를 실행하면 자원 소비자 그룹과 자원계획이 제대로 작성되었는지 검증해 줍니다.
또한, 작성된 자원사용계획을 저장공간에 저장하십시오.

 
    
 

자원 소비자 그룹을 사용자에게 부여합니다.
SCOTT은 자원 소비자 그룹의 사용자를 의미하며 'BATCH'는 자원 소비자 그룹을 의미합니다. 그리고, FALSE는 SCOTT 사용자가 자신이 받은 자원계획의 사용권한을 다른 사용자에게 부여하지 못함을 의미합니다.

 
    
 

자 ~ 지금까지 데이터베이스 자원사용계획과 그룹을 생성해 보았습니다. 이제부터는 자원 사용계획을 활성화시켜 특정 사용자가 처리하는 트랜잭션이 설정된 자원사용 계획에 의해 처리될 수 있도록 해 줍니다. 데이터베이스 전체 환경에서 설정할 수도 있고 특정 세션에서만 적용할 수도 있습니다. 다음은 데이터베이스 전체 환경에서 설정하는 방법입니다.
INIT<DB명>.ORA 파일에 자원사용 계획명을 정의하십시오.

 
    
 

RESOURCE_MANAGER_PLAN = NIGHT (NIGHT는 자원계획명 입니다.)

 
    
 

다음은 특정 세션에서만 적용하는 방법입니다.

 
    
 

SQL> ALTER SESSION SET RESOURCE_MANAGER_PLAN = NIGHT; (NIGHT는 자원계획명 입니다.)

 
    

  
    

기타 자원 사용 계획

  
    
 

자원 관리자(RESOURCE MANAGER) 기능은 오라클 이전 버전부터 제공되던 프로파일(시스템의 Resource를 제한하는 기능) 기능에 대한 보다 향상된 기능이며 오라클 8i 버전부터 소개되었지만 CPU 사용과 Parallel Query Process에 대한 시스템 자원만 사용할 수 있었습니다.
오라클 9i 버전에서는 이 기능 이외에 Active Session Pool 과 Undo(Rollback) Segment에 대한 자원계획을 추가하게 되었습니다. CPU와 병렬처리에 대한 자원 사용계획은 이미 소개되었으므로 오라클 9i에서 추가된 자원계획을 알아보도록 하겠습니다.

 
    
 

Active Session Pool

자원 소비자 그룹마다 동시에 접속할 수 있는 세션 수를 제한할 때 사용합니다.
기본적으로 ACTIVE_SESS_POOL_P1의 값은 1000000 이며 너무 많은 세션이 발생하면 큐(Queue)에서 접속을 위해서 대기하게 되는데 대기시간을 지정하는 파라메터는 Queueing이며
기본 값은 1000000입니다.

 
    
 

UNDO Segment

특정 사용자가 데이터베이스 내에서 사용하게 될 Undo(Rollback) Space에 대한 자원사용을 제한할 때 사용합니다. 기본 UNDO_POOL의 값은 1000000이며 Kilobytes 단위로 표시합니다.

 
    
 

AUTOMATIC CONSUMER GROUPING SWITCHING

정의된 시간이 지나면 특정 사용자의 자원소비자 그룹을 다른 소비자 그룹으로 자동으로 스위칭 해 줍니다.

 
    
 

MAXIMUM ESTIMATED EXECUTION TIME

실행될 SQL문을 실행하기 전에 실행시간을 분석한 다음 너무 오래 걸릴 것 같으면 SQL문을 실행시키지 않습니다.

 
    
 

자 ~ 다음 예제를 따라 해 보십시오

먼저, 데이터베이스 사용자는 Resource Manager를 사용할 수 있는 권한이 있어야 한다.

 
    
 

$ sqlplus "/as sysdba"

SQL> EXEC DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SYSTEM_PRIVILEGE -

(grantee_name=>'scott',Admin_option=>false);

  
    
 

System Rersource에 대한 Plan을 저장할 영역을 할당하십시오.

 
    
 

SQL> EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();

 
    
 

Consumer Group을 생성하십시오.

 
   
 

SQL> EXEC DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP -

(consumer_group=>'DSS',Comment=>'Online 사용자를 위한 자원계획');

 
   
 

Consumer Group에 지정할 자원사용 계획명을 생성하십시오.

 
   
 

SQL> EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN -

(plan=>'NIGHT_PLAN',Comment=>'DSS 및 Batch 업무를 위한 자원계획');

 
   
 

생성된 자원사용 계획명에 실제 계획을 작성하십시오.

 
   
 

SQL> EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE -

(plan=>'NIGHT_PLAN',group_or_subplan=>'DSS', -

comment=>'Night Plan',cpu_p1=>70, -

Parallel_degree_limit_p1=>20, -

active_sess_pool_p1=>5,queueing_p1=>600);

 

SQL> EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE -

( plan=>'NIGHT_PLAN',group_or_subplan=>'OTHER_GROUPS', -

comment=>'Extra Plan',cpu_p1=>30, Parallel_degree_limit_p1=>2);

 
   
 

할당된 Pending 영역에 작성된 자원사용 계획이 유효한지 검증해 보십시오.

 
   
 

SQL> EXEC DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();

 
   
 

자원사용 계획을 데이터베이스에 저장하십시오

 
   
 

SQL> EXEC DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();

  

Posted by redkite
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함