web·was

apache-tomcat 이용한 session clustering(세션 공유)

초이짬 2016. 9. 4. 11:59
728x90

이 방법은 일반적인 방법이 아닌 전체(개별 was)들 간의 세션을 하나로 묶는 방법이다.

일반적인 클러스터링이 1번 was 와 2번 was를 묶는 것이라면 이건 1~n 개 만큼의 was 세션을 하나로 묶는 것이다

일반적인 구성은 아래와 같다.


tomcat은 8 jvm 8 을 기준 했다. WAS area 영역에서 multicast 를 통해서 세션을 공유 하는 것이다.





여기서 was 영역의 모든 톰캣이 세션을 공유하는 것이다.



=======아파치 설정==(현재구동중인 설정값이다)============


--httpd.conf--


LoadModule access_compat_module modules/mod_access_compat.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule allowmethods_module modules/mod_allowmethods.so
LoadModule asis_module modules/mod_asis.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule include_module modules/mod_include.so
LoadModule isapi_module modules/mod_isapi.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so



---httpd-vhost.conf----


#mod_jk 가 아닌 프록시 방식

#아래 설정은 contextPath를 ROOT가 아닌 개별로 나뉘었을경우다(tomcat은 그냥 ROOT)

ex)

A,B,C 의 세계의 WAS 가 존재하고 도메인은 동일하며 contextPath만을 가지고 분리 하는 것이다.

http://서버도메인/A

http://서버도메인/B

http://서버도메인/C


#ajp 포트는 각각 달리 하고(물리적으로 하나의 서버일경우)

#1개의 서버에서 여러개의 톰캣을 띄울 경우 당연히 shutdown, ajp, http포트는 충돌을 피하게 한다



ProxyRequests on
ProxyVia on


<Proxy balancer://A timeout=3>
    BalancerMember ajp://localhost:8109 route=localhost loadfactor=50  keepalive=On #1번 was(서버가 아닌 로컬 설정)
    #BalancerMember ajp://WAS2:8109 route=JOWAS2 loadfactor=50  keepalive=On #2번 was  //2번서버
    ProxySet lbmethod=byrequests
    ProxySet stickysession=JSESSIONID|jsessionid
ProxySet maxattempts=1
</Proxy>

<Proxy balancer://B timeout=3>
    BalancerMember ajp://localhost:8209 route=localhost loadfactor=50  keepalive=On
    #BalancerMember ajp://WAS2:8209 route=JOWAS2 loadfactor=50  keepalive=On
    ProxySet lbmethod=byrequests
    ProxySet stickysession=JSESSIONID|jsessionid
ProxySet maxattempts=1
</Proxy>

<Proxy balancer://C timeout=3>
    BalancerMember ajp://localhost:8309 route=localhost loadfactor=50  keepalive=On
    #BalancerMember ajp://WAS2:8309 route=JOWAS2 loadfactor=50  keepalive=On
    ProxySet lbmethod=byrequests
    ProxySet stickysession=JSESSIONID|jsessionid
ProxySet maxattempts=1

</Proxy>


#tomcat으로 넘길 부분이다.

#context path 가 각 파트name으로 되어 있지만 실제 톰캣에선 ROOT 에 디플로이 된다.

ProxyPass /A  balancer://A/A
ProxyPass /B  balancer://B/B
ProxyPass /C  balancer://C/C




#아파치 영역에서 로드할 부분들

ProxyPass /css !
ProxyPass /js !
ProxyPass /images !
ProxyPass /html !





==========tomcat 설정=================


---server.xml----

#각부분에 없는 부분을 추가한다.

#jvmRoute는 호스트 명을 준다.



  <Connector port="8409" protocol="AJP/1.3" redirectPort="8443"  emptySessionPath="true" />



  <Engine defaultHost="localhost" name="Catalina"  jvmRoute="localhost"  >



##주석된 cluster 부분에서 아래 내용 추가##

##NioReceiver 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="4014"
                      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"/>
          </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>




----context.xml----


<Context sessionCookiePath="/" >



####Application 설정#####


--web.xml---



    <session-timeout>6000</session-timeout>
    <cookie-config>
     <path>/</path>
   </cookie-config>
  </session-config>
  <distributable/>




모든 설정이 이상없고 기동을 하면 톰캣 콘솔에 mulitcast 를 이용해 세션을 공유 하는 로그가 올라온다.


===추가===


리눅스 기준 방화벽에서 해당 세션 공유를 위한 udp 포트 45564 번 포트를 열어야 된다.


포트가 안열리면 서로 세션 정보를 공유 못하니 세션 공유가 안된다.


세션 공유가 된 상태이면 서로 간의 서버가 내려가고 올라갈경우 로그에 이력이 찍힌다 찍히지 않으면 udp 통신이


안되는것이니 확인을 해보면 된다.


세션 정보의 간단한 확인 법은 크롬 기준으로 F12 눌르고 Application tab 에서 cookies 에서 세션 아이디 변동 여부를 확인 해 보면 된다.


728x90

'web·was' 카테고리의 다른 글

tomcat 메모리 설정  (0) 2017.01.26
아파치 maxclient 값 스크립트  (0) 2017.01.04
윈도우 아파치 apm ssl 적용  (0) 2016.11.15
mod_jk 예외 처리  (0) 2016.09.12
tomcat java_opts 메모리 설정  (0) 2016.09.09