본문 바로가기

Linux/Tomcat

Session Clustering






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