[사전 준비사항]

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://jparkk.tistory.com/43

 

 

참고자료

https://www.didim365.com/blog/20200526-blog-2/

https://fliedcat.tistory.com/6

https://syhwang.tistory.com/83

'Infra > Tomcat' 카테고리의 다른 글

Tomcat 메모리 설정  (0) 2023.07.24

참고URL

https://joont.tistory.com/42

 

톰캣 메모리 설정

JVM 구조유지보수를 진행하다 처음보게 된 Out Of Memory .. 굉장히 난감했었으나 다행히 해결하게 되어 글로써 남기고자 합니다 ㅋㅋ개인이 공부할 때나, 개발 도중 단위 테스트만으로는 발견하기

joont.tistory.com

 

Tomcact의 메모리 설정은 Tomcat 설치경로/bin/setenv.sh에서 선언해주면 된다.

(* catalina.sh에서 선언해도 되지만, setenv.sh에 넣으라고 적혀있다.)

setenv.sh를 만들어서 설정을 추가해준다.

$ vi setenv.sh
## Tomcat Memory Config

JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx512m -XX:MaxPermSize=128m"
<size>부분에 용량을 지정하면 된다.

- Xms<size>  : Java Heap의 최소 크기값을 지정
- Xmx<size>  : Java Heap의 최대 크기값을 지정
- XX:PermSize=<size>  : Permanent Generation의 최초 크기를 지정
- XX:MaxPermSize=<size>  : Permanent Generation의 최대 크기를 지정

설정을 적용하고 톰캣을 재기동하면 된다.

아래 그림의 표시한 부분처럼 메모리 설정이 적용 된 것을 확인 할 수 있다.

 

'Infra > Tomcat' 카테고리의 다른 글

Tomcat 세션 클러스터링(RHEL8)  (0) 2023.10.23

+ Recent posts