본문 바로가기

카테고리 없음

WAS 이중화 ( apache - tomcat1, tomcat2 )

★ 결론 : 제일 아래 이중화 요약부분만 진행하면 실행 됨 ★

 

[동작 방식]

  1. 웹 서버 (Apache HTTP Server):
    • Apache HTTP Server는 클라이언트(사용자)로부터 HTTP 요청을 받습니다.
    • 요청이 들어오면 Apache는 로드밸런싱 기능을 통해 두 대의 Tomcat 서버 중 하나로 요청을 전달합니다.
    • 이때, Apache는 세션 유지를 위해 스티키 세션(Sticky Session)을 사용할 수도 있습니다.
  2. Tomcat 서버 (WAS):
    • Tomcat 1Tomcat 2클러스터링을 통해 세션 정보를 공유하며, 두 서버는 동일한 세션을 가지고 처리할 수 있습니다.
    • 예를 들어, 사용자가 Tomcat 1에 접속해 세션을 생성하고, 이후 Tomcat 2로 트래픽이 전달되더라도 같은 세션 정보를 유지할 수 있게 됩니다. 이를 위해 세션 복제 또는 외부 세션 저장소(Redis, Memcached 등)를 사용할 수 있습니다.
  3. 로드밸런싱:
    • 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 커넥터가 설정되어 있는지 확인합니다.

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

위와 같이 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)

 

이중화 결과