시스템에 WAS를 구동하다 보면은 다수의 인스턴스를 올리는 경우가 있다.

다수의 인스턴스를 올리는 이유는 여러가지가 있을 테지만 하나의 큰 메모리를 사용하는 JVM을 사용하는 WAS를 구동 시키는 것보다 1G내외로 2~3개의 JVM을 올리는 것이 효과적이라는 말이 있는데 그거는 사실 잘 모르겠다.

위의 경우 말고 다른 경우는 아마도 다수의 WAS를 구동해야 되나 하드웨어 지원이 넉넉치 않을때 Multi Instance로 구동 하는 경우가 있다.

JBOSS 에서 Multi Instance로 구동 하는 방법에는 크게 두가지가 있다.

한가지는 Binding IP를 이용해서 구동하는 방법, 다른 하나는 Port Binding을 이용해서 구동하는 방법이 있다.

  1. Binding IP를 이용해서 구동 하는 방법
    Binding IP를 이용하는 방법은 이외로 간단하다

    먼저 NIC에 alias를 이용해 Binding 할 IP를 설정을 한다.

    그런 다음 올릴 서버 프로파일을 설정한 뒤 run 스크립트에서 다음과 같이 입력하고 구동하면은 Binding IP를 이용한 방법은 손쉽게 끝나게 된다.

    run.sh -c {구동할 서버 프로파일} -b {Binding IP}
    이와 같이 하고 구동하면은 Binding IP를 이용한 멀티 인스턴스 사용이 가능하다.

  2. Binding Manager를 이용한 방법
    Binding Manager를 이용한 방법은 ${JBOSS_HOME}/jboss-as/server/${Server_Profile}/conf 에 보면은 jboss-service.xml 이라는 파일을 수정함으로써 Multi Instance로 구동 할 수 있다.

    jboss-service.xml에 보면은 아래와 같은 내용이 있다.
       <!-- ==================================================================== -->
       <!-- Service Binding                                                      -->
       <!-- ==================================================================== -->

       <!-- Automatically activated when generatting the clustering environment -->
       <!-- @TESTSUITE_CLUSTER_CONFIG@ -->

       <!--
          | Binding service manager for port/host mapping. This is a sample
          | config that demonstrates a JBoss instances with a server name 'ports-01'
          | loading its bindings from an XML file using the ServicesStoreFactory
          | implementation returned by the XMLServicesStoreFactory.
          |
          | ServerName: The unique name assigned to a JBoss server instance for
          | lookup purposes. This allows a single ServicesStore to handle mulitiple
          | JBoss servers.
          |
          | StoreURL: The URL string passed to org.jboss.services.binding.ServicesStore
          | during initialization that specifies how to connect to the bindings store.
          | StoreFactory: The org.jboss.services.binding.ServicesStoreFactory interface
          | implementation to create to obtain the ServicesStore instance.

       <mbean code="org.jboss.services.binding.ServiceBindingManager"
         name="jboss.system:service=ServiceBindingManager">
         <attribute name="ServerName">ports-01</attribute>
         <attribute name="StoreURL">${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml</attribute>
         <attribute name="StoreFactoryClassName">
           org.jboss.services.binding.XMLServicesStoreFactory
         </attribute>
       </mbean>
       -->

  3. 위와 같이 코멘트 처리가 되어 있는데 이 코멘트를 삭제 하고 사용하면은 된다.
    기본적인 port 관련은 정보 설정은 위에 보이는 파일에 보면은 3개 정도 정의가 되어 있다.
    3개를 초과해서 만드는 경우라면은 구성을 사용자가 잡아줘야 되는데 한 서버에 인스턴스 3개 이상 올리는 거는 그닥 좋다고 생각하지는 않는다.
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Rey
대부분의 시스템들이 그렇지만 시스템의 고가용성, 고성능을 내기 위해 Clustering 을 구성하는 경우가 대부분이다.
Cluster의 종류는 크게 HA(고가용성), HPC(고성능) 클러스터로 나뉘게 되는데 대부분의 클러스터는 고가용성 클러스터 들이다.(예 RedHat Cluster Suite)

WAS에서도 마찬가지 인데 WAS의 경우 HA 관점보다는 HPC 관점이 더 크지 않나 싶다.

WAS 클러스터의 경우 HA 클러스터 처럼 StandBy Server가 Active Server를 감시하고 있다가 Active Server가 장애가 발생하면은 StandBy Server가 Active 역활을 하는 클러스터가 아닌 Active, Active Cluster 이기 때문이다.

JBOSS 가 지원 하는 Clustering 항목은 아래와 같다.

  • 상태복제(State Replication)
    • HTTP Session / Stateful Session Bean / EJB3 Entity Bean 정보를 Cluster 타 Node로 복제
  • 부하분산(Load-balancing)
    • 웹의 경우 L4, Web Server Plug-in에서 부하를 분산
    • EJB의 경우 Client에게 다운로드 되는 EJB Stub이 부하를 분산
  • 자동장애복구(Failover)
    • 웹의 경우 L4, Web Server Plug-in에서 장애가 발생한 서버를 감지해 요청을 다른 정상적인 서버로 전달
    • EJB의 경우 Client에게 다운로드 되는 EJB Stub이 장애가 발생한 서버를 감지해 요청을 다른 정상적인 서버로 전단
JBOSS의 Clustering을 사용하기 위해서는 run.sh -c all -b Binding_IP 로 실행을 하면은 기본적으로 Clustering을 사용할 수 있다.

JBOSS Clustering을 구성하기 위해서는 다음의 항목을 참고 하면은 된다.

  • 클러스터 구성
    • 동일한 파티션명(Partition Name)과 파티션 구성(Partition Config)을 가진 Node들이 동적으로 하나의 Cluster를 구성
    • UDP Multicast 통신 또는 TCP로 통신
  • 관련 설정 파일
    • deploy/cluster-service.xml
    • deploy/jboss-web-cluster.sar/META-INF/jboss-service.xml
    • ejb3-clustered-sfsbcache-service.xml
    • ejb3-entity-cache-service.xml
  • 파티션명 설정
    • -g xxxx
    • -Djboss.partition.name=xxxx
  • UDP/IP Multicast
    • 멀티케스트 IP 설정
      • 멀티케스트 IP 대역에서 선택 : 224.0.0.1 ~ 239.255.255.254
      • -u x.x.x.x
      • -Djboss.partition.udpGroup=x.x.x.x
    • JBOSS 4.2에서는 Multicast Port도 설정 가능
      • -Djboss.hapartition.mcast_port=45566
      • -Djboss.webpartition.mcast_port=45577
      • -Djboss.ejb3sfsbpartition.mcast_port=45551
      • -Djboss.ejb3entitiypartition.mcast_port=43333
    • 멀티케스트 테스트
      • Node가 Cluster 정보 전달 및 구성이 안될 경우 각 Node간에 멀티케스트 테스트가 필요
      • java -classpath jgroups.jar org.jgroups.tests.McastReceiverTest -mcast_addr 228.1.2.3 -port 45566 : Receiver
      • java -classpath jgroups.jar org.jgroups.tests.McastSenderTest -mcast_addr 228.1.2.3 -port 45566 : Sender
      • jgroups.jar는 $JBOSS_HOME/server/all/lib 아래에 위치
      • 멀티케스트 테스트에 실패했을 때
        • 해당 NIC의 멀티케스트를 활성화
          • ifconfig eth0 MULTICAST
        • 해당 NIC로 멀티케스트 메시지가 가도록 라우팅
          • NIC가 여러 개일 경우
          • route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0
        • OS에 방화벽이 설치되어 있는지 확인
        • Network Switch가 멀티케스트를 지원하는지 확인
      • 멀티케스트 테스트에 성공했는데 클러스터 동작이 안되는 경우
        • /etc/hosts에서 127.0.0.1에 호스트 설정이 되어 있는 경우
    • TCP
      • 기본적으로 멀티케스트를 사용한 Clustering만 지원
        • 해당 설정 파일에서 UDP를 포함한 Config를 코멘트 처리 후 TCP 코멘트 헤제
      • 기본 설정 항목
        • bind_addr : Cluster Node 간의 통신에 사용할 IP 설정
        • TCPPING initial_hosts : Cluster Node를 구성하는 Node 설정
    • 기본적으로 all Server Profile로 구동하면은 Cluster 기능이 활성화가 됨
      • 기존에 사용하던 Profile에서 Cluster 서비스를 추가하기 위해서는 다음의 라이브러리 및 서비스를 추가
        • 라이브러리
          • all/lib/jboss-cache.jar
          • all/lib/jgroups.jar
          • all/lib/jboss-jca.jar
        • 서비스
          • all/deploy/jbossjca-service.xml
          • all/deploy/jboss-web-cluster.sar
          • all/deploy/jboss-aop.deployer
          • all/deploy/jboss-web.deployer/META-INF/jboss-service.xml
위와 같은 내용을 참고하여 서비스를 구성하면은 된다.

만약에 한대의 서버에 여러 클러스터를 구성하기 위해서는 서비스 바인딩 관리자를 이용하여 멀티 인스턴스를 올리거나 혹은 아이피를 하나더 심어서 서비스 하는 방법이 있다.

만약에 서비스 바인딩 관리자를 이용하여 올리는 경우 run.sh 스크립트를 구동할때 -u 옵션으로 멀티케스트 IP를 지정해야 된다. 또한 -g 옵셥으로 파티션 네임을 설정해주는 것이 좋다.(멀티케스트의 경우 IP를 지정하지 않으면은 클러스터가 정상적으로 동작 안할 수도 있다)
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Rey
TOMCAT이야 JSP 컨테이너로 잘 알고 있는 프로그램이고 JBOSS의 경우 Open Source WAS이다. JBOSS 중에서 JSP 컨테이너 부분은 TOMCAT을 사용하고 있다.

둘다 설정 파일 위치만 다르고 동일하기 때문에 이번 쓰래드는 JBOSS/TOMCAT으로 기술한다.

앞으로도 JBOSS와 TOMCAT에 둘다 적용 가능한 부분은 JBOSS/TOMCAT으로 JBOSS만 적용 되는 부분은 JBOSS로 TOMCAT에만 적용 되는 부분은 앞에 TOMCAT을 붙이겠다.

기본적으로 JBOSS/TOMCAT에서는 WEB Application 디렉터리 바깥으로 심볼릭 링크를 허용하지 않는다.
그러나 만약에 허용 하는 경우에는 Context의 allowLinking 값을 true로 설정하는 경우 외부의 심볼릭 링크를 허용하게 된다.

Default Context는 jboss-web.deployer/context.xml(TOMCAT의 경우 server.xml)에서 설정하게 되며, Web Application 별로 설정하고 싶은 경우에는 WEB-INF/context.xml에서 설정하게 된다.

참고로 심볼릭링크를 사용하는 경우 JBOSS나 TOMCAT을 구동하는 사용자가 해당 디렉터리를 읽을 수 잇는 권한이 설정 되어야 한다.

설정 예시

ROOT.war/WEB-INF/context.xml

<Context cookies="true" crossContext="true" allowLinking="true">

   <!-- Session persistence is disable by default. To enable for all web

   apps set the pathname to a non-empty value:

   <Manager pathname="SESSIONS.ser" />

   To enable session persistence for a single web app, add a

   WEB-INF/context.xml

   -->

   <Manager pathname="" />

   <!-- Install an InstanceListener to handle the establishment of the run-as

   role for servlet init/destroy events.

   -->

   <InstanceListener>org.jboss.web.tomcat.security.RunAsListener</InstanceListener>

   

</Context>



참고로 심볼릭 링크 허용은 보안상의 문제를 일으킬 수 있다. 그러므로 Default Context에 설정하기 보다는 필요한 Web Application에만 설정하도록 한다.

그리고 Windows에서는 이를 허용할 경우, JSP 소스가 노출되는 문제가 있으므로 설정해서는 안된다.

(*) 다큐먼트에 나와있는 주의 사항

NOTE: This flag MUST NOT be set to true on the Windows platform (or any other OS which does not have a case sensitive filesystem), as it will disable case sensitivity checks, allowing JSP source code disclosure, among other security problems.


저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Rey