How to tomcat session clustering on linux

  2 mins read  

linux(centos7) 환경에서 apache tomcat으로 session clustering

1. Tomcat 이중화 구성하기

기존에 톰캣이 설치되어 있다면 톰캣 홈디렉토리를 복사해서 하나를 더 구성합니다. tomcatSessionClustering1

server.xml파일에서 포트를 변경해줍니다.

# nano 복사한톰캣홈디렉토리/conf/server.xml

tomcatSessionClustering2

tomcatSessionClustering3

혹시 ajp도 쓰고 있다면 변경해줍니다. tomcatSessionClustering4


catalina.sh파일에서 CATALINA 경로를 변경해줍니다. 해당위치에 아래 소스를 추가해줍니다.

# nano 복사한톰캣홈디렉토리/bin/catalina.sh
export CATALINA_HOME=복사한톰캣홈디렉토리
export TOMCAT_HOME=복사한톰캣홈디렉토리
export CATALINA_BASE=복사한톰캣홈디렉토리
CATALINA_PID=복사한톰캣홈디렉토리/bin/tomcat.pid

tomcatSessionClustering5


2. session clustering 설정

일단, 기존 톰캣에 war파일 배포한 것과 마찬가지로 복사한 톰캣에도 같은 위치에 war파일을 배포해줍니다.
그리고 아파치 httpd.cof파일에서 httpd-vhosts.conf파일에 대한 주석을 제거합니다.

# nano 아파치홈디렉토리/conf/httpd.conf

tomcatSessionClustering6

아파치 httpd-vhosts.conf파일에서 로드밸런싱 설정을 해줍니다. Proxy balancer에 stickysession으로 JSESSIONID 설정해주고, BalancerMember로 톰캣서버2개를 설정해주는데 고정세션값 route를 서로 다른 이름으로 설정합니다.

# nano 아파치홈디렉토리/conf/extra/httpd-vhosts.conf

tomcatSessionClustering7

아파치 설정이 끝났으면 톰캣의 server.xml파일cluster 설정을 해줍니다. (톰캣서버 둘다 적용)

# nano 톰캣홈디렉토리/conf/server.xml

Cluster 부분의 주석을 풀고 아래 소스를 추가해줍니다.
여기서 Membershipe 절에 address=228.0.0.4”, port=45564” 두요소는 클러스터멤버쉽을 구성합니다.(동일 클러스터는 동일 address,port를 가져야함)
동일 서버에 여러개의 톰캣을 설치하여 클러스터멤버쉽을 구성할경우 Receiver 절의 port 변경해줍니다.(톰캣2는 4001)

  <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"
                        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>

그리고 apache 로드밸런싱 설정시 해줬던 route명을 Engine의 jvmRoute명으로 설정합니다.(톰캣서버 둘다 적용) tomcatSessionClustering8

다음엔 세션을 공유하고자 하는 웹어플리케이션의 web.xml에 다음 소스를 추가해줍니다. (톰캣서버 둘다 적용)

<distributable/>

tomcatSessionClustering9

마지막으로 멀티캐스트와 Receiver포트 방화벽을 오픈해주면 됩니다.

firewall-cmd --permanent --zone=public --add-port=45564/tcp
firewall-cmd --permanent --zone=public --add-port=45564/udp
firewall-cmd --permanent --zone=public --add-port=4000/tcp
firewall-cmd --permanent --zone=public --add-port=4001/tcp
firewall-cmd --reload


clustering 설정이 끝났으면 테스트를 해봅니다.
로그인 했을 때 세션값을 가지고 오고 톰캣서버 하나를 죽였을때도 같은 세션값이 유지되는지 확인해 볼 수 있습니다.
아파치와 톰캣1,2 서버를 기동시킵니다.

# 아파치홈디렉토리/bin/apache start
# 톰캣1홈디렉토리/bin/startup.sh
# 톰캣2홈디렉토리/bin/startup.sh

아파치 80포트와 클러스터멤버쉽의 Receiver포트인 4000포트와 4001포트가 올라와 있는 지 확인합니다.
tomcatSessionClustering10

아파치에서 설정한 도메인으로 접속해봅니다. tomcatSessionClustering11

로그인 했을때, 세션값을 가져옵니다. tomcatSessionClustering12

세션값 끝에 jvmRoute명이 pc02이므로 톰캣2서버를 다운시킵니다.

# 톰캣2홈디렉토리/bin/shutdown.sh


이제 새로고침을 해보면 로그아웃되지 않고 jvmRoute명이 pc1이 되고 같은 세션값이 유지되면 성공입니다. tomcatSessionClustering13

profile img

oscar

Why do you make efforts commonly, dont't want to live commonly.

Read more