★ 결론 : 제일 아래 이중화 요약부분만 진행하면 실행 됨 ★
[동작 방식]
- 웹 서버 (Apache HTTP Server):
- Apache HTTP Server는 클라이언트(사용자)로부터 HTTP 요청을 받습니다.
- 요청이 들어오면 Apache는 로드밸런싱 기능을 통해 두 대의 Tomcat 서버 중 하나로 요청을 전달합니다.
- 이때, Apache는 세션 유지를 위해 스티키 세션(Sticky Session)을 사용할 수도 있습니다.
- Tomcat 서버 (WAS):
- Tomcat 1과 Tomcat 2는 클러스터링을 통해 세션 정보를 공유하며, 두 서버는 동일한 세션을 가지고 처리할 수 있습니다.
- 예를 들어, 사용자가 Tomcat 1에 접속해 세션을 생성하고, 이후 Tomcat 2로 트래픽이 전달되더라도 같은 세션 정보를 유지할 수 있게 됩니다. 이를 위해 세션 복제 또는 외부 세션 저장소(Redis, Memcached 등)를 사용할 수 있습니다.
- 로드밸런싱:
- Apache HTTP Server는 mod_jk 또는 mod_proxy를 사용하여 두 Tomcat 서버 간에 부하를 분산합니다.
- 두 Tomcat 서버가 동일한 세션을 유지하도록 설정되므로, 사용자가 요청하는 페이지가 어떤 Tomcat 서버에서 처리되든 세션 정보가 유효하게 유지됩니다.
[ 설정 방법 ]
(사전 환경셋팅)
1. apache 설치
2. tomcat 2개 설치
3. jdk 서맃
(실제 이중화 작업)
1. Tomcat 클러스터 설정
Tomcat의 클러스터링을 통해 여러 대의 Tomcat 서버가 세션 정보를 공유하고, 세션 복제가 가능합니다. 이를 위해 <Cluster> 설정을 추가해야 합니다.
1.1. Tomcat server.xml 파일 수정
Tomcat 서버 설정 파일(server.xml)에 클러스터링 관련 설정을 추가합니다.
<Engine name="Catalina" defaultHost="localhost"> <!-- 클러스터 설정 --> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <!-- 세션 복제용 설정 --> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="true" /> <!-- 클러스터 통신을 위한 설정 --> <Receiver className="org.apache.catalina.ha.tcp.TcpClusterReceiver" address="auto" port="4000" selectorTimeout="10000" /> <Sender className="org.apache.catalina.ha.tcp.TcpClusterSender" /> </Cluster> </Engine> |
- TcpClusterReceiver: 클러스터 노드들 간에 세션 데이터를 수신합니다.
- TcpClusterSender: 클러스터 노드들 간에 세션 데이터를 전송합니다.
- ReplicationValve: 세션 복제 및 필터링을 담당합니다.
# 위 설정은 로드밸런서 설정하지않을 경우에 사용 #
- 클러스터 설정 (<Cluster>)은 Tomcat 인스턴스 간 세션 복제를 위한 설정입니다. 여러 Tomcat 인스턴스가 서로 세션을 공유하고 동기화해야 하는 경우에 필요합니다.
- 로드밸런싱 환경에서 세션 공유가 필요하면 클러스터 설정을 사용해야 하며, 세션 복제를 위해 Tomcat 클러스터 설정을 추가해야 합니다.
- 만약 세션을 외부 캐시(예: Redis)나 다른 방식으로 처리하거나, 로드밸런서에서 세션을 처리하도록 설정한 경우, Tomcat의 클러스터 설정은 필요하지 않습니다.
2. 로드밸런서 방식의 WAS 이중화
Apache HTTP Server와 같은 웹서버를 사용하여 여러 Tomcat 인스턴스를 로드밸런싱하는 방식으로 이중화를 구현할 수 있습니다. Apache HTTP Server에서 로드밸런싱을 설정하면, 여러 WAS 인스턴스(Tomcat)에 트래픽을 분산시키고, 서버가 다운되더라도 다른 인스턴스가 요청을 처리할 수 있습니다.
WAS 이중화 설정 과정
웹서버에서 WAS 이중화를 설정하려면 Apache HTTP Server와 Tomcat 간의 로드밸런싱을 구현해야 합니다. 이를 위해 **mod_proxy_balancer**와 **mod_proxy**를 사용하여 여러 WAS 서버를 연결할 수 있습니다.
1. 필요한 모듈 활성화
먼저 Apache에서 로드밸런싱 관련 모듈들을 활성화합니다. mod_proxy와 mod_proxy_balancer가 필요합니다.
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
sudo a2enmod lbmethod_byrequests
2. Apache 설정 파일에 로드밸런서 설정
httpd.conf 또는 /etc/httpd/conf.d/tomcat.conf 파일
<VirtualHost *:80> ServerName yourdomain.com # Load balancing configuration <Proxy "balancer://mycluster"> BalancerMember http://tomcat1:8080 BalancerMember http://tomcat2:8080 # 추가 Tomcat 서버를 추가할 수 있습니다. ProxySet lbmethod=byrequests </Proxy> # 모든 요청을 로드밸런서로 전달 ProxyPass / balancer://mycluster/ ProxyPassReverse / balancer://mycluster/ # 로드밸런서 관리 페이지 <Location /balancer-manager> SetHandler balancer-manager Require all granted </Location> DocumentRoot /var/www/html </VirtualHost> |
>> 설정설명
- balancer://mycluster: mycluster라는 이름의 로드밸런서 클러스터를 정의합니다.
- BalancerMember http://tomcat1:8080: 로드밸런싱 대상이 되는 Tomcat 인스턴스들을 정의합니다. http://tomcat1:8080은 Tomcat 서버가 8080 포트를 사용한다고 가정한 것입니다.
- ProxySet lbmethod=byrequests: 로드밸런싱 방법을 설정합니다. byrequests는 요청 수에 따라 트래픽을 분배하는 방식입니다. 다른 방법으로는 bytraffic이나 bybusyness가 있습니다.
- ProxyPass 및 ProxyPassReverse: 모든 HTTP 요청을 로드밸런서로 전달하고, 응답을 다시 로드밸런서를 통해 클라이언트로 전달합니다.
- BalancerManager: 로드밸런서 상태를 모니터링할 수 있는 웹 UI를 제공합니다. /balancer-manager URL을 통해 로드밸런서 상태를 확인할 수 있습니다.
3. TOMCAT 설정
각각의 Tomcat 서버가 요청을 받을 수 있도록 AJP 프로토콜을 활성화해야 합니다. server.xml에서 AJP 커넥터가 설정되어 있는지 확인합니다.
위와 같이 Tomcat 서버의 server.xml에서 AJP 커넥터가 설정되어 있다면 Apache HTTP Server와 AJP 프로토콜을 사용하여 통신할 수 있습니다.
4. 로드밸런서 상태 확인
balancer-manager 페이지를 통해 Apache에서 로드밸런싱 상태를 모니터링할 수 있습니다. 브라우저에서 http://yourdomain.com/balancer-manager를 열면 로드밸런서의 상태를 확인할 수 있습니다.
5. Tomcat 세션 공유 (Optional)
로드밸런싱을 사용하면서 세션을 여러 Tomcat 인스턴스 간에 공유하려면 세션 복제나 클러스터링을 설정해야 할 수도 있습니다. 이를 위해 Tomcat에서 **Cluster**를 설정하거나, **Redis**나 **Memcached**와 같은 외부 세션 저장소를 사용할 수 있습니다.
Tomcat 클러스터링 설정
Tomcat의 context.xml에 세션 복제 설정을 추가합니다.
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"> <Manager className="org.apache.catalina.ha.session.DeltaManager" /> <Channel className="org.apache.catalina.tribes.channel.local.LocalChannel" /> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" /> <Receiver className="org.apache.catalina.ha.tcp.TcpReceiver" /> <Sender className="org.apache.catalina.ha.tcp.TcpSender" /> </Cluster> |
위 설정은 Tomcat 클러스터링을 통해 여러 인스턴스 간 세션을 공유할 수 있도록 합니다. 이는 웹 애플리케이션에서 세션을 하나의 Tomcat 인스턴스에만 저장하지 않고, 여러 인스턴스가 세션을 공유하도록 만들어줍니다.
6. 로드밸런싱 및 세션 관리 테스트
- 여러 Tomcat 서버에서 동일한 애플리케이션을 실행하고, Apache HTTP Server가 이를 로드밸런싱하는지 확인합니다.
- 하나의 Tomcat 서버를 다운시키고, Apache가 다른 서버로 요청을 잘 분배하는지 확인합니다.
- 세션이 여러 Tomcat 인스턴스 간에 제대로 공유되고 있는지 확인하려면, 로그인 후 다른 Tomcat 서버로 요청을 보내 세션이 유지되는지 테스트합니다.
같은 서버에서 포트만 다르게 톰캣 2개 실행
# 1. 기존 톰캣 디렉토리 복사
cp -r /opt/tomcat /opt/tomcat-instance1
cp -r /opt/tomcat /opt/tomcat-instance2
# 2. 각 instance의 server.xml 수정
vim /opt/tomcat-instance1/conf/server.xml
# → 8080 → 8081, 8005 → 8006, 8009 → 8010 등 포트 변경
vim /opt/tomcat-instance2/conf/server.xml
# → 8080 → 8082, 8005 → 8007, 8009 → 8011 등 포트 변경
# 3. 각각 실행
/opt/tomcat-instance1/bin/startup.sh
/opt/tomcat-instance2/bin/startup.sh
#4 연결
apache - mod_proxy_balancer 설정 (클러스터처럼 아파치가 묶어서 처리)
<Proxy "balancer://mycluster"> BalancerMember http://localhost:8081 BalancerMember http://localhost:8082 ProxySet lbmethod=byrequests </Proxy> <VirtualHost *:80> ProxyPreserveHost On ProxyPass / balancer://mycluster/ ProxyPassReverse / balancer://mycluster/ </VirtualHost> |
[ 클라이언트 ] │ ▼ [ 웹서버 (Apache/Nginx) ] │ ┌────┴────┐ ▼ ▼ 톰캣1 톰캣2 (8081) (8082) |
============================================================================================
이중화 요약
1. /etc/httpd/conf.d/ tomcat.conf
[root@ip-172-31-47-29 conf.d]# cat tomcat.conf <VirtualHost *:80> ServerName yourdomain.com # Load balancing configuration <Proxy "balancer://mycluster"> BalancerMember http://127.0.0.1:8021 BalancerMember http://127.0.0.1:8022 # 추가 Tomcat 서버를 추가할 수 있습니다. ProxySet lbmethod=byrequests </Proxy> # 모든 요청을 로드밸런서로 전달 ProxyPass / balancer://mycluster/ ProxyPassReverse / balancer://mycluster/ # 로드밸런서 관리 페이지 <Location /balancer-manager> SetHandler balancer-manager Require all granted </Location> DocumentRoot /var/www/html </VirtualHost> [root@ip-172-31-47-29 conf.d]# pwd /etc/httpd/conf.d |
2. tomcat1 포트 변경 (8021 / shutdown 8005)
tomcat1 포트 변경 (8022 / shutdown 8006)
이중화 결과