티스토리 뷰

728x90
반응형

 포스팅은 WildFly Clustering in Domain Mode에 대한 가이드입니다.


Cluster in Domain Mode는 다음과 같은 순서로 테스트합니다.

1. Domain Mode Server 2개 생성
2. application setting
3. Domain 기동
4. deploy application & Assign
5. Failover Test

먼저 1. Domain Mode Server를 2개 생성합니다.
[domain.xml]
$DOMAIN_HOME/domain/configuration/domain.xml

...

<server-groups>

        <server-group name="main-server-group" profile="full">

            <jvm name="default">

                <heap size="64m" max-size="512m"/>

            </jvm>

            <socket-binding-group ref="full-sockets"/>

        </server-group>

        <server-group name="other-server-group" profile="full-ha">

            <jvm name="default">

                <heap size="64m" max-size="512m"/>

            </jvm>

            <socket-binding-group ref="full-ha-sockets"/>

            <deployments>

                <deployment name="blog" runtime-name="blog.war"/>

            </deployments>

        </server-group>

    </server-groups>

... 

도메인모드를 사용하기 위해서는 기본 셋팅된 full-ha profile과 full-ha-sockets를 사용해야 합니다.

domain.xml의 other-server-group을 사용하면 되겠네요.

[host.xml]

...

<servers>

        <server name="server-one" group="main-server-group">

            <!--

              ~  Remote JPDA debugging for a specific server

              ~             <jvm name="default">

              ~               <jvm-options>

              ~                 <option value="-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"/>

              ~               </jvm-options>

              ~            </jvm>

              ~            

              -->

        </server>

        <server name="server-two" group="main-server-group" auto-start="true">

            <!--

              ~  server-two avoids port conflicts by incrementing the ports in

              ~                  the default socket-group declared in the server-group 

              -->

            <socket-bindings port-offset="150"/>

        </server>

        <server name="server-three" group="other-server-group" auto-start="false">

            <!--

              ~  server-three avoids port conflicts by incrementing the ports in

              ~                  the default socket-group declared in the server-group 

              -->

            <socket-bindings port-offset="250"/>

        </server>

  <server name="server-four" group="other-server-group" auto-start="false">

            <!--

              ~  server-three avoids port conflicts by incrementing the ports in

              ~                  the default socket-group declared in the server-group 

              -->

            <socket-bindings port-offset="350"/>

        </server>

    </servers>

... 

 

테스트과정은 standalone mode와 동일합니다.

other-server-group에 server-three가 기본 추가 되어 있고 server-four를 추가합니다.
port 충돌을 막기위해 port-offset은 350으로 변경합니다.

2. application setting을 수행합니다.

application은 아래와 같이 준비하였습니다.

$APP_HOME

    > session.jsp

    > WEB-INF

        > jboss-web.xml

        > web.xml


각 파일을 살펴 보면
[session.jsp]

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.util.*" %>

<%@ page import="java.net.InetAddress" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>SessionTest</title>

</head>

<body>

<%

     String color = "";

     Integer count = (Integer)session.getAttribute("count");

     if(session.getAttribute("count")==null){

         count = new Integer(1);

     }else{

          count = new Integer(count.intValue()+1);

     }

%>

<%

session.setAttribute("count",count);

InetAddress iadr = InetAddress.getLocalHost();

out.println("Connect count : "+count+"<BR>");

out.println("<P>");

out.println("<H3>Session Information :</H3>");

out.println("<b>HostName</b> : "+System.getenv("HOSTNAME")+"<BR>");

out.println("<b>Session ID</b> : "+session.getId() + "<BR>");

out.println("<b>Session Is New</b> : "+session.isNew() + "<BR>");

out.println("<b>Session CreationTime</b> : "+new Date(session.getCreationTime()) + "<BR>");

out.println("<b>Session LastAccessedTime</b> : "+new Date(session.getLastAccessedTime()) + "<BR>");

out.println("<b>Session MaxInactiveInterval(s)</b> : "+session.getMaxInactiveInterval() + "<BR>");

%>

</body>

</html>

session이 변경되는지 여부를 확인할 session.jsp 파일입니다. isNew 정보와 Session Timeout을 확인할 수 있는 MaxInactiveInterval이 셋팅되어 있습니다.


[jboss-web.xml]

<jboss-web>

        <context-root>/</context-root>

        <replication-config>

                <replication-trigger>SET</replication-trigger>

                <replication-granularity>SESSION</replication-granularity>

        </replication-config>

</jboss-web>

위와 같이 Context-root 셋팅과 session 공유 범위를 선택하는 replocation-config를 설정하였습니다.
trigger SET의 경우 SET이 발생하였을때 SESSION 정보를 Backup Server로 Copy하겠다는 의미 입니다.
granularity 범위는 Session에 한정됩니다.

[web.xml]

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <session-config>

        <session-timeout>30</session-timeout>

        <!--tracking-mode>URL</tracking-mode-->

    </session-config>

  <distributable/>

</web-app>

web.xml에는 session time과 함께 distributable 설정이 되어있습니다.
위 설정 파일들의 빨간색으로 표시된 부분이 반드시 설정되어야 Cluster로 묶일 수 있으니 참고하세요.


3. Domain 기동
domain.bat(Windows) or domain.sh(UNIX / LINUX)를 실행합니다.
실행 시 확인 할 로그는 

[Server:server-one] 13:43:50,843 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 10.1.0.Final (WildFly Core 2.2.0.Final) started in 4644ms - Started 338 of 585 services (393 services are lazy, passive or on-demand)

[Server:server-two] 13:43:55,457 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 10.1.0.Final (WildFly Core 2.2.0.Final) started in 5362ms - Started 338 of 585 services (393 services are lazy, passive or on-demand)

- SERVER-ONE, SERVER-TWO가 정상 기동되었는지 여부입니다.


4. deploy application & Assign

- WEB Console 접속 후 먼저 Runtime을 확인합니다.

Server Groups에 main-server-group을 Stop하고 앞서 Full-ha profile을 포함한 other-server-group을 기동합니다.

즉 server-one, server-two를 내리고 server-three, server-four를 기동하는 것으로 생각하면됩니다.

- Application을 Assign 하는 방법은 Web Console Deployments의 Content Repository를 선택하고, Add 버튼을 클릭합니다. 이후 deploy 하는 방법은 동일합니다.

- deploy가 완료된 application을 선택하여 Assign을 클릭합니다. other-server-group을 선택하고 실제 Assign 버튼을 클릭하면 실제 배포가 이루어 집니다.


5. Failover를 테스트합니다.

마지막 Failover Test 입니다.
Failover Test는 다음과 같이 진행합니다.
Failover Test는 node1, node2 server가 기동된 상태에서 session.jsp 호출이 준비된 상태로 시작합니다.
a. node1 server session.jsp 호출
http://localhost:8180/session.jsp
[result]

Connect count : 1

Session Information :

HostName : null
Session ID PJDwP-ERatNEBeqXOTNZiQqvJAx45hAQ1kvMpExm
Session Is New : true
Session CreationTime Tue Jan 30 13:45:00 KST 2018
Session LastAccessedTime Tue Jan 30 13:45:00 KST 2018
Session MaxInactiveInterval(s) 

b. node1 down 
c. node2 session.jsp 호출 시 정보가 동일한 지 여부 확인
http://localhost:8280/session.jsp
[result]

 

Connect count : 2

Session Information :

HostName : null
Session ID PJDwP-ERatNEBeqXOTNZiQqvJAx45hAQ1kvMpExm
Session Is New : false
Session CreationTime Tue Jan 30 13:45:00 KST 2018
Session LastAccessedTime Tue Jan 30 13:45:01 KST 2018
Session MaxInactiveInterval(s) 

확인해야 할 포인트는 다음과 같습니다.
- Session ID가 변경되었는지 여부 (동일하게 출력되었음)
- Session Is New가 c과정 수행시 true로 출려되지는 않은지 여부 (IsNew 메소드는 session 객체에 담긴 메소드로 세션이 신규로 발급되었는지 여부를 출력합니다. c과정에서 false로 출력되었음)

위 두가지가 유지된다면 Session은 정상적으로 Failover되었다고 볼수 있겠습니다.


WAS 제품을 사용하는 이유 중 안정성 측면에서 Clustering 기능은 매우 중요한 부분임을 알수 있습니다. Standalone Mode의 경우 Clustering 환경에서 유용하게 사용할 수 있는 설정으로 능숙하게 반영할 수 있도록 해야 하겠습니다.

고맙습니다.

728x90
반응형