티스토리 뷰

728x170

 포스팅은 WildFly Clustering in Standalone Mode에 대해 알아보겠습니다.


Clustering in Standalone Mode는 아래와 같은 순서로 이루어 집니다.

1. Standalone Mode Server 2개 생성
2. application setting
3. Standalone Mode Server 기동 시 ha config file 반영
4. server 각각 기동
5. deploy application
6. Failover Test

그럼 시작합니다.
1. standalone Mode Server 2개를 생성합니다.
생성 방법은 매우 간단합니다.
설치 시 생성되는 standalone directory를 각각 node1, node2로 복사하면 준비 완료입니다.

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. Standalone Mode Server 기동 시 ha config file을 반영합니다.
기동 스크립트는 다음과 같이 작성하였습니다.

node1 기동 : standalone.bat -Djboss.server.base.dir=node1 --server-config=standalone-ha.xml -Djboss.socket.binding.port-offset=100 -Djboss,node.name=node1


node2 기동 : standalone.bat -Djboss.server.base.dir=node2 --server-config=standalone-ha.xml -Djboss.socket.binding.port-offset=200 -Djboss,node.name=node2

s

tandalone 모드로 기동 시 1번 step에서 생성한 node1 디렉토리를 base.dir로 선택하고 standalone-ha.xml 파일을 기동 시 참고하며, port 충돌을 피하기 위해 port-offset을 100으로 주었습니다.

마찬가지로 node2 디렉토리를 base.dir로 선택하고 standalone-ha.xml 파일을 기동 시 참고하며, port 충돌을 피하기 위해 port-offset을 200으로 주었습니다.


4. server를 각각 기동합니다.
기동 시 참고 로그로는 

HTTP listener default listening on 127.0.0.1:8180
11:56:40,526 INFO  [org.jboss.modcluster] (ServerService Thread Pool -- 64) MODCLUSTER000001: Initializing mod_cluster version 1.3.3.Final
11:56:40,541 INFO  [org.jboss.modcluster] (ServerService Thread Pool -- 64) MODCLUSTER000032: Listening to proxy advertisements on /224.0.1.105:23364
11:56:40,652 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-5) WFLYJCA0001: Bound data source [java:jboss/datasources/ExampleDS]
11:56:40,766 WARN  [org.jboss.as.domain.management.security] (MSC service thread 1-1) WFLYDM0111: Keystore C:\S-CORE\wildfly-10.1.0.Final\wildfly-10.1.0.Final\node1\configuration\application.keystore not found, it will be auto generated on first use with a self signed certificate for host localhost
11:56:40,784 INFO  [org.jboss.as.server.deployment.scanner] (MSC service thread 1-3) WFLYDS0013: Started FileSystemDeploymentService for directory C:\S-CORE\wildfly-10.1.0.Final\wildfly-10.1.0.Final\node1\deployments
11:56:41,122 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-3) WFLYUT0006: Undertow HTTPS listener https listening on 127.0.0.1:8543
11:56:41,455 INFO  [org.jboss.ws.common.management] (MSC service thread 1-1) JBWS022052: Starting JBossWS 5.1.5.Final (Apache CXF 3.1.6)
11:56:41,687 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:10090/management

port offset이 정상적으로 먹었는지 알아보면 되겠네요.
기본 web console port의 경우 9990이라 + 100 한 10090이 되었고, http listener port 8080 + 100인 8180이 정상적으로 먹은것을 로그상으로 확인할 수 있습니다.

5. deploy application를 수행합니다.

6. 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 : DjfZaFRh5PHHaF2hzYuRaToUs4m-A7koIuwO9YNU
Session Is New : true
Session CreationTime : Tue Jan 30 12:50:57 KST 2018
Session LastAccessedTime : Tue Jan 30 12:50:57 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 : DjfZaFRh5PHHaF2hzYuRaToUs4m-A7koIuwO9YNU
Session Is New : false
Session CreationTime : Tue Jan 30 12:50:57 KST 2018
Session LastAccessedTime : Tue Jan 30 13:11:38 KST 2018
Session MaxInactiveInterval(s) 

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

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


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

고맙습니다.

그리드형
댓글
  • 프로필사진 김선희 안녕하세요.
    wildfly wlecome page를 포스팅 상단의 APP_HOME 의 프로젝트 페이지로 바꾸려면
    APP_NOME은 어느 경로에 있어야 하는건가요..?
    2019.04.18 23:22
댓글쓰기 폼