apache server 2.2, Tomcat5.5 로드밸런싱 및 클러스터

by ADMINPLAY posted Dec 10, 2009
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

1. 먼저 아파치 서버 2.2, 톰캣 5.5, 아파치 서버와 톰캣을 연동하기위해 톰캣 커넥터(jk 커넥터)를 아래의 주소에서 다운받는다.

아파치 서버 http://httpd.apache.org/download.cgi

tomcat5.5 http://tomcat.apache.org/download-55.cgi

JK커넥터 http://archive.apache.org/dist/tomcat/tomcat-connectors/

 

2. 아파치와 톰캣을 연결하기위해 톰캣 커넥터를 설치한다.

아파치 홈디렉토리\modules\ 위치에 톰캣커넥터를

mod_jk-1.2.27-httpd-2.2.10.so파일을 mod_jk.so로 이름을 변경후

복사해 넣는다.

 

3. 아파치 홈디렉토리\conf\httpd.conf파일에 아래의 내용을 추가한다.

파일을 열어보면 LoadModule 부분이 길게 늘어져 있을것이다.

가장 아래쪽부분에 LoadModule jk_module modules/mod_jk.so를 추가하자!

그리고 여러 모듈설정된부분 사이에 아래내용을 추가한다.

톰캣으로 위임하기위한 url패턴, 로드밸런서 설정이 있는 workers.properties등 설정을 추가한다.

 

<IfModule jk_module>
    JkWorkersFile conf/workers.properties
    JkLogFile logs/jk.log
    JkLogLevel info
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
    JkMount /*.jsp loadbalancer
    JkMount /*.do loadbalancer
    JkMount /*.html loadbalancer
    JkMount /servlet/* loadbalancer
    JkUnMount /*.gif loadbalancer
</IfModule>

 

그리고 conf디렉토리 아래 jk커넥터의 설정파일 workers.properties를 생성후

아래의 내용을 기재후 저장한다.

 

worker.list=loadbalancer

worker.tomcat1.type=ajp13
worker.tomcat1.host=192.168.0.24
worker.tomcat1.port=8009
worker.tomcat1.lbfactor=1

worker.tomcat2.type=ajp13
worker.tomcat2.host=192.168.0.3
worker.tomcat2.port=8009
worker.tomcat2.lbfactor=1

worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1,tomcat2

 

worker설정을 보면 tomcat1, tomcat2, loadbalancer가 설정되어있다.

여기서 tomcat1, tomcat2는 type가 ajp13프로토콜을 사용하는 톰캣서버를 구분하기 위한 이름이다.

이 이름은 톰캣 server.xml을 수정시 기재한다.

그리고 loadbalancer는 type가 lb 즉 로드밸런서를 의마한다.

host에는 각각 톰캣 장비의 아이피, port는 역시 톰캣 server.xml에 설정한다.

그리고 lbfactor=1는 톰캣서버 밸런스를 의미한다. 동일할시 1:1비율로 로드밸런스 한다.

이외의 자세한 사항은 아파치 사이트 http://tomcat.apache.org/connectors-doc/index.html

위치에서 확인하기 바란다.

자~ 이제 톰캣을 설정하자~

server.xml을 열고 각각의 톰캣서버에 아래부분을 수정한다.

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

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

 

 

아래부분은 톰캣설치시 기본적으로 주석으로 막혀있는데

주석을 풀어주고 원하는 설정을 추가해주면 된다.

  <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
   managerClassName="org.apache.catalina.cluster.session.DeltaManager"
   expireSessionsOnShutdown="false"
   doClusterLog="true"
            clusterLogName="clusterlog"
   useDirtyFlag="true">
   
   <Membership
    className="org.apache.catalina.cluster.mcast.McastService"
    mcastAddr="228.0.0.106"
    mcastPort="45564"
    mcastFrequency="50"
    mcastDropTime="1000"/>
   
   <Receiver
    className="org.apache.catalina.cluster.tcp.ReplicationListener"
    tcpListenAddress="auto"
    tcpListenPort="4001"
    tcpSelectorTimeout="100"
    tcpThreadCount="6"/>
   
   <Sender
    className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
    replicationMode="pooled"/>
   
   <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
    filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
  </Cluster>

그리고 아래부분을 확인하자

<Connector enableLookups="false" port="8009" protocol="AJP/1.3" redirectPort="8443"/>

아파치 서버와 통신하기 위한 AJP/1.3프로토콜 8009번 포트로 통신하도록 되어있다.

아파치서버 설정했던 내용과 동일해야한다.

 

자세한 사항은 아래 주소에서 확인하자!

http://tomcat.apache.org/tomcat-5.5-doc/cluster-howto.html

 

이제 마지막으로 클러스터링을 사용할 컨테이너 WEB-INF\web.xml파일

</web-app> 바로 윗부분에 <distributable/>을 추가하자.

 

이제 설정은 모두 끝났다.

테스트를 해보자~

 

아파치 서버를 호출해야한다. 필자는 톰캣1과 아파치서버를 같이 두었다. 테스트시 각각의 서버 윈도우  C:\WINDOWS\system32\drivers\etc\hosts파일에 도메인을 등록했다.

그리고 각각의 서버 클러스터링하고자 하는 톰캣컨테이너(<distributable/>을 추가한 컨테이너)의 아래내용의 test.jsp 페이지를 호출하자~

 

<%@ page contentType="text/html; charset=euc-kr" %>
<html>
<body bgcolor="red">
<%= request.getSession().getId() %>
<h1>Tomcat 1</h1>
</body>
</html>

 

<%@ page contentType="text/html; charset=euc-kr" %>
<html>
<body bgcolor="red">
<%= request.getSession().getId() %>
<h1>Tomcat 2</h1>
</body>
</html>

 

이제 등록한 도메인을 호출하면 페이지가 로드밸런싱되어서 세션아이디가 찍힌 톰캣서버1과 톰캣서버2를 번갈아 호출할것이다. 찍히는 세션아이디를 보면 세션아이디.tomcat1 혹은 세션아이디.tomcat2로 찍히는것을 확인할수 있을것이다. 마지막 부분이 바로 우리가 server.xml에서 설정한 jvmRoute명이다.

아파치 서버는 이를 확인하여 스티키 (sticky) 모드로 밸런싱한다. 스티키 모드란 하나의 브라우저에서 한쪽의 톰캣서버를 호출하게되면 그 브라우저는 종료시까지 끝까지 그쪽서버만을 호출하는것이다. 여기서 하나 만약 jsp페이지가 아닌 html페이지를 호출한다면 스티키 모드가 정상적으로 동작되지 않음을 확인할수 있다. 필자 생각에는 html페이지를 호출하면 톰캣컨테이너가 request를 위임받지 못하기때문에 세션아이디를 생성하지 못하여 그런것 같이라 추측된다.

그리고 한쪽 서버를 죽여보자. failover시 죽은쪽 페이지를 호출하게되면 로드밸런싱, 클러스터링되어 세션아이디가 변하지않고 다른 살아있는 톰캣서버를 호출하는것을 확인할수 있을것이다.

 

이상이다!!

나같이 삽질많이 하는사람들을 위해서 열씸히 작성했는데 설정후 생각나는대로 작성한거라 빼먹은것은 없는지 모르겠다..--ㅋ 이 글로인해 이후에 아파치 톰켓 클러스터링 설정하시는 분들에게 조금이나마 더 빠른시간에 설정했으면 하는 마음이다.

 

그리고 또하나 영어공부를 많이 해야겠다고 느꼈다...

아파치 사이트에가면 다~~ 있는것을.....--ㅋ

역시 개발자는 영어를 어느정도는 해야함을 항상 느낀다.

이상~~~^^*

출처 : http://blog.naver.com/kwonhjae/30039696384