고가용성 데이터베이스 설계

소개

고가용성(High Availability, HA)은 시스템이 예상치 못한 장애 발생 시에도 지속적으로 운영될 수 있도록 보장하는 것을 의미합니다. Oracle 데이터베이스에서 고가용성을 확보하는 것은 매우 중요하며, 이를 위해 다양한 기술과 전략이 필요합니다. 이 가이드에서는 Oracle 데이터베이스의 고가용성을 구축하기 위한 핵심 사항과 실질적인 예제를 제공합니다.

1. 장애 복구 전략 (Transparent Application Failover, TAF)

TAF는 데이터베이스 장애 발생 시 애플리케이션이 자동으로 다른 인스턴스로 연결을 재시도하여 서비스를 지속적으로 제공하는 기술입니다. TAF를 구현하기 위해서는 연결 문자열(connection string)과 서버 설정이 필요합니다.

1.1 TAF 설정 예시

tnsnames.ora 파일 설정:

    
MYDB_TAF = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL=TCP)(HOST=primary_host)(PORT=1521))
      (ADDRESS = (PROTOCOL=TCP)(HOST=secondary_host)(PORT=1521))
    )  
    (CONNECT_DATA = 
      (SERVICE_NAME=mydb)
    )  
    (FAILOVER_MODE =  
      (TYPE = SELECT)
      (METHOD = BASIC)
      (RETRIES = 20)
      (DELAY = 5)
    )
  )
    
  
  • TYPE = SELECT: 장애 복구 유형을 지정합니다. SELECT는 장애 발생 시 애플리케이션이 연결을 재시도하는 유형입니다.
  • METHOD = BASIC: 기본 연결 방식으로, 단순히 연결을 재시도합니다.
  • RETRIES = 20: 연결 재시도 횟수입니다.
  • DELAY = 5: 연결 재시도 간의 시간 간격(초)입니다.

1.2 TAF 콜백 (Callback) 사용

TAF 콜백은 장애 발생 시 애플리케이션에 특정 액션을 수행할 수 있도록 하는 기능입니다. 예를 들어, 콜백을 사용하여 트랜잭션을 롤백하거나 사용자에게 알림을 보낼 수 있습니다.

    
-- PL/SQL 콜백 함수 예시
CREATE OR REPLACE PROCEDURE taf_callback (event IN VARCHAR2) AS
BEGIN
  IF event = 'failover_begin' THEN
    -- 장애 발생 시 수행할 작업
    ROLLBACK;
    DBMS_OUTPUT.PUT_LINE('Failover 시작, 트랜잭션 롤백');
  ELSIF event = 'reconnect' THEN
    -- 재연결 성공 시 수행할 작업
    DBMS_OUTPUT.PUT_LINE('재연결 성공');
  END IF;
END;
/
    
  

2. 데이터 가드 (Data Guard) 구성

데이터 가드는 주 데이터베이스의 데이터를 다른 위치에 있는 대기 데이터베이스로 복제하여, 주 데이터베이스에 장애가 발생할 경우 대기 데이터베이스로 전환하여 서비스를 지속적으로 제공하는 기술입니다.

2.1 데이터 가드 설정 방법

  1. 주 데이터베이스와 대기 데이터베이스를 준비합니다.
  2. Oracle Data Guard Broker를 구성합니다. (DG Broker 사용 권장)
  3. 로그 전송 및 적용 설정을 구성합니다.
  4. 필요한 경우, 전환(Switchover) 및 장애 복구(Failover) 계획을 수립하고 테스트합니다.

예시 코드: 데이터 가드 Broker 구성

    
dgmgrl sys/password@primary_db
CREATE CONFIGURATION 'dg_config' AS  
PRIMARY DATABASE IS 'primary_db'
STANDBY DATABASE IS 'standby_db';
ENABLE CONFIGURATION;
    
  

2.2 데이터 가드 모드 선택

  • 최대 가용성 (Maximum Availability): 데이터 손실 없이 서비스를 유지하는 데 중점을 둡니다.
  • 최대 성능 (Maximum Performance): 성능을 최적화하고 데이터 손실 가능성을 감수합니다.
  • 최대 보호 (Maximum Protection): 데이터 손실을 최소화하는 데 중점을 둡니다.

3. 인스턴스 튜닝 및 메모리 관리

데이터베이스 인스턴스 튜닝은 전체적인 성능 향상에 필수적입니다. SGA(System Global Area) 및 PGA(Program Global Area) 메모리 설정을 최적화하여 데이터베이스의 효율성을 높일 수 있습니다.

3.1 SGA 튜닝

SGA는 데이터베이스 버퍼 캐시, 공유 풀, Large Pool 등으로 구성되며, 각 영역의 크기를 적절하게 설정해야 합니다.

    
-- SGA 크기 확인
SHOW PARAMETER sga_target;

-- SGA_TARGET 설정 (예시: 8GB)
ALTER SYSTEM SET SGA_TARGET=8G SCOPE=SPFILE;
    
  

3.2 PGA 튜닝

PGA는 각 서버 프로세스를 위한 메모리 영역으로, 정렬(sort) 및 해시 조인(hash join) 작업에 사용됩니다.

    
-- PGA 크기 확인
SHOW PARAMETER pga_aggregate_target;

-- PGA_AGGREGATE_TARGET 설정 (예시: 2GB)
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=2G SCOPE=SPFILE;
    
  

4. 테이블 및 인덱스 관리

테이블 파티셔닝은 대규모 테이블을 관리하기 쉽게 분할하는 기술이며, 인덱스는 데이터 검색 속도를 향상시키는 데 중요한 역할을 합니다.

4.1 테이블 파티셔닝

범위 파티셔닝, 해시 파티셔닝, 리스트 파티셔닝 등 다양한 파티셔닝 전략을 사용하여 테이블을 분할할 수 있습니다.

    
-- 범위 파티셔닝 예시
CREATE TABLE sales (
  sales_id NUMBER,
  sales_date DATE,
  product_id NUMBER,
  amount NUMBER
)  
PARTITION BY RANGE (sales_date)
(
  PARTITION sales_q1 VALUES LESS THAN (TO_DATE('2023-04-01', 'YYYY-MM-DD')),
  PARTITION sales_q2 VALUES LESS THAN (TO_DATE('2023-07-01', 'YYYY-MM-DD')),
  PARTITION sales_q3 VALUES LESS THAN (TO_DATE('2023-10-01', 'YYYY-MM-DD')),
  PARTITION sales_q4 VALUES LESS THAN (MAXVALUE)
);
    
  

4.2 인덱스 생성 및 관리

테이블에 적절한 인덱스를 생성하여 데이터 검색 성능을 향상시킬 수 있습니다.

    
-- 인덱스 생성 예시
CREATE INDEX idx_product_id ON sales (product_id);

-- 불필요한 인덱스 삭제 예시
DROP INDEX idx_old;
    
  

5. SQL 튜닝

SQL 튜닝은 데이터베이스 성능을 최적화하는 데 핵심적인 요소입니다. 실행 계획 분석, 힌트 사용, 바인드 변수 활용 등의 기술을 사용하여 SQL 성능을 개선할 수 있습니다.

5.1 실행 계획 분석

SQL 실행 계획을 분석하여 비효율적인 부분을 찾아내고 개선합니다.

    
-- 실행 계획 확인
EXPLAIN PLAN FOR
SELECT * FROM employees WHERE department_id = 10;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
    
  

5.2 힌트 사용

옵티마이저가 특정 실행 계획을 선택하도록 힌트를 사용하여 SQL 성능을 조절할 수 있습니다.

    
-- 인덱스 힌트 사용 예시
SELECT /*+ INDEX(employees idx_emp_dept_id) */ * 
FROM employees 
WHERE department_id = 10;
    
  

5.3 바인드 변수 활용

리터럴 값을 직접 사용하는 대신 바인드 변수를 사용하여 SQL 파싱 오버헤드를 줄이고, 커서 공유를 높입니다.

    
-- 리터럴 사용 (성능 저하)
SELECT * FROM employees WHERE employee_id = 123;

-- 바인드 변수 사용 (성능 향상)
SELECT * FROM employees WHERE employee_id = :emp_id;
    
  

6. 스토리지 관리

I/O 성능은 데이터베이스 성능에 큰 영향을 미칩니다. 테이블스페이스, 데이터 파일, 로그 파일 등의 스토리지 구성을 최적화하여 I/O 병목 현상을 줄일 수 있습니다.

6.1 테이블스페이스 관리

테이블스페이스를 분리하여 관리하고, 적절한 스토리지 설정을 적용합니다.

    
-- 테이블스페이스 생성 예시
CREATE TABLESPACE app_data 
DATAFILE 'app_data01.dbf' SIZE 10G 
AUTOEXTEND ON NEXT 1G MAXSIZE UNLIMITED;

-- 테이블 생성 시 테이블스페이스 지정
CREATE TABLE orders (
  order_id NUMBER,
  order_date DATE,
  customer_id NUMBER
) TABLESPACE app_data;
    
  

6.2 데이터 파일 및 로그 파일 관리

데이터 파일과 로그 파일을 분산하여 I/O 경합을 줄이고, 로그 파일 크기를 적절하게 조정합니다.

    
-- 로그 파일 크기 조정 예시
ALTER DATABASE LOGFILE SIZE 1024M;
    
  

결론

Oracle 데이터베이스에서 고가용성을 구축하는 것은 복잡하지만 중요한 작업입니다. TAF, 데이터 가드, 인스턴스 튜닝, 테이블 및 인덱스 관리, SQL 튜닝, 스토리지 관리 등의 기술을 적절히 활용하면 장애 상황에서도 안정적인 서비스 제공이 가능합니다.

위로 스크롤