2012년 1월 29일 일요일

Apache 와 Tomcat Load Balancing


mod_jk tomcat Connector : 

mod_jk는 tomcat servlet container와 Apache같은 AJP프로토콜을 사용하는 웹서버를 연결해주는 connector 입니다.

웹서버는 client의 request로부터의 response를 관리합니다.
request 가 올때 웹서버는 다음과 같은 행동을 하게합니다.

- sevlet containner connector library를 로드하고 초기화합니다.
- connector에서 인증된 url 포함한 어떤 request를 sevlet에게 주게됩니다.

이렇게 Connector는 웹서버와 container의 중간 매개체 역활을 합니다.

아래의 준비물을 다운받습니다.

1. apache web server 2.2.21(http://httpd.apache.org/download.cgi.)

일단 톰캣을 인스톨합니다.

1. 압축을 풀고 임의의 위치(디렉토리)에 위치시키도록 합니다.
2. 일단 설치후 {tomcat_root}/bin 에서  ./startup.sh를 실행시켜서 tomcat을 구동시킵니다.
3. 웹브라우저를 열어서 http:localhost:8080 에 접속합니다.
4. 3번 bin으로 돌아가서 ./shutdown.sh로  tomcat을 끕니다.

로드 밸런싱을 할 예정이므로 두개의 서버를 띄워야합니다.

1. 첫번째 받은 tomcat을 디렉토리이름만 다르게 압축을 풉니다.
    여기서는 처음 녀석은 tomcat1, 두번째 녀석은 tomcat2라고 합니다.
2. tomcat2의 하위 디렉토리에 conf폴더로 접근해서 server.xml 을 열어 보도록합니다.
3. <Server port=”8005″ shutdown=”SHUTDOWN”>  를 <Server port=”7005″ shutdown=”SHUTDOWN”>로 변경합니다.
(앞서 포트는 tomcat1이 사용중이니)
4. Change <Connector port=”8080″ maxHttpHeaderSize=”8192″… 를 <Connector port=”7070″ maxHttpHeaderSize=”8192" 변경한다.(위와 같은이유)
5.  <Connector port=”8009″ enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ /> 를  <Connector port=”7009″ enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ />로 변경합니다.
6. tomcat2/bin으로 가서 ./statup.sh를 실행합니다.
7. http://localhost:7070/을 확인합니다.
8. bin으로 가서 ./shutdown.sh를 해서 끕니다.

다음은 apache서버를 세팅합니다.
(mac은 기본적으로 깔려있죠. 경로 : /usr/libexec/apache2)

1. 압축을 풀고 ./configure을 합니다.
2. make를 입력하여 설치를 진행합니다.
3. 웹브라우저를 열고  http://localhost/로 가서 80포트로 잘작동하는지 확인합니다.
4. stop 합니다.

이제 mod_jk 차례입니다.

1. 압축을 풀고 {apache_directory}/module에 mod_jk.so 파일을 copy & paste합니다.
2. {apache_directory}/conf 안에서 httpd.conf 파일을 수정할수 있게 열고 끝에 아래 문장을 추가합니다.
LoadModule jk_module modules/mod_jk.so 
3.{apache_directory}/conf 에 workers.properties라는 파일을 만든고 아래의 문장을 넣고 저장합니다.
  worker.list=worker1,worker2
                                worker.worker1.port=8009
                                worker.worker1.host=localhost
                                worker.worker1.type=ajp13
                                worker.worker2.port=7009
                                worker.worker2.host=localhost #you can also specify other machine address or name
                                worker.worker2.type=ajp13

-  wokrer1이 tomcat1, worker2가 tomcat2이다.

4.  httpd.conf 에  workers.properties를 정의해줘야한다. 
아래 내용을 넣어준다.

# Path to workers.properties
JkWorkersFile c:/apache2.2/conf/workers.properties
# Path to jk logs
JkLogFile c:/apache2.2/mod_jk.log
# Jk log level [debug/error/info] JkLogLevel info
# Jk log format
JkLogStampFormat “[%a %b %d %H:%M:%S %Y] “
# JkOptions for forwarding
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat “%w %V %T”
JkMount /jsp-examples/* worker1
JkMount /tomcat-docs/* worker2

5. jsp-examples로  tomcat1이 worker1로 tomcat-docs에는 tomcat2가 worker2로 되어 있다.

6. tomcat 1,2의 server.xml 을 수정합니다.
tomcat1에는 <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”worker1″>
tomcat 2에는 <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”worker2″>를 추가합니다.
7. tomcat1,2를 statup하고 apache webserver도 start합니다.

여기서 브라우저는 http://localhost/jsp-examples/ 와 http://localhost/tomcat-docs.를 둘다 가리킵니다.
여기서 이것을 구분하기 쉬운방법은 두 톰캣의 index.jsp의 제목을 변경해서 확인하는것입니다.
결국 둘은 따로 각각 경로를 가리키고 있는것을 확인할수가 있습니다.
이 시점에서 아파치 의 서브로 톰캣 인스턴스의 경로에 요청을 넘길 준비가 된것입니다.
하지만 여기서 톰캣에 대한 로드밸런싱에 관한 설정을  해줘야합니다. 만약 톰캣 1이 크래싱이 발생시 아파치는 자동으로 tomcat2에 어플리케이션에 대한 접근을 넘겨야합니다.
로드밸런싱 설정은 단순합니다.
우선
workers.properties를 열어줍니다. 
아래의 굵은글씨를 수정,추가합니다.

#worker.list=worker1,worker2
 worker.list=balancer
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
worker.worker2.port=7009
worker.worker2.host=localhost
worker.worker2.type=ajp13
worker.worker2.lbfactor=1
worker.balancer.type=lb
worker.balancer.balance_workers=worker1,worker2
worker.balancer.method=B
# specifies whether requests with SESSION ID’s should be routed back to the same #Tomcat worker.
worker.balancer. sticky_session =True


싱글 워커에  balance 를 call하고 worker type에 lb(load balance)를 정의했습니다.
이 워커(worker.balancer.balance_workers)들은 worker1과 worker2를 관리합니다.
그리고 method에 'B'를 정의했습니다.
마지막 sticky_session는 true로 해줘야합니다. 
Session ID를 기반으로 라우팅을 지원할지에 대한 설정입니다..

마지막으로 httpd.conf를 열고  JkMount 맨앞부분에

JkMount /tomcat-docs/* balancer
JkMount /jsp-examples/* balancer

이 부분을 추가합니다.
이제 확인작업으로 tomcats와 apache를 구동하고 http://localhost/jsp-examples에 접속합니다. tomcat1or tomcat2에 접속하게 될것입니다.  

tomcat1,2에 둘다 접속된다는것을 확인하기 위해 앞서 해당 index.jsp를 교체하였던걸 생각하고 새로고침을 하여 첫페이지의 제목이 바뀌는것을 확인합니다.

댓글 없음:

댓글 쓰기