WAS (Web Application Server) 를 1대로 돌릴 경우 서버에 이상이 생기거나 접속자 수에 의한 과부하로 인해 시스템이 불안정할 수 있다.
따라서, 여러 대의 WAS를 구축하여 로드밸런싱을 구축, 서버에 부담을 줄일 수 있다.
하지만, 로드밸런싱으로 인해서 접속자는 1번 was, 2번 was를 왔다갔다 접속할 경우가 생기는데 이로 인해서 세션이 끊긴다는 문제가 있다.
한 번 세션이 연결되면 로드밸런싱을 통해 어디로 접속하던지 세션이 유지될 수 있도록 세션 클러스터링이 필요하다.
1. 로드밸런싱 설정
먼저, 로드밸런싱 설정부터 진행해보겠다.
Web Server(Apache)에서 workers.properties 파일을 설정해준다.
[root@localhost ~]# vi /../conf/workers.properties
worker.list=loadbalancer
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=was1, was2
worker.loadbalancer.ping_mode=I
worker.loadbalancer.ping_timeout=1000
worker.loadbalancer.sticky_session=1
worker.loadbalancer.connection_pool_timeout=20
#was1
worker.was1.port=8009
worker.was1.host=192.168.0.141
worker.was1.type=ajp13
worker.was1.lbfactor=1
worker.was1.max_packet_size=65536
#was2
worker.was2.port=8009
worker.was2.host=192.168.0.142
worker.was2.type=ajp13
worker.was2.lbfactor=1
worker.was2.max_packet_size=65536
1. Server.xml 설정
[root@localhost ~]# /../conf/server.xml
<!—host 사이에 내용 추가
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<!--
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
-->
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="현재서버 IP"
port="4001서버마다 다르게"
selectorTimeout="100"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
※추가적으로 다음과 같은 내용을 추가하라는 것을 많이 봤는데, 테스트 해본 결과,
다음과 같은 내용을 기입할 시에 로드밸런싱에 문제가 발생했다. 이 부분은 접속자가 자신이 현재 어느 서버에
접속했는지 확인할 수 있는 부분인데 기입하지 않아도 세션 클러스터링 자체에는 큰 이상이 없다. 추후에 재 테스트를 진행해볼 예정.
<Engine name=”Catalina” defaultHost=”localhost”>
è <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”tomcat1”>
3. web.xml 설정
최하단 부분 다음과 같은 위치에 <distributable/> 추가한다.
web.xml 파일이 conf안에도 존재하기 때문에 헷갈릴 수가 있는데, Tomcat내에 webapps/ROOT/WEB-INF이다.
만약에 웹 어플레이션 경로를 변경했다면 (예를 들어 /testweb) /testweb/WEB-INF/ 으로 전체 복사를 한 후 내용을 변경한다.
[root@localhost ~]# vi /tomcat/ROOT/WEB-INF/web.xml
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>Clustering Test</display-name>
<distributable/>
</web-app>
4. 테스트
터미널 하나 추가 후
[root@localhost ~]# service tomcatd start
[root@localhost ~]# tail -F /../tomcat/logs/catalina.out
Tomcat 시작 시 catalina.out에서 아래와 같이 Replication member added 로그를 확인
INFO: Replication member added:org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 0, 142}:4002,{192, 168, 0, 142},4002, alive=1013, securePort=-1, UDP Port=-1, id={59 -53 102 108 60 93 66 20 -76 -20 -30 106 -103 4 6 -48 }, payload={}, command={}, domain={}, ]
그리고 테스트 페이지를 생성하여 웹 페이지에서도 확인한다.
※ 테스트 페이지에 대한 소스는 구글링을 해서 얻은 것이기 때문에 혹시라도 문제 시 자삭하겠습니다.
test.jsp
<%@ page contentType="text/html; charset=euc-kr" %>
<HTML>
<HEAD>
<TITLE>Session Clustering Test WAS1</TITLE>
</HEAD>
<BODY>
<h1>Session Clustering Test WAS1</h1>
<%
Integer ival = (Integer)session.getAttribute("_session_counter");
if(ival==null) {
ival = new Integer(1);
}
else {
ival = new Integer(ival.intValue() + 1);
}
session.setAttribute("_session_counter", ival);
System.out.println("here~~~~");
%>
Session Counter = [<b> <%= ival %> </b>]<p>
<a href="./test.jsp">[Reload]</a>
<p>
Current Session ID : <%= request.getRequestedSessionId() %><br />
</BODY>
</HTML>
사실 실제로 구축할 때는 WAS1과 WAS2의 내용이 같아야 하겠지만 현재는 세션 클러스터링을 테스트 해봐야하기 때문에
Session Clustering Test WAS1 이 부분을 WAS1 과 WAS2에서 내용을 다르게 해서 현재 접속한 서버가 1번인지 2번인지 알 수 있도록 하고
http://웹서버ip/test.jsp 로 접속한 후 새로고침을 한다.
위에서 볼 수 있듯이 새로고침을 하면서 WAS서버를 왔다갔다 하더라도 Session ID는 동일하다.
테스트 페이지에 대한 소스는 기본적으로 현재 세션아이디를 확인한다는 기본은 같지만 테스트 방법에 대해선 약간의 차이가 있을 수 있으므로
다른 곳에서 얻은 소스라면 방법이 약간 다를 수 있다.
'Linux > Tomcat' 카테고리의 다른 글
Apache Tomcat 연동 (0) | 2016.11.03 |
---|---|
Tomcat 다중 설치 (0) | 2016.11.03 |
CentOS + Tomcat 설치 (0) | 2016.11.03 |