Skip to end of metadata
Go to start of metadata

개요


데이터베이스 시스템을 운영하는 도중, 장애가 발생하였을 때 이를 극복하고 장애에 관계없이 서비스를 계속할 수 있도록 Fail-Over 기능을 제공합니다.

여기에서는 Altibase JDBC Fail-Over 의 기능과 사용 방법에 대해 설명합니다.

용어 설명


  • CTF(Connection Time Fail-Over) : DBMS 접속 시점에 장애가 감지되면 다른 가용 노드의 DBMS로 접속을 재시도하는 것을 의미합니다.
              • Connection String 에 AlternateServer 속성을 설정하면 기본으로 CTF가 동작합니다.
              • 일반적인 응용프로그램은 다시 Connection 을 시도해야 합니다.
              • WAS 와 같이 Connection Pool 을 유지하는 형태에서는 WAS 의 Connection Validation 설정을 통하여 자동적 수행할 수 있습니다.
  • STF(Service Time Fail-Over) : DBMS 가 클라이언트의 요청을 처리하는 도중에 장애가 감지되면 다른 가용 노드의 DBMS에 다시 접속하는 것을 의미합니다.
              • Connection 까지만 수행후 성공여부를 에러로 반환하기에 statement 의 prepare 부터 다시 진행될 수 있도록하는 사용자 코딩이 수반되어야 합니다.
  • 기본서버(Primary Server) : Connection URL에서 첫 번째에 명시된 서버정보를 의미합니다.
  • 대체서버(Alternative Server) : AlternateServer 연결속성에 명시된 서버들의 정보를 의미합니다.
  • 명시적 연결(Explicit Connection) : Connection 객체의 connect 메소드를 호출하는 것을 의미합니다.
  • 내부적 연결(Implicit Connection) : connect 메소드가 실패하거나 STF가 발생하여 JDBC 내부적으로 다른 가용 노드의 DBMS로 접속을 재시도하는 것을 의미합니다.

Fail-Over 관련 연결 속성


* 대소문자 구분하지 않음.

  • AlternateServer : 대체서버들을 의미하며 (IP1:Port1, IP2:Port2,...) 형식으로 기술합니다.
                               대체서버들은 LoadBalance와 SessionFailOver의 설정에 따라 다음의 경우에 연결 대상 서버가 될 수 있습니다.
        • connect 메소드 호출 시
        • connect 메소드 실패로 재연결 시도 시
        • STF 발생으로 재연결 시도 시
  • ConnectionRetryCount : 동일 서버로 접속 시도 반복 횟수를 설정합니다.
  • ConnectionRetryDelay : 동일 서버로 접속 시도 대기 시간으로 단위는 초(second)입니다.
    참고) ConnectionRetryCount와 ConnectionRetryDelay 속성은 내부적 연결 시에만 적용되며, ConnectionRetryCount * ConnectionRetryDelay 만큼 수행 후 실패하면 또 다른 가용 서버로 동일한 방법으로 접속을 시도합니다.
  • LoadBalance : DBMS 연결 시 기본서버와 대체서버의 연결 시도 순서를 설정합니다.
                            ON으로 설정 시 기본서버와 대체서버 중에서 랜덤으로 연결 시도합니다.
                            OFF로 설정 시 기본서버부터 연결 시도하고, 실패할 경우 대체서버의 나열 순서대로 연결 시도합니다.
                            이 설정은 명시적 연결과 내부적 연결 모두에 해당합니다.
  • SessionFailOver : STF를 할 것인지 여부를 설정합니다.
                                 ON으로 설정 시 CTF+STF로 동작합니다.
                                 OFF로 설정 시 CTF만 동작합니다.   
  • FailOver_Source : Failover를 수행할 때, 서버에 전달하는 Failover source에 대한 설명을 지정합니다. 이 정보는 V$SESSION 성능 뷰의 FAILOVER_SOURCE 칼럼에 저장됩니다.
  • HealthCheckDuration : Altibase JDBC는 Failover를 위해 가용 서버 목록을 관리합니다. Failover 시 가용 서버 목록의 서버들을 대상으로 재연결을 시도합니다. 이는 모든 서버가 장애 상황에서 무한루프로 연결 시도하는 것을 막기 위함입니다.

                                        HealthCheckDuration 속성은 Failover가 발생한 서버가 다시 가용 서버 목록으로 설정되기 위한 대기시간을 지정합니다.
                                        Failover가 발생하면 해당 서버는 가용 서버 목록에서 삭제되었다가 HealthCheckDuration 시간이 지난 후에 다시 가용 서버 목록에 추가되며 이 속성의 단위는 초(second)입니다.

Fail-Over 성공 여부 확인


  • CTF : 데이터베이스 연결이 되는지에 따라 성공 여부를 바로 알 수 있습니다.
  • STF : exception 처리를 통해서 확인할 수 있습니다.
             SQLException에서 getSQLState() 메소드의 반환값이 08F01(6.3.1 이상) 또는 ES_08FO01(6.1.1 이하)이면 FailOver가 성공한 것입니다.

예제


프로그램 작성 시 다음 예제를 참고하세요.

import Altibase.jdbc.driver.*;
import Altibase.jdbc.driver.ex.*;
import java.util.Properties;
import java.sql.*;
import java.io.*;

class  FailOverSampleSTF
{
    public static void main(String args[])  throws Exception
    {
        //---------------------------------------------------
        // Initialization
        //---------------------------------------------------
       
        String sURL = "jdbc:Altibase://127.0.0.1:" + args[0]+"/mydb?AlternateServers=(128.1.3.52:20300,128.1.3.53:20300)&ConnectionRetryCount=3&ConnectionRetryDelay=10&SessionFailOver=on&LoadBalance=off";
       

        try
        {
            Class.forName("Altibase.jdbc.driver.AltibaseDriver");
        }
        catch ( Exception e )
        {
            System.err.println("Can't register Altibase Driver\n");
            return;
        }

        //---------------------------------------------------
        // Test Body
        //---------------------------------------------------

        Properties sProp = new Properties();
        Connection sCon;
        PreparedStatement  sStmt = null;
        ResultSet sRes = null ;
        sProp.put("user", "SYS");
        sProp.put("password", "MANAGER");
        
        sCon = DriverManager.getConnection(sURL, sProp);

        sStmt = sCon.prepareStatement("SELECT C1 FROM T2   ORDER BY C1");

        while(true)
        {
            try
            {
                sRes = sStmt.executeQuery();
                while( sRes.next() )
                {
                    System.out.println( "VALUE : " + sRes.getString(1)  );
                }
            }
            catch ( SQLException e )
            {
                //Failover 확인.
                //if (e.getSQLState().equals("ES_08FO01"))  // 6.1.1 이하
                if (e.getSQLState().equals("08F01"))             // 6.3.1 이상
                {
                    sStmt = sCon.prepareStatement("SELECT * FROM tb_test1");   // Failover 발생 시 prepare를 다시 해주어야 한다.
                    continue;
                }
                System.out.println( "EXCEPTION : " + e.getMessage() );
                break;
            }
            break;
        }
        
        sRes.close();

        //---------------------------------------------------
        // Finalize
        //---------------------------------------------------
      
        sStmt.close();
        sCon.close();
    }
}

참고문서


  • Replication Manual -> 4장 FailOver

  • JDBC User's Manual -> 1장 JDBC 시작하기 -> 연결정보

                                          3장 고급기능 -> JDBC와 FailOver

  • No labels