본문 바로가기
FullStack/41. WEB.WAS

[TOMCAT] 톰캣을 이용한 세션 공유 설정(UDP 대신 TCP)

by nakanara 2022. 1. 3.
반응형

Apache_Tomcat_logo svg

Tomcat - TCP를 통한 세션 공유 설정

기본적으로 Tomcat에서 가이드하고 있는 세션 공유는 방법은 UDP를 통한 공유이지만, UDP 설정이 불가능한 경우 진행할 수 있는 TCP 설정 방법이다. TCP 방식으로 진행할 경우 서버 정보는 고정되어 있어야 한다.

서버 및 포트 정보

서버 PORT TCP/UDP 용도
AP1(10.10.10.1) 4055 TCP 세션 정보 수신
AP2(10.10.10.2) 4055 TCP 세션 정보 수신

설정 파일(server.xml)에 중에서 세션 공유 설정에 대한 AP1, AP2의 전반적인 내용을 아래 추가하였지만 실제 내용은 유사하며, 중요한 것은 세션 정보 수신 서버 정보이다.(한 서버에 여러 Tomcat으로 구성된 경우 포트 수정 필요)

<Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor"> 
    <Member className="org.apache.catalina.tribes.membership.StaticMember"  
    host="10.10.10.2"  -- 세션 정보 수신 서버 AP1 → AP2
    port="4055" -- 세션 정보 수신 포트                
    uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2}" /> -- 대상 서버 고유 값
</Interceptor>

AP1(10.10.10.1) - server.xml

AP1번 서버에서 AP2번 서버로 세션 공유

<!-- apache jk_mod의 경우 jvmRoute값을 이용하여 사용 was 판단 -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="was1">
    <!-- channelSendOptions 비동기 세션 공유-->
    <!-- 
        멀티캐스팅 없이 서버 시작하려면 channelStartOptions = 3 옵션
        https://tomcat.apache.org/tomcat-8.5-doc/config/cluster.html     
    -->
    <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">

            <!-- 클러스터 전송 -->
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 
                <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" /> 
            </Sender>


            <!-- 수신 대상 지정 -->
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                        address="auto"  -- 자신의 IP
                        port="4055"     -- 수신포트
                        autoBind="0"    -- 수신 포트 변경 범위, 수신 대상이 고정이므로 0
                        selectorTimeout="5000" -- 대기 시간
                        maxThreads="6"/>

            <!--  PING 체크 여부
            staticOnly: 고정멤버 
            -->
            <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.StaticMembershipInterceptor"> 
                <Member className="org.apache.catalina.tribes.membership.StaticMember"     
                host="10.10.10.2"  -- 세션 정보 수신 서버 AP1 → AP2
                port="4055" -- 세션 정보 수신 포트               
                uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2}" /> -- 대상 서버 고유 값
            </Interceptor>

            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
        </Channel>

        <!-- 데이터 복제 시기 설정 
        filter: 필터에 속하는 자원의 경우 세션 변경 여부 공유 불필요
        -->
        <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" 
            filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt" />

        <!-- 동일 서버로 요청이 들어오도록 설정 -->
        <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

        <!-- 메시지 수신 -->
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>

    ...
</Engine>

AP2(10.10.10.2) - server.xml

AP2번 서버에서 AP1번 서버로 세션 공유

<!-- apache jk_mod의 경우 jvmRoute값을 이용하여 사용 was 판단 -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="was2">
    <!-- channelSendOptions 비동기 세션 공유-->
    <!-- 
        멀티캐스팅 없이 서버 시작하려면 channelStartOptions = 3 옵션
        https://tomcat.apache.org/tomcat-8.5-doc/config/cluster.html     
    -->
    <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">

            <!-- 클러스터 전송 -->
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 
                <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" /> 
            </Sender>

            <!-- 수신 설정 -->
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                        address="auto"  -- 자신의 IP
                        port="4055"     -- 수신하기 위한 port
                        autoBind="0"    -- 수신 포트 변경 범위, 수신 대상이 고정이므로 0
                        selectorTimeout="5000" -- 대기 시간
                        maxThreads="6"/>

            <!-- PING 체크 여부 
            staticOnly: 고정멤버 
            -->
            <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.StaticMembershipInterceptor"> 
                <Member className="org.apache.catalina.tribes.membership.StaticMember"                  
                host="10.10.10.1"  -- 세션 정보 수신 서버 AP2 → 1
                port="4055" -- 세션 정보 수신 포트  
                uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}" /> -- 대상 서버 고유 값
            </Interceptor>

            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
        </Channel>

        <!-- 데이터 복제 시기 설정 
        filter: 필터에 속하는 자원의 경우 세션 변경 여부 공유 불필요
        -->
        <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" 
            filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt" />

        <!-- 동일 서버로 요청이 들어오도록 설정 -->
        <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

        <!-- 메시지 수신 -->
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>

    ...
</Engine>

추가적으로 web.xml 파일에 distributable 옵션이 활성화되어 있어야 한다.

<web-app>
    <!-- 세션 공유 활성화-->
    <distributable />
</web-app>

참고

#Tomcat #session #세션공유 #cluster

반응형