Please Enable JavaScript!
Gon[ Enable JavaScript ]

Oracle RAC(Real Application Cluster) 구성 및 테스트

자바(JAVA)
반응형
문제 설명
RAC(Real Application Cluster)는 RAC 인스턴스의 노드 간 로드 밸런싱, 페일오버(failover) 및 데이터베이스
확장성을 제공하는 유사 고가용성(High Availability) 구성입니다. RAC를 사용하면 데이터베이스에 노드를
추가하고 용량을 늘리거나 성능을 향상시킬 수 있습니다.

Oracle9i RAC란?

Oracle9i RAC는 두 개 이상의 인스턴스가 클러스터 기술을 통해 공유 데이터베이스에 액세스할 수 있는
Oracle 데이터베이스입니다. 클러스터는 함께 동일한 작업을 수행하는 시스템(또는 노드) 그룹입니다.
이 아키텍처 지원을 위해 데이터베이스 인스턴스를 호스트하는 두 대 이상의 시스템이 고속 상호 연결을 통해
연결되어 클러스터를 형성합니다. 상호 연결이란 클러스터의 각 노드 간의 통신 수단으로 사용되는 물리적
네트워크를 말합니다.
클러스터 기능은 OS 또는 타사 소프트웨어(예: Veritas)에 의해 제공되므로 클러스터링 또는 고가용성 하위
시스템이 RAC와 호환되는지 확인해야 합니다.

Oracle9i RAC 설치

Oracle에서 제공하는 JDBC 드라이버에 의해 수행되는 대부분의 페일오버(failover) 및 로드 밸런싱 작업은
WLS에서 블랙박스 역할을 합니다. 결과적으로 WLS의 주요 작업은 Oracle JDBC 드라이버에
해당 매개변수를 전달하도록 JDBC를 구성하는 것입니다. 또한 데이터베이스(DB)에 구현된 RAC의 일부인
클러스터링 및 트랜잭션 복구 기능을 사용하는 RAC 구성 요소도 있습니다.

RAC에서는 로드 밸런싱 및 복구도 지원하지만 사용자들이 겪고 있는 대부분의 문제는
페일오버(failover) 시 발생합니다. RAC는 멀티 풀 기능을 구현하므로 WLS는 페일오버(failover)로 인한
대기 시간을 제어하지도 못하고 페일오버(failover)의 필요성을 인식할 수도 없습니다.
페일오버(failover) 동작은 페일오버가 수행되는 이유에 따라 다릅니다. Oracle 데이터베이스에 오류가
발생하면(Oracle 노드 또는 DB는 종료되지만 OS는 계속 실행됨) 페일오버(failover)가 신속하게 수행됩니다.
그러나 하드웨어/OS에 오류가 발생한 경우 TCP 대기 시간 때문에 페일오버(failover)에
시간이 약간 걸릴 수 있습니다. WLS 멀티 풀 구현에도 마찬가지입니다.

사용자는 원활하게 즉각 페일오버(failover)가 수행되는 고가용성 시스템을 기대하지만, 위에서
설명한 제한에
비추어 보면 불가능한 일입니다.

또한 시작된 트랜잭션이 있는 경우 Oracle DB에 오류가 발생하면 페일오버(failover) 동작은 트랜잭션의
단계 또는 주기(시작, 준비 또는 커밋)에 따라 달라집니다. RAC는 일정 수준의 복구 기능을 제공하므로
오류가 발생한 Oracle DB에서 준비된 트랜잭션을 복구할 수 있습니다. 트랜잭션은 "준비"될 때까지는
메모리에 있고 디스크에 기록되지 않은 상태이므로 복구될 수 없습니다.
http://dev2dev.bea.com/products/wlserver81/whitepapers/wls_bea_hp.jsp를 참조하십시오.

RAC는 OS 클러스터링 기술을 활용하여 데이터 무결성 보장에 필요한 공유 디스크를 제공합니다.
공유 디스크는 SUN용 Veritas 등 타사 제품으로 제공되거나 OS/하드웨어 공급업체로부터 제공될 수 있습니다.

일반적인 문제
사용자는 다음 내용에 대해 충분히 숙지하고 있어야 합니다.
  • JDBC 드라이버 구성
  • 서비스 공급에 대한 예상
  • WLS 내에서 사용 방법
문제 해결
다음 항목을 모두 수행해야 하는 것은 아닙니다. 어떤 경우에는 다음 중 일부만 수행하여도 해결할 수 있습니다.

항목 바로가기

문제 발생 원인
문제는 여러 가지 이유로 발생하지만, 가장 일반적인 원인은 다음과 같습니다. 

  • 드라이버로 지원되지 않는 서비스를 요청한 경우
  • RAC가 제공하는 서비스를 잘못 이해한 경우
  • JDBC와의 구성 문제

가장 일반적인 드라이버 문제는 드라이버가 요청된 서비스를 지원하지 않는 것입니다. 예를 들어, ,
Oracle 9.2.0.4
는 로드 밸런싱을 지원하지 않습니다.

또한 "다음 키 입력" 시 오류가 감지되는 NON-STOP(Tandem Copywrite) 시스템과 같이, 오류를 즉시
발견하여 대처하는 뛰어난 가용성에 대한 기대치가 있습니다. 그러나 IP 오류가 페일오버(failover)의
주요 원인인 이 경우에는 고가용성을 보장할 수 없습니다.

그러므로 엔드 시스템을 사용할 수 없음을 인식한 후에야 다른 RAC 노드로 이동해야 할 필요성을
감지하게 됩니다. 이 시간은 TCP 설정에 의해 결정됩니다. 예를 들면, Solaris TCP에 대한 표준 설정의
경우 시간 제한이 4분입니다. 시간 제한은 ndd를 통해 관리됩니다.

문제가 발생하는 또 다른 원인은 디스크에 쓰여진(준비/커밋) 트랜잭션만 복구할 수 있는 경우 모든
트랜잭션이 복구될 것이라 기대하는 경우입니다.

페이지 맨 위

구성 기초
다음과 같은 Oracle RAC 구성을 예로 들어 봅시다.
Sid = slrac


 SLRAC =

  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.137.231)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.137.230)(PORT = 1521))
      (LOAD_BALANCE = yes)
    )

    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = slrac.bea.com)
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = BASIC)
        )
      )
    )

 SLRAC2 =
   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.137.230)(PORT = 1521))
    )
     (CONNECT_DATA =
      (SERVICE_NAME = slrac.bea.com)
       (INSTANCE_NAME = slrac2)
     )
   )  SLRAC1 =
     (DESCRIPTION =
     (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.137.231)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = slrac.bea.com)
      (INSTANCE_NAME = slrac1)
      )
    )

WLS JDBC URL은 다음과 같이 구성됩니다.

jdbc:oracle:thin:@(description=(address_list= (address=
(host=172.18.137.231) (protocol=tcp)(port=1521))(address=(
host=172.18.137.230)(protocol=tcp) (port=1521)) (load_balance=yes)
(failover=yes))(connect_data=(service_name= slrac.bea.com)))

배포 시 다음과 같이 표시됩니다.

        Connection successful on: myserver
at mydomain> JDBC Connection Pools> RACTest

참고: TestOnReserve를 설정해야 합니다.

RAC를 구성할 때 드라이버의 종류와 버전은 중요합니다. RAC는 Oracle thin Java 드라이버와 호환되지만,
모든 드라이버에서 모든 서비스가 지원되지는 않습니다. 9.2.0.4 thin 드라이버는 로드 밸런싱을 지원하지
않지만 9.2.0.5 또는 10g 드라이버는 지원합니다. WLS SP2를 사용 중이면서 10g 드라이버를 사용할 계획인
경우 http://dev2dev.bea.com/products/wlplatform81/patch/wlplat81sp2_patch.jsp에서
WL 플랫폼/WLS 8.1 SP2용 패치를 다운로드할 수 있습니다.
oci 드라이버는 RAC 구성에서 사용되는 멀티 풀 기능을 지원합니다.
(참고: 현재는 10g 드라이버가 WL 플랫폼/WLS 8.1 SP3에서 지원됩니다.)

Oracle 클라이언트를 설치하는데 따르는 번거로움보다 간단한 구성이 더 중요하여 thin 드라이버가
필요한 환경의 경우 이 Java THIN 클라이언트는 RAC 기능군에 속하는 멀티캐스트 기능을 지원합니다.
 요청한 기능이 사용된 JDBC 드라이버와 호환되는지 Oracle에 확인하십시오. 

또한 Oracle에서 제공하는 RAC 구성 모범 사례 중 일부를 BEA에서는 권장하지 않습니다.
Oracle에서는 각 리스너가 전역 DB와 로컬 DB를 모두 사용할 것을 권장하므로 위의 구성에서 SLRAC1의
리스너는 SLRAC를 인식하고 SLRAC의 리스너는 SLRAC1을 인식합니다. BEA에서는 리스너가
로컬 인스턴스만 인식하도록 할 것을 권장합니다. 즉, SLRAC는 해당 인스턴스만 인식해야 합니다.
BEA에서는 신속한 페일오버(failover)를 위해 이렇게 변경할 것을 권장합니다.   

RAC 사용 시, Oracle 드라이버가 WLS에서 제공하는 멀티 풀 기능을 제공하며(예: 데이터베이스
인스턴스 간 페일오버) RAC 기능에서도 준비된 트랜잭션이 복구될 수 있도록 일정 수준의 데이터
무결성을 제공한다는 점을 이해하는 것이 중요합니다.

RAC에서는 WLS 멀티 풀 사용이 제한됩니다. 일반적으로 멀티 풀은 XA 드라이버와 함께 사용할 수
 없으며 RAC와 사용할 수 있도록 인증되지 않았습니다. 현재로서는 TX 이외의 환경에서는 멀티 풀을
RAC와 함께 사용할 수 없습니다.

페이지 맨 위

RAC 구성 테스트
RAC 구성을 테스트하려면 다음을 수행하십시오.

  1. 클러스터 RAC의 멤버로 구성된 Oracle 노드 또는 Oracle DB 인스턴스를 시작합니다.
  1. 그런 다음 아래 제공된 예제 코드를 사용하여 사용자 URL과 DataSource를 수정한 후 테스트합니다.  
풀은 WLS 콘솔의 JDBC and Testing에서 TestPool 기능을 사용하여 테스트할 수도 있습니다. 
참고: RAC는 WLS에서 보면 단일 연결 풀 및 단일 DataSource로 구성됩니다. 
  1. 콘솔에서 Testpool을 사용하여 테스트한 후 노드 하나를 중지합니다. 
모두 제대로 작동해야 합니다. 
  1. 다른 노드를 중지합니다.
그러면 오류가 발생합니다. 
  1. 노드를 다시 작동시킵니다.
모두 제대로 작동합니다. 

DB는 Oracle 쪽에서 제어됩니다.

아래에서 설명하는 RAC 디버깅은 구성이 좀 더 복잡하다는 점을 제외하고는 기타 모든 JDBC 문제를
디버깅하는 것과 같은 방식으로 수행됩니다. jdbc.log와 구성을 가져와서 콘솔에서 풀을 테스트한
다음 데이터 소스를 사용하여 풀을 다시 테스트해야 합니다.

오류가 있으면 JNDI 트리를 검사하여 데이터 소스를 사용할 수 있는지 확인합니다.

 


페이지 맨 위

기본 디버깅

  1. 일반적인 JDBC 연결 풀 문제를 디버깅하는 방식대로 처리합니다.
  1. config.xml을 확인합니다.
다음은 RAC를 사용하도록 구성된 JDBC 연결의 예입니다.

<JDBCConnectionPool ConnLeakProfilingEnabled="true"
        DriverName="oracle.jdbc.driver.OracleDriver" Name="RACTest"
        Password="{3DES}SnVOJbMRf3M=" Properties="user=mks" Targets=""
        TestConnectionsOnCreate="true" TestConnectionsOnRelease="true"
        TestConnectionsOnReserve="true"
        TestTableName="SQL SELECT 1 FROM DUAL" URL="jdbc:oracle:thin:@(description=
(address_list= (address=(host=172.18.137.231) (protocol=tcp)(port=1521))(address=
(host=172.18.137.230)(protocol=tcp) (port=1521)) (load_balance=yes)(failover=yes))
(connect_data=(service_name= slrac.bea.com)))"/>
    <JDBCTxDataSource EnableTwoPhaseCommit="true" JNDIName="RACTest1"
        Name="RACTest1" PoolName="RACTest" Targets=""/>

  1. RAC 데이터베이스를 테스트할 간단한 java 응용 프로그램을 설치합니다.
다음과 같은 예제가 제공됩니다.

이 예제를 사용하려면,

    • 환경(예: user_projects/domains/myserver)을 설정합니다.
UNIX의 경우: >. ./setEnv.sh
Windows의 경우: setEnv
    • CLASSPATH racTest1.class로 설정합니다.
(예: CLASSPATH=.;%CLASSPATH%로 설정 또는 UNIX의 경우
CLASSPATH=.:$CLASSPATH로 설정)

이 예제에서는 기본 SQL 문만 테스트할 뿐 트랜잭션은 테스트하지 않습니다.

Sample Test Code- Standard Data Source test
//package examples.jdbc.datasource;
import java.sql.*;
import java.util.*;
import javax.naming.*;
 
 
 

public class racTest1 {

  public static void main(String argv[])
       throws Exception
  {
    java.sql.Connection conn = null;
    java.sql.Statement stmt  = null;
    try {

      // ============== Make connection to database ==================
      // Obtain a Datasource connection from the WebLogic JNDI tree.
      Context ctx = null;

      // Put connection properties in to a hashtable. 
      Hashtable ht = new Hashtable();
      ht.put(Context.INITIAL_CONTEXT_FACTORY,
             "weblogic.jndi.WLInitialContextFactory");
      ht.put(Context.PROVIDER_URL,
             "t3://mks4:7001");

      // Get a context for the JNDI look up
      System.out.println("before init ctx connection...\n");
      ctx = new InitialContext(ht);
      System.out.println("after init ctx connection...\n");
      javax.sql.DataSource ds
          = (javax.sql.DataSource) ctx.lookup ("RACTest1");
      conn = ds.getConnection();
      System.out.println("Making connection...\n");

      // execute some SQL statements to demonstrate the connection. 
      stmt = conn.createStatement();

      try {
        stmt.execute("drop table empdemo");
        System.out.println("Table empdemo dropped.");
      } catch (SQLException e) {
          System.out.println("Table empdemo doesn't need to be dropped.");
      }

      stmt.execute("create table empdemo (empid int, name varchar(30), dept int)");
      System.out.println("Table empdemo created.");

      int numrows = stmt.executeUpdate("insert into empdemo values (0, 'John Smith', 12)");
      System.out.println("Number of rows inserted = " + numrows);

      numrows = stmt.executeUpdate("delete from empdemo where empid = 0");
      System.out.println("Number of rows deleted = " + numrows);
    } catch (Exception e) {
        System.out.println("Exception was thrown: " + e.getMessage());
    } finally {
        try {
          if (stmt != null)
            stmt.close();
          if (conn != null)
            conn.close();
        } catch (SQLException sqle) {
            System.out.println("SQLException during close(): " + sqle.getMessage());
        }
     }
  }

}
 


  1. 풀을 테스트합니다.
트리의 JNDI 항목에 있는 DataSource - RACTest1(이 예제에서는 RAC DataSource)에 유의하십시오.


  1. 데이터베이스가 실행 중인지 확인합니다.
  1. Start 스크립트에서 JDBC 드라이버를 확인합니다.
Start 스크립트에서 CLASSPATH가 JDBC 드라이버를 가리켜야 합니다.
이것은 ojdbc14.jar이며 weblogic jar 앞에 있어야 합니다.

반응형
Posted by 녹두장군1
,