[사전 준비사항]
1. 톰캣 연동
- apache와 연동 https://jparkk.tistory.com/15
- nginx와 연동
2. 톰캣 로드밸런싱 적용
- 아파치와 로드밸런싱 https://jparkk.tistory.com/42
- nginx와 로드밸런싱
※ 톰캣 세션 클러스터링의 목적 ※
1) 톰캣 간에 세션 정보를 공유하는 것.
2) 인스턴스에 장애가 발생하더라도 다른 인스턴스가 세션 정보를 갖고 있기에 유지된다.
ex) tomcat1로 세션 연결됨 → tomcat1 장애 발생 → tomcat2가 갖고 있는 세션 정보를 이용해 유지
※ 설명 참고 : https://12bme.tistory.com/467
[목차]
1. server.xml에 내용 추가
2. web.xml에 내용 추가
3. (옵션-apache와 연동했을때 진행) workers.properties에 내용 추가
4. tomcat의 index.jsp 내용을 수정하여 관찰
5. 세션클러스터링 작동 Test 진행
1. server.xml에 아래 내용 추가하기
- jvmRoute 설정
- 각 톰캣별로 다르게 지정, workers.properties에 지정한 노드명대로 넣기
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
※ 톰캣이 여러개 일 때, Receiver 쪽 port번호가 겹치지 않도록 주의!
- 아래 내용은 conf/server.xml의 Cluster 쪽 아래에 넣는다.
vi server.xml
# 아래 문장은 주석해제
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
# 아래 내용은 추가해준다(Port 번호 안겹치게 주의)
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<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="4000" <<<<<<< 톰캣 별 포트 겹치면 안됨(ex. tomcat1-4001, tomcat2-4002)
autoBind="100"
selectorTimeout="5000"
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.MessageDispatchInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<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>
2. web.xml에 내용 추가
- 아래 내용은 Tomcat 설치경로 내 webapps/ROOT/WEB-INF/web.xml의 중간쯤 넣어준다.
vi web.xml
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0"
metadata-complete="true">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
<distributable/> <<<<<<<<<<<<<<<<<<<<<<< 여기 추가
</web-app>
3. (옵션-apache와 연동했을때 진행) workers.properties에 내용 추가
# worker list
worker.list=balancer
# balancer
worker.balancer.type=lb
worker.balancer.balance_workers=tomcat1,tomcat2
worker.balancer.sticky_session=true <<<<<<<<<<<<< 추가해도 되고 안해도 됨
# tomcat1
worker.tomcat1.port=8109
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
# tomcat2
worker.tomcat2.port=8209
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
4. tomcat의 index.jsp를 수정하여 관찰
- 아래 내용을 tomcat 설치 경로 내/webapps/ROOT/index.jsp 파일 안에 넣는다.
<%@ page contentType="text/html; charset=UTF-8" %>
<%
System.out.println( "Session ID : " + session.getId() );
%>
<HTML>
<HEAD>
<TITLE>Session Clustering Test</TITLE>
</HEAD>
<BODY>
<h1>Session Clustering Test</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="./sc.jsp">[Reload]</a>
<p>
Current Session ID : <%= request.getRequestedSessionId() %><br />
<center><h3>[ 세션 정보를 얻어오는 메소드를 사용한 예제 ]</h3></center>
<hr>
<%
String id_str=session.getId();
long lasttime=session.getLastAccessedTime();
long createdtime=session.getCreationTime();
long time_used=(lasttime-createdtime)/60000;
int inactive=session.getMaxInactiveInterval()/60;
boolean b_new=session.isNew();
%>
[1] 세션 ID는 [<%=session.getId()%>] 입니다.<br><hr>
[2] 당신의 웹사이트에 머문 시간은 <%=time_used%> 입니다.<br><hr>
[3] 세션의 유효시간은 <%=inactive%> 분입니다.<br><hr>
[4] 세션이 새로 만들어 졌나요?<br><hr>
<%
if(b_new)
out.println("예 !! 새로운 세션을 만들었습니다.");
else
out.println("아니오 !! 새로운 세션을 만들지 않았습니다.");
%>
<hr>
</BODY>
</HTML>
5. 세션클러스터링 작동 Test 진행
1) Session이 연결된 톰캣과 Session ID값을 확인하고, Session 카운터가 올라가는지 확인한다.
2) Session이 연결된 톰캣을 stop한다.
3) Session ID가 유지되면서 기존 Session카운터 숫자가 이어서 올라가는지 확인한다.
※ Nginx를 이용하여 세션클러스터링 한다면 아래 내용을 넣고 하면 된다.
참고자료
https://www.didim365.com/blog/20200526-blog-2/
'Infra > Tomcat' 카테고리의 다른 글
Tomcat 메모리 설정 (0) | 2023.07.24 |
---|