사내 웹 프로젝트가 많아지고 솔루션 전체에 영향을 미치는 중요한 프로젝트를 웹으로 함에 따라 웹서버가 죽어서는 안되는 조건이 붙게 되었다. 물론 당연히 웹서버는 죽어서는 안된다. failover 처리를 비롯하여 많은 request 를 처리하기 위해 WAS 들을 WEB 서버와 연동하고 (Tomcat 도 성능이 많이 좋아졌으므로.. .Apache 와 Tomcat 을 무조건 연동해야 하는 건 아니다.. 자세한 내용은 : http://blog.naver.com/spdlqjdudghl/140202979636 <-- Apache 서버를 Tomcat 앞에 두어야 하는가? ) 분산하기 위해
Apache 의 load balancing 기술을 사용하기로 했다. (L4/L7 과 같은 하드웨어 장비를 사용하면 편하겠지만, 무료를 추구하는 사정상 소프트웨어로 이를 해결하기 로 했다.)
함께 알아보던 open source 인 HAProxy 와 nginx 는 여러 비교 끝에 한발짝 뒤로 물러나게 되었다.
관련 내용을 쉽게 정리 해 보자.
로드밸런싱이란? |
-> 하나의 인터넷 서비스가 발생하는 트래픽이 많을 때 여러 대의 서버가 분산처리하여 서버의 로드율 증가, 부하량, 속도저하등을
고려하여 적절히 분산처리 하여 해결해 주는 서비스이다.
Web Server : 192.168.3.118
WAS - 1 : 192.168.3.119
WAS - 2 : 192.168.3.120
O.S : CentOS release 5.10 (Final) 32bit
Apache 설치 |
http://kimyhcj.tistory.com/entry/Apache-%EC%84%A4%EC%B9%98-Cent-OS 참고
mod_jk.so file download |
http://tomcat.apache.org/download-connectors.cgi 에서 다운로드 (첨부파일 mod_jk.so 사용)
/etc/httpd/modules/ 에 copy
AJP Connector 설정 (/etc/httpd/conf/httpd.conf 수정) |
약 200 라인 정도에 LoadModule xxxxx/mod_xxx.so 맨 밑에 jk connector 추가
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties JkLogFile logs/jk.log JkLogLevel debug JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" JkMount /* loadbalancer --> /*.do /*.jsp 등 필요한 request 만 포워딩 할 수 있다. ( 여기서는 모든 요청에 대하여.. ) |
workers.properties 생성 (/etc/httpd/conf/workers.properties) |
worker.list=loadbalancer
worker.loadbalancer.type=lb worker.loadbalancer.balanced_workers=WAS1,WAS2 worker.loadbalancer.sticky_session=1 worker.WAS1.type=ajp13 worker.WAS1.host=192.168.3.119 worker.WAS1.port=8009 // WAS 1, WAS 2를 하나의 서버에 두려면 이 port 각 달라야 한다. worker.WAS1.lbfactor=1 worker.WAS2.type=ajp13 worker.WAS2.host=192.168.3.120 worker.WAS2.port=8009 worker.WAS2.lbfactor=1 lbfactor 옵션은 각 was 의 일 가중치 비율이다. 위의 예제는 1:1 |
WAS 서버 |
JRE 설치 (1.6.0.24 ) (http://blog.naver.com/spdlqjdudghl/140202990351 참고 )
Tomcat 설치 (/usr/local/apache-tomcat-6.0.26)
# yum install tomcat6 tomcat6-admin-webapps tomcat6-webapps
/usr/local/apache-tomcat-6.0.26/bin/./shutdown.sh --> 정지
/usr/local/apache-tomcat-6.0.26/conf/server.xml 수정
WAS - 1 (192.168.3.119 ) 약 100 line 부근에 <Engine name="Catalina" defaultHost="localhost" jvmRoute="WAS1"> <-- worker.properties 에서 설정한 이름 약 97 line 부근에 <Connector port="8009" protocol="AJP/1.3" redirect=443" /> <-- workers.properties 에서 설정한 port (default) WAS - 2 (192.168.3.120 ) 약 100 line 부근에 <Engine name="Catalina" defaultHost="localhost" jvmRoute="WAS2"> <-- worker.properties 에서 설정한 이름 약 97 line 부근에 <Connector port="8009" protocol="AJP/1.3" redirect=443" /> <-- workers.properties 에서 설정한 port (default)
|
Apache Load balancing Test |
(Test 라는 webapplication 은 미리 만들어 놓음)
Test web application 의 index.jsp 에서는 System.out.println("IP") 를 찍어본다.
1. WAS - 1 Tomcat Start (192.168.3.119)
tail -f /usr/local/apache-tomcat-6.0.26/log/catalina.out 으로 로그 확인
2. WAS - 2 Tomcat Start (192.168.3.120)
tail -f /usr/local/apache-tomcat-6.0.26/log/catalina.out 으로 로그 확인
3. Apache Service Start (192.168.3.118)
http://192.168.3.118/Test 로 접속
WAS1 과 WAS2 의 로그 확인., 만약 WAS1 로 왔으면 WAS 1 TOMCAT 을 죽이고
브라우저 새로고침 해보자. WAS2 TOMCAT 로그가 찍히면 로드밸런싱 정상처리
Tomcat Session Clustering |
--> 여러 대의 서버를 한대처럼 통합 관리 및 운용할 수 있도록 하는 기능이다. 예를 들어 로그인 정보를 세션에 가지고 있다가 해당 WAS 서버가 죽을 경우 세션 정보를 잃어 다시 로그인 해야 하는 문제를 해결하기 위해 세션 클러스터링을 사용 한다.
tomcat 6에서는 clustering 관련 library 가 포함되어 있지 않기 때문에 catalina-cluster.jar, commons-modeler.jar, commons-loggin.jar 등을 다운로드 하여 tomcat/lib 에 추가해 줘야 한다.
Server.xml 수정 |
server.xml 을 열어 보면 <cluster> tag 가 기본적으로 주석처리 되어 있다.
주석을 해제 하고 아래와 같이 수정 한다.
<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="192.168.3.119" // WAS Server 의 IP port="4000" 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"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </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.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster> |
Web Application's web.xml 수정 |
session clustering 을 위해 Test Web Application 의 web.xml 에 아래 구문을 추가 한다.
... <distributable/> ... |
Apache Server Https (SSL) 설정 |
mod_ssl.so connector 이용
사설 인증서 key, csr, crt file 생성 ( http://blog.naver.com/spdlqjdudghl/140203705085 참고)
/etc/httpd/conf.d/ssl.conf 수정 (아래 두 부분 수정)
... SSLCertificateFile /etc/pki/tls/certs/test.crt ... SSLCertificateKeyFile /etc/pki/tls/certs/test.key ... |
commons-modeler-2.0-5.5.23.jar
'IT > Web' 카테고리의 다른 글
톰캣 일반계정으로 실행 (0) | 2014.11.25 |
---|---|
뒤로가기 막기 (0) | 2014.09.16 |
Tomcat 적정 메모리 (0) | 2013.12.30 |
HTTPS와 SSL 인증서 (0) | 2013.12.27 |
tomcat clustering and load balancing with HAProxy - PART3 (0) | 2013.12.23 |