Apache Session Clustering
Apache, Tomcat Session Clustering
참고 : http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
Apache, Tomcat 을 연동하여 세션 클러스터링을 설정하기 전에 Load Balanacing 설정을 하여 성공적으로 Fail Over 가 수행되는지 확인해야 한다.
Apache, Tomcat 로드 발란싱 설정은 여기를 참조하세요
테스트 환경
Windows 7, JDK 1.8, Apache 2.2.65, Tomcat 7
Apache 1개, Tomcat 2개가 동일 시스템에 설치되어 있고 Load Balancing 이 설정된 상태
1. 로드 발란싱 설정에 성공한 Apache의 conf/workers.properties 파일의 하단에 다음과 같이 세션 클러스터링 관련 항목을 추가한다
#list of top level workers
worker.list=loadbalancer, status
worker.tomcat1.port=8009
worker.tomcat1.host=localhost <-- IP 주소를 사용하면 다른 시스템에 있는 톰캣과 연결할 수 있다
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=100
worker.tomcat2.port=8010
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=100
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1, tomcat2
worker.loadbalancer.method=B # B(Busyness), R(Requests), T(Traffic)
worker.status.type=status
worker.loadbalancer.sticky_session=1
2. Tomcat 의 webapps/ROOT/WEB-INF/web.xml 파일에 다음 내용을 추가한다
<distributable/>
</web-app>
3. Tomcat 의 conf/server.xml 의 내용 중에서 <Cluster> 요소를 찾아서 다음과 같이 입력한다. 톰캣 클러스터링 문서 참조
2개의 톰캣 모두 아래의 내용이 동일하지만 동일 시스템에서 실행되고 있기 때문에 Receiver의 port 는 서로 다르게 설정해야 한다
즉, 한개의 톰캣이 5000 번을 사용한다면 다른 톰캣은 5001 번으로 설정하면 된다.
두 인스턴스간의 통신은 멀티캐스트를 통해 이루어진다
<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="auto"
port="5000"
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>
4. 다음과 같은 session_test.jsp 를 작성하여 각 톰캣의 ROOT 폴더에 저장한다
session_test.jsp
<!doctype html>
<%
Object objCnt = session.getAttribute("count");
if(objCnt==null) {
session.setAttribute("count",1);
objCnt = session.getAttribute("count");
}
int cnt = (Integer) objCnt;
session.setAttribute("count",cnt+1);
%>
<html>
<body>
Tomcat 1 <!-- 톰캣 2에 저장할 때는 1을 2로 변경하여 저장해야 Fail Over 작동 여부를 확인하기가 용이하다 -->
<p>
<img src="tomcat.png">
<p>
COUNT of VISIT : <%=cnt%>
</body>
</html>
5. 세션 클러스터링 작동 테스트
- Tomcat 1, Tomcat 2, Apache 를 모두 실행하고 웹브라우저에서 http://localhost/session_test.jsp 으로 접속하고 Refresh 를 눌러 카운트가 올라가는 것을 확인한다. 이 때 Tomcat 1 이 요청을 처리하는지 아니면 Tomcat 2가 요청을 처리하는지 확인한다.
- 앞의 단계에서 요청을 처리한 Tomcat 을 종료하고 다른 Tomcat 은 실행되고 있는 상태에서 웹브라우저의 Refresh 버튼을 눌러 여전히 방문 카운트가 유지되면서 증가하는지 확인하고 또한 실행 중인 다른 톰캣에 의해 요청이 처리되고 있는지 확인한다.
- 이번에는 중지했던 톰캣을 다시 실행하고 실행 중이던 톰캣을 중지한다. 이 상태에서 브라우저의 Refresh 버튼을 눌러서 방문자 카운트가 여전히 유지되면서 증가하는지 확인한다.