따로 정리/서버 세팅

[서버 세팅] 4. Session Clustering (세션 클러스터링 in WAS)

규글 2024. 5. 10. 19:57

 필자는 당시 세팅 과정에서 검색을 통해 세션 클러스터링이라는 용어를 알게 되었다. 만약 필자의 세팅으로 1번 WAS 서버를 통해 페이지에 로그인을 유지하던 중, 서버에 문제가 생겨서 멈추는 등의 상황이 발생한다면 로그인 했던 세션이 만료된다. 따라서 이런 경우 로그인 한 유저의 세션을 유지하기 위해서는 세션 클러스터링 설정을 해주어야 한다.

 

    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                channelSendOptions="8"
*                channelStartOptions="3">
                
    <Manager className="org.apache.catalina.ha.session.DeltaManager"
            expireSessionsOnShutdown="false"
            notifyListenersOnReplication="true"/>
            
    <Channel className="org.apache.catalina.tribes.group.GroupChannel">
*        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
*                    address="[WAS01 사설 IP]"
*                    port="4010"
*                    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.TcpPingInterceptor" staticOnly="true"/>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
*        <Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
*            <Member
*                className="org.apache.catalina.tribes.membership.StaticMember"
*                port="4011"
*                host="[WAS02 사설 IP]"
*                uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}"
*            />
*        </Interceptor>
    </Channel>
    
        <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
        		filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
    	<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
        
    	<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>

 위와 같은 내용을 WAS 서버의 server.xml 에서 내용을 비교해서 작성해준다. 필자가 왼쪽에 * 표기를 한 곳이 필자가 추가로 작성했던 부분인 것 같다.

 

 Receiver 태그는 다른 노드로부터의 메시지를 받을 노드의 정보를 작성하는 부분이다. 태그의 address, port 속성에는 현재 server.xml을 보고 있는 WAS 서버의 사설 ip 주소와 다른 노드로부터 메시지를 받고자 하는 포트를 작성한다.

 StaticMembershipInterceptor의 태그에는 현재 서버의 메시지를 intercept할 다른 서버의 정보를 작성한다. 현재 보고있는 서버가 1번 WAS라면 2번 WAS의 정보를 작성하면 되는 것이다. Member 태그의 host와 port 속성에 사설 ip 주소와 포트를 작성한다. uniqueId는 겹치지 않도록 작성하면 된다.

 왼쪽에 *로 표기한 텍스트 줄 중에서 channelStartOptions는 3으로 설정해야만 하는데, apache tomcat docs에 따르면 multi-casting (멀티 캐스팅) 없이 channel을 구동하고 싶은 경우 3으로 설정해야만 한다고 말한다. 동일한 방식으로 2번 WAS에도 Cluster를 추가한다.

 

	(전략)

	<servlet-mapping>        
    <servlet-name>appServlet</servlet-name>
    	<url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <distributable/>
</web-app>

 server.xml 세팅이 다 되었다면 build하여 업로드했던 ROOT 하위 WEB_INF의 web.xml에서 web-app 태그 가장 아래 <distributable/>을 추가해주는 것으로 설정을 마무리했다.

 

 위 이미지는 페이지에 로그인 한 상태로 쿠키 정보를 확인한 내용이다. 왼쪽이 기존에 로그인 했던 화면으로, worker2라고 적힌 것으로 보아 2번 WAS에 세션이 있음을 알 수 있다. 이 상황에서 2번 WAS를 shutdown 했을 때에도 로그인 상태가 유지된다면 세션 클러스터링 설정에 문제가 없다고 할 수 있다.

 2번 WAS를 shutdown 하고 페이지를 새로고침 한 뒤 쿠키를 다시 확인해보면 기존 값에서 변경된 것을 확인할 수 있다.

 

 하지만 테스트를 할 때 내린 서버를 다시 올리고 올라간 서버를 내려서 확인하고자 하는 경우, 시간 텀을 조금은 두어야 세션 정보가 다른 서버로 이동하는 것을 확인할 수 있다. 급하게 서버를 내리자마자 새로고침을 하게 된다면 기존의 세션 정보가 사라져서 로그아웃 되는 것을 볼 수 있을 것이다. 둘 다 올라간 상태에서 한 쪽을 내리는 테스트에서는 별 문제가 없을테지만, 한 쪽만 켜져있는 상태에서 다른 한 쪽만 켜져있는 상태로의 테스트에서는 이를 인지하고 있어야 한다.