티스토리 뷰

728x90
반응형

 포스팅은 Oracle RAC를 설정할 때 참고 할 가이드입니다.



1. CTF(CTF(Connection Time FailOver)

기본 개념

- 데이터베이스로 접속하는 순간에 Server, DB, Listener등이 비정상적일 경우에 다른 쪽 Server로 접속하는 것을 말한다.
-  DB에 대한 query가 진행 중에 해당 DB에 오류가 발생하거나 비정상 동작이 발생할 경우 커넥션을 버리고 정상적인 DB로 커넥션을 맺는다.
-  JEUS에서 data-source를 설정할 경우 check query를 설정해 줘야 한다.




설정 방법

        <database>

                <vendor>oracle</vendor>

                <export-name>oracledb2</export-name>

                <data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>

                <data-source-type>ConnectionPoolDataSource</data-source-type>

                <property>

                    <name>URL</name>

                    <type>java.lang.String</type>                   <value>jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(LOAD_BALANCE=OFF)(FAILOVER=ON)(PROTOCOL=TCP)(HOST=192.167.20.174)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=192.167.20.173)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ora9i)))</value>

<!-- 해당 url RAC로 구성된 서버의 vip 2개와 각각의 포트 그리고 대표 service name을 입력한다 LOAD_BALANCE client 단에서 로드 밸런싱 여부를 뜻하고 FAILOVER의 경우 CTF기능을 사용할지 말지를 뜻한다 -->

                </property>

                <property>

                    <name>User</name>

                    <type>java.lang.String</type>

                    <value>ydkwon</value>

                </property>

                <property>

                    <name>Password</name>

                    <type>java.lang.String</type>

                    <value>ydkwon</value>

                </property>

                <connection-pool>

                    <pooling>

                        <min>10</min>

                        <max>20</max>

                        <step>2</step>

                        <period>3600000</period>

                    </pooling>

                           <check-query>SELECT 1 FROM dual</check-query>

                           <check-query-timeout>60000</check-query-timeout>

                  <!-- check-query-timeout의 경우 간격을 너무 짧게 잡을 시 DB hang등이 발생하거나 네트워크가 끊기는 경우 부하를 많이 발생 시킬 가능성이 존재하므로 적절한 수치를 입력하는 게 좋다. 크리티컬한 업무의 경우는 10초나 그 이하, 그렇지 않다면 1분 정도로 잡는다면 큰 문제는 없다고 본다 -->

                </connection-pool>

            </database>

[CTF 설정]

 

2. TAF(Run Time FailOver)

기본개념

- DB에 대한 query가 진행 중에 해당 DB에 오류가 발생하거나 비정상 동작이 발생할 경우 옵션에 따라 각각의 동작을 취한다.
- TAF는 CTF와 상반되는 개념이 아니라, CTF에 대해 additional 한 개념이다. 따라서 CTF동작과 옵션은 기본적으로 TAF에서도 적용된다.
- check-query 및 check-query-timeout은 필수적이지는 않다. 그러나 설정한다면 TAF기능이 비정상적으로 동작할 시에도 fail over가 수행되는 장점이 있다.
- Package의 global 변수, Alter session을 이용한 작업, 진행중인 Transaction, Temporary table data등은 TAF 사용시에도 보장되지 못한다. 따라서 TAF를 사용함에 있어서 충분한 고려가 필요하다.




TAF 옵션

- Mode : 장애 시 SQL수행 중 장애에 대한 동작을 결정 (session, select)
session모드일 경우 session만 다른 DB로 넘어가고 SQL은 다시 수행해야 한다.
select모드일 경우 수행하던 작업을 이어서 다른 DB에서 진행한다
- Method : 장애 시점 이전에 connection을 맺는 방법을 결정(Basic, Preconnect)
Basic메서드일 경우 장애 발생 시 다른 DB로 접속한다
Preconnect메서드일 경우 최초 접속 시 다른 node에 미리 접속해 놓는다.
- DELAY: TAF 가 장애 후에 BACKUP Session에 연결하려는 동안  기다리는 몇 초간의 지연 시간. (Default :1초)
- RETRIES: TAF 가 장애 후에 BACKUP Session 에 연결하기 위해 시도하는 횟수 (DEFAULT :5초)


설정 방법

        <database>

                <vendor>oracle</vendor>

                <export-name>oracledb2</export-name>

                <data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>

                <data-source-type>ConnectionPoolDataSource</data-source-type>

                <property>

                    <name>URL</name>

                    <type>java.lang.String</type>                                                        <value>jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=OFF)(FAILOVER=ON)(ADDRESS=(PROTOCOL=TCP)(HOST=192.167.20.174)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=192.167.20.173)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ora9i)(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC))(RETRIES=5)(DELAY=10)))</value>

<!-- 앞의 jdbc.......................(CONNECT_DATA=(SERVICE_NAME=ora9i) 부분은 CTF 설정과 동일하다. 그러나 FAILOVER_MODE 뒤에 정의되는 부분이 TAF mode method, RETRIES, DELAY 를 설정하는 부분이다.(RETRIESDELAY는 굳이 설정할 필요는 없다) 해당 옵션의 동작은 앞을 참조하라 -->

                </property>

                <property>

                    <name>User</name>

                    <type>java.lang.String</type>

                    <value>ydkwon</value>

                </property>

                <property>

                    <name>Password</name>

                    <type>java.lang.String</type>

                    <value>ydkwon</value>

                </property>

                <connection-pool>

                    <pooling>

                        <min>10</min>

                        <max>20</max>

                        <step>2</step>

                        <period>3600000</period>

                    </pooling>

                           <check-query>SELECT 1 FROM dual</check-query>

                           <check-query-timeout>60000</check-query-timeout>

                  <!-- check-query-timeout의 경우 간격을 너무 짧게 잡을 시 DB hang등이 발생하거나 네트워크가 끊기는 경우 부하를 많이 발생 시킬 가능성이 존재하므로 적절한 수치를 입력하는 게 좋다. 크리티컬한 업무의 경우는 10초나 그 이하, 그렇지 않다면 1분 정도로 잡는다면 큰 문제는 없다고 본다 -->

                </connection-pool>

            </database>

[TAF 설정]

 

앞서 이야기 했듯이 CTF와 TAF는 상반된 개념이 아닙니다. WAS가 지원하는 범위의 설정을 감안한다면 CTF를 사용해도 되지만, 보다 효율적인 FailOver를 사용하기 위해서는 TAF를 사용하는는 것이 좋습니다.

이에 대한 판단은 이글을 읽고 있는 분께서 직접하는 것이 좋겠네요.

고맙습니다.

728x90
반응형