Apache httpd server/Session Clustering

Apache Session Clustering

Soul-Learner 2014. 8. 3. 23:42

Apache, Tomcat Session Clustering


참고 : http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html


Apache, Tomcat 을 연동하여 세션 클러스터링을 설정하기 전에 Load Balanacing 설정을 하여 성공적으로 Fail Over 가 수행되는지 확인해야 한다.

Apache, Tomcat 로드 발란싱 설정은 여기를 참조하세요



테스트 환경

Windows 7, JDK 1.8, Apache 2.2.65, Tomcat 7

Apache 1개, Tomcat 2개가 동일 시스템에 설치되어 있고 Load Balancing 이 설정된 상태



1. 로드 발란싱 설정에 성공한  Apache의 conf/workers.properties 파일의 하단에 다음과 같이 세션 클러스터링 관련 항목을 추가한다

#list of top level workers

worker.list=loadbalancerstatus


worker.tomcat1.port=8009

worker.tomcat1.host=localhost  <-- IP 주소를 사용하면 다른 시스템에 있는 톰캣과 연결할 수 있다

worker.tomcat1.type=ajp13

worker.tomcat1.lbfactor=100


worker.tomcat2.port=8010

worker.tomcat2.host=localhost

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor=100


worker.loadbalancer.type=lb

worker.loadbalancer.balanced_workers=tomcat1tomcat2

worker.loadbalancer.method=B             # B(Busyness), R(Requests), T(Traffic)


worker.status.type=status


worker.loadbalancer.sticky_session=1




2. Tomcat 의 webapps/ROOT/WEB-INF/web.xml 파일에 다음 내용을 추가한다


<distributable/>

</web-app>



3. Tomcat 의 conf/server.xml 의 내용 중에서 <Cluster> 요소를 찾아서 다음과 같이 입력한다. 톰캣 클러스터링 문서 참조

2개의 톰캣 모두 아래의 내용이 동일하지만 동일 시스템에서 실행되고 있기 때문에 Receiver의 port 는 서로 다르게 설정해야 한다

즉, 한개의 톰캣이 5000 번을 사용한다면 다른 톰캣은 5001 번으로 설정하면 된다.

두 인스턴스간의 통신은 멀티캐스트를 통해 이루어진다

<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="auto"
                      port="5000"
                      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>



4. 다음과 같은 session_test.jsp 를 작성하여 각 톰캣의 ROOT 폴더에 저장한다


session_test.jsp

<!doctype html>

<%

Object objCnt = session.getAttribute("count");

if(objCnt==null) {

session.setAttribute("count",1);

objCnt = session.getAttribute("count");

}

int cnt = (Integer) objCnt;

session.setAttribute("count",cnt+1);

%>

<html>

<body>

Tomcat 1 <!-- 톰캣 2에 저장할 때는 1을 2로 변경하여 저장해야 Fail Over 작동 여부를 확인하기가 용이하다 -->

<p>

<img src="tomcat.png">

<p>

COUNT of VISIT : <%=cnt%>

</body>

</html>



5. 세션 클러스터링 작동 테스트

- Tomcat 1, Tomcat 2, Apache 를 모두 실행하고 웹브라우저에서 http://localhost/session_test.jsp 으로 접속하고 Refresh 를 눌러 카운트가 올라가는 것을 확인한다. 이 때 Tomcat 1 이 요청을 처리하는지 아니면 Tomcat 2가 요청을 처리하는지 확인한다.


- 앞의 단계에서 요청을 처리한 Tomcat 을 종료하고 다른 Tomcat 은 실행되고 있는 상태에서 웹브라우저의 Refresh 버튼을 눌러 여전히 방문 카운트가 유지되면서 증가하는지 확인하고 또한 실행 중인 다른 톰캣에 의해 요청이 처리되고 있는지 확인한다.


- 이번에는 중지했던 톰캣을 다시 실행하고 실행 중이던 톰캣을 중지한다. 이 상태에서 브라우저의 Refresh 버튼을 눌러서 방문자 카운트가 여전히 유지되면서 증가하는지 확인한다.