본문 바로가기

WAS/JBoss_WildFly

[JBoss_WildFly] Domain mode를 사용하지 말아야 하는 이유

Domain 모드 사용에 따른 운영 상의 단점이 너무 많다.

서버 인스턴스 갯수가 많다 하더라도 Standalone 모드 사용하는 것이 모든 면에서 좋아보인다.

Standalone 모드 사용하는 것이 장애 point도 적기 때문에 결과적으로 작업량이 오히려 줄어든다.

 

고객이 Domain 모드를 사용하고 싶어 하더라도 최대한 Standalone 모드를 사용하도록 유도해야 한다.

그렇게 해야 추후에 서로 편하다고 최대한 설득해야 한다.

 

Domain 모드 사용 시

아래와 같은 문제점 및 장애 상황이 발생한다.

 


 

01. config 변경 후 서버 인스턴스 기동/정지 hang 현상 발생

management console 에서 config 변경 시,

연결된 모든 host의 domain.xml에 변경사항이 동기화되어야 하는데, 동기화가 안 된다.

master host 기동 중인 장비의 domain.xml 에만 변경사항이 적용된다.

 

이로 인해 2중화 이상의 환경에서 Domain 모드 사용 시,

장비 대수 만큼 config 변경 작업을 해야 하는 문제가 발생한다.

 

이런 식으로 사용하면 standalone 모드 사용하는 것과 다를 바가 없음.

장애 point만 불필요하게 늘어나서 불편하다. 이럴 바에는 standalone 모드 사용하는게 편리하다.

 

#. 문제 상황

1. 이중화 장비 구성으로 Domain Mode 사용하는 환경

2. Management Console 에서 config 수정한 상황

3. 서비스에는 이상이 없지만, 1~2시간 가량 시간이 지나면 서버 인스턴스 정지가 불가해지는 현상 발생

4. Listen Port는 사라져있지만, process 자체는 죽지 않고 살아있는 상황

5. kill -9 명령어로 강제 정지시켜야 한다

 

#. 문제 원인

1. management console 에서 config 변경 시 
   master host 가 기동 중인 1호기 서버의 domain.xml 에만 변경사항이 반영된다.

2. slave host만 기동 중인 2호기 서버의 domain.xml 에는 변경사항이 반영되지 않는다.

3. 1호기 서버와 2호기 서버의 domain.xml 내용이 서로 일치하지 않게 된다.

4. 서버 인스턴스 기동과  업무 서비스에는 이상이 없으며, 
   서버 인스턴스 기동 직후에는 stop 명령어도 정상적으로 동작한다.

5. 서버 인스턴스 기동 후 1시간 가량 지나면 stop 명령어가 동작하지 않는다.
   (master host와 slave host 간의 config 차이로 인해 통신 에러가 발생하는 것으로 추측된다.)

 

#. 조치 방법

두 가지 방법 중 하나를 선택한다.

workaround 01
 - management console 에서 config 수정 후
 - 1호기 장비의 domain.xml 파일을 2호기 장비에 FTP 등으로 업로드

workaround 02
 - 1호기 장비, 2호기 장비에서 각각 domain.xml 파일을 직접 수정하기
 
 위의 조치사항 적용 후 master host, slave host 모두 restart 해주어야 한다.
  - management console 에서 restart 하거나
  - shell script로 직접 restart 하거나

 

(management console 에서 host controller restart 하는 화면)

 


 

cli command로 config 변경할 시에도 마찬가지이다.

master host 기동 중인 서버의 domain.xml 에만 변경사항이 적용된다.

 

slave host에 cli command 를 실행하면 에러가 발생한다.

domain controller (master host) 에 명령어 실행하라는 에러 로그가 발생한다.

can only be handled by the master Domain Controller; this host is not the master Domain Controller

 

 


 

02. jvm options 설정

Standalone 모드의 경우, 각 프로세스 기동 script에 JAVA_OPTS 환경변수를 사용하면 된다.

환경변수를 활용할 수 있어 관리하기에도 용이하다.

 

Domain 모드의 경우, host-slave.xml 파일 내에 jvm 옵션을 작성하는 방식이다.

옵션 작성 시 환경변수를 사용하지 못하는 단점이 있다.

        <server name="server-one" group="main-server-group" auto-start="false">
            <jvm name="server-one">
                <heap size="1024m" max-size="1024m"/>
                <jvm-options>
                    <option value="-verbose:gc"/>
                    <option value="-XX:+PrintGCTimeStamps"/>
                    <option value="-XX:+PrintGCDetails"/>
                    <option value="-XX:+PrintHeapAtGC"/>
                    <option value="-Xloggc:/applogs/jboss/jboss_74/domain/server-one/gclog/gclog.txt"/>
                    <option value="-XX:+HeapDumpOnOutOfMemoryError"/>
                    <option value="-XX:HeapDumpPath=/applogs/jboss/jboss_74/domain/server-one/dump_files/heapdump.hprof"/>
                </jvm-options>
            </jvm>
        </server>

 


 

#. gc log 관리

standalone 모드에서는 mv 명령어를 활용하여

서버 재기동 시에 gclog를 백업할 수 있다.

 

domain 모드에서는

gclog 옵션이 shell script가 아닌 config 파일에 설정되어 있기 때문에 mv 명령어 활용이 불가하다.

이렇게 되면 gclog가 하나의 파일에 무한정 기록되는 문제가 발생한다.

 

서버 인스턴스 기동 스크립트에 mv 명령어를 포함하여 gclog 백업이 가능하기는 하다.

하지만 management console 에서 서버 인스턴스 기동 시에는 mv 명령어 사용이 안되므로 gclog 백업이 안된다.

 

"평소에는 management console로 서버 기동/정지 하다가

gclog 백업이 필요하다 싶을 때는 shell script로 서버 기동해주세요"

라고 고객 측에 가이드 해야 한다.

 

이런 식으로 운영하는 것은 비효율적이라 생각한다.

고객 측에서 해당 방법을 사용하지 않겠다 하면

java 옵션을 활용해서 rotaion을 시키는 방법으로 가이드 해야한다.

 


 

03. Jennifer 연동

standalone 모드 사용 시에는

서버 기동 shell script에 아래와 같이 3개 옵션 모두 추가하면 된다.

 

domain 모드 사용 시에는

Djennifer옵션과 javaagent 옵션은 host-slave.xml 파일에 추가해야 하며,

Djboss.modules.system.pkgs 옵션은 host controller 기동 시 JAVA_OPTS 환경변수로 추가해아 한다.

Djboss.modules.system.pkgs 옵션을 host-slave.xml 파일에 추가하면 에러 발생한다.

 

standalone 모드 사용 시에는 하나의 파일에서 모든 옵션 관리가 가능한데,

domain 모드 사용 시에는 두 개의 파일에 옵션이 나뉘어 추가되어서 불편하다.

history 관리도 잘 되어야 할텐데, 현실적으로 쉽지 않은 부분이다.