[11] 톰캣 서버에 UCP (Universal Connection Pool) 구성 및 JSP 샘플 코드 작성

똘똘님. 톰캣 서버에 UCP를 구성한 후에도 RLB가 동작하지 않는 것 같습니다. 제 생각으로는 RLB가 정상적으로 동작한다면 부하가 적은 노드로 커넥션이 이전해야 할 것 같은데 그렇게 동작하지 않습니다. 이유를 알 수 있을까요?

네. UCP 구성의 핵심은 ONS.JAR를 설치해야 한다는 점입니다. 대부분의 문서에는 OJDBC7.JAR, UCP.JAR만 언급되어 있기 때문에 OJS.JAR를 설치해야 한다는 점을 놓치기 쉽습니다. RLB가 동작하기 위해서는 DB 서버의 ONS 프로세스와 AP 서버의 JAVA 프로세스 간의 통신이 필요하며, 이를 위해서는 AP 서버에 ONS.JAR가 필요합니다. 그럼 하나씩 살펴보도록 하겠습니다.

 


테스트 환경


  • 톰캣 버전: apache-tomcat-7.0.70
  • JDB 버전: jdk1.7.0_79
  • 오라클 12c

11-1. UCP를 위한 JAR 파일 복사


AP 서버의 $CATALINA_HOME/lib 디렉토리에 ojdbc7.jar, ucp.jar, ons.jar를 복사합니다. DB 서버에 알맞은 jar 버전을 복사하는 것이 중요하므로, 해당 파일들을 DB 서버에서 복사해서 사용하는 것이 좋습니다.

DB 서버에서의 jar 파일의 위치

  • ojdbc7.jar : $ORACLE_HOME/jdbc/lib/ojdbc7.jar
  • ucp.jar    : $ORACLE_HOME/ucp/lib/ucp.jar
  • ons.jar    : $ORACLE_HOME/opmn/lib/ons.jar

Note
$ORACLE_HOME/oc4j/opmn/lib/ons.jar 파일을 사용할 경우 에러가 발생하니, 반드시 정확한 위치의 ons.jar 파일을 이용해야 합니다.

 

11-2. UCP 구성을 위한 context.xml 편집


다음과 같이 context.xml 파일을 편집합니다.

[root@ap1 ~]# cd $CATALINA_HOME/webapps
[root@ap1 webapps]# mkdir -p onlineucp/META-INF
[root@ap1 webapps]# cd onlineucp/META-INF
[root@ap1 META-INF]# vi context.xml

<?xml version=’1.0′ encoding=’utf-8′?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Manager pathname=”” />
<Valve className=”org.apache.catalina.valves.CometConnectionManagerValve” />
<Resource
name=”jdbc/online_ucp”
       auth=”Container”
    factory=”oracle.ucp.jdbc.PoolDataSourceImpl”
type=”oracle.ucp.jdbc.PoolDataSource”
       description=”UCP Pool in Tomcat”
  connectionFactoryClassName=”oracle.jdbc.pool.OracleDataSource”
       minPoolSize=”20″
maxPoolSize=”100″
initialPoolSize=”50″
autoCommit=”false”
inactiveConnectionTimeout=”20″
  fastConnectionFailoverEnabled=”true”
       user=”apps”
password=”apps”
url=”jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)
(HOST=rac-scan)(PORT=1521))(CONNECT_DATA=
(SERVICE_NAME=ONLINE_UCP)))”
connectionPoolName=”UCPPool”
validateConnectionOnBorrow=”true”
sqlForValidateConnection=”select 1 from DUAL” />
</Context>

 

11-3. 샘플 JSP 생성


RLB 테스트를 위한 샘플 JSP를 생성합니다. 아래 코드 중에서 PoolDataSource를 이용해서 getConnection()을 수행하는 부분을 주의해서 보시면 됩니다.

[root@ap1 ~]# cd $CATALINA_HOME/webapps/online_ucp
[root@ap1 online_ucp]# vi test.jsp

<%@ page language=”java” contentType=”text/html; charset=UTF-8″  pageEncoding=”UTF-8″%>
<%@ page import=”java.sql.*”%>
<%@ page import=”javax.naming.*”%>
<%@ page import=”javax.sql.*”%>
<%@ page import=”oracle.ucp.jdbc.*”%>
<%@ page import=”oracle.ucp.admin.*”%>
<html>
<head>
<body >
<%
String   v1 = null;
Connection conn=null;
Statement st=null;
ResultSet rs=null;<>
try {
Context ctx = new InitialContext();
Context envContext  = (Context) ctx.lookup(“java:/comp/env”);
     javax.sql.DataSource ds = (javax.sql.DataSource) envContext.lookup(“jdbc/online_ucp”);
PoolDataSource pds = (PoolDataSource) ds;
                conn = pds.getConnection();

st=conn.createStatement();

String sql = “select ‘Welcome UCP’ from dual”;
rs = st.executeQuery(sql);
rs.next();
v1 = rs.getString(1);
%>
<%=v1 %>
<%
} catch (Exception e){
e.printStackTrace(System.out);
}
finally {
st.close();
rs.close();
conn.close();
}
%>
</body>
</html>

 

11-4. 톰캣 서버 기동 및 ONS 통신 여부 확인


톰캣 서버를 기동한 후에 DB 서버의 ONS 프로세스와의 통신 여부를 확인해보겠습니다. UCP는 초기 접속이 이루어진 후부터 커넥션이 연결되므로 다음 순서대로 진행합니다.

AP 서버에서 6200 포트 사용 여부 확인

root@ap1 ~]# lsof -i:6200
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    15267 root  178u  IPv6  77093      0t0  TCP ap1:58530->rac-scan:lm-x (ESTABLISHED)
java    15267 root  179u  IPv6  77094      0t0  TCP ap1:13823->rac-scan:lm-x (ESTABLISHED)
java    15267 root  180u  IPv6  77095      0t0  TCP ap1:56756->rac-scan:lm-x (ESTABLISHED)

[root@ap1 ~]# ps -ef | grep 15267
root     15267     1 34 15:23 pts/0    00:00:13 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

DB 서버에서 6200 포트 사용 여부 확인

[oracle@rac1 ~]$ lsof -i:6200
COMMAND   PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
ons     19022 oracle    8u  IPv6 5934984      0t0  TCP *:lm-x (LISTEN)
ons     19022 oracle   12u  IPv6 5948734      0t0  TCP rac1:lm-x->rac2:58878 (ESTABLISHED)
ons     19022 oracle   13u  IPv6 9863440      0t0  TCP rac-scan:lm-x->ap1:56756 (ESTABLISHED)

[oracle@rac1 SS]$ ps -ef | grep 19022
oracle   19022 19021  0 Jul08 ?        00:00:01 /ora01/app/grid/product/12.1.0/grid/opmn/bin/ons -d

[oracle@rac2 ~]$ lsof -i:6200
COMMAND  PID   USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
ons     3419 oracle    8u  IPv6 10175879      0t0  TCP *:lm-x (LISTEN)
ons     3419 oracle    9u  IPv4 10175881      0t0  TCP rac2:58878->rac1:lm-x (ESTABLISHED)
ons     3419 oracle   15u  IPv6 16250635      0t0  TCP rac-scan:lm-x->ap1:58530 (ESTABLISHED)
ons     3419 oracle   16u  IPv6 16250636      0t0  TCP rac-scan:lm-x->ap1:13823 (ESTABLISHED)


[oracle@rac2 ~]$ ps -ef | grep 3419
oracle    3419  3418  0 Jul08 ?        00:00:00 /ora01/app/grid/product/12.1.0/grid/opmn/bin/ons -d

Note
AP 서버의 java 프로세스와 DB 서버의 ons 프로세스가 6200 포트로 연결되어 있음을 알 수 있습니다. DB 서버에서 생성된 서비스 매트릭스 정보는 해당 포트를 이용해서 AP 서버의 java 프로세스에게 전달되고, java 프로세스는 해당 정보를 이용해서 RBL를 수행하게 되는 것입니다. (그림-1. 참조)

그림-1. ONS를 이용한 AP 서버와 DB 서버의 연결

11-01

참고 문헌


http://www.oracle.com/technetwork/database/application-development/planned-unplanned-rlb-ucp-tomcat-2265175.pdf

글을 마치며


이제 모든 환경 구성이 완료되었습니다. 다음 시간에는 Jmeter를 이용한 부하 테스트를 통해 RLB 동작 방식을 검증해보도록 하겠습니다.

[12] Jmeter + 톰캣 + UCP를 이용한 RLB (Runtime Load Balancing) 동작 방식 검증 바로가기

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s