본문 바로가기

WAS/JBoss_WildFly

[JBoss/WildFly] session clustering 설정 (JGroups 사용)

#. 참고 글

(클러스터링 설정 방법)

https://chanchan-father.tistory.com/769

https://chanchan-father.tistory.com/980

https://jboss.openmaru.io/docs/16.JBossEAP6_Clustering.html

 

(각 소캣 별 역할)

http://www.opennaru.com/jboss/jboss-eap-socket-binding/

 

(full-ha 프로파일 사용 시 활성화되는 activeMQ 모듈의 password 변경 가이드)

https://stackoverflow.com/questions/39327229/amq119099-unable-to-authenticate-cluster-user-activemq-cluster-admin-user

 

(jgroups 관련 참고 문서)

http://www.jgroups.org/overview.html

https://jboss.openmaru.io/docs/16.JBossEAP6_Clustering.html

https://stackoverflow.com/questions/4338475/why-use-unicast-versus-multicast-in-weblogic-clusters

 

(Unicast / Multicast 방식 간 차이)

https://dev-coco.tistory.com/144

https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BA%90%EC%8A%A4%ED%8A%B8

 

(WebLogic 클러스터링과의 비교 위한 자료)

https://docs.oracle.com/middleware/1212/wls/CLUST/features.htm#CLUST695

https://blueyikim.tistory.com/1146

 


 

#. 테스트 환경

JBoss EAP 7.4

WildFly 26.1.2

 

#. JBoss config 파일 샘플 (standalone-ha.xml)

standalone-ha.xml
0.03MB

 


 

#. JGroups

JBoss와 WildFly 에서는 JGroups 라는 오픈소스 라이브러리를 사용하여 clustering을 구현한다.

JGroups 사용을 위해서는 ha 프로파일 혹은 full-ha 프로파일을 사용해야 한다.

full-ha 프로파일 사용 시 ActiveMQ 라는 불필요한 기능이 자동 활성화 되므로 사용 비권장. (상세 내용은 본문 하단 참고)

ha 프로파일을 사용하도록 한다.

 

JGroups 는 UDP 및 TCP 프로토콜을 지원한다.

기본값으로 UDP 프로토콜을 사용하도록 설정되어 있다.

 

안정적인 session failover를 위해서는 높은 신뢰성을 보장하는 TCP 프로토콜 방식을 사용하는 것이 좋다.

UDP 프로토콜 방식은 multicast address를 사용하는데,

고객사 별 보안 정책에 따라 multicast address 대역의 방화벽 open 자체가 불가할 수도 있다.

 

각 프로토콜 별 특징은 다음과 같다.

 

UDP 프로토콜

빠른 속도, 낮은 부하
 - TCP 방식에 비해 데이터 송수신 속도가 빠르며 네트워크 부하가 적다

 -------------------------------------------

낮은 신뢰성
 - 데이터 송수신이 많은 상황에서 데이터 유실 문제가 발생할 수 있다
 - 데이터 수신 여부를 확인하는 과정을 생략하여 신뢰성을 포기하고 속도를 챙긴 것
 
 -------------------------------------------
 
 고객사 방화벽 정책 상 사용 불가할 수 있음
 multicast address 방화벽을 open 해야 하는데, 고객사의 방화벽 정책 상 불가한 경우가 있다

 

TCP 프로토콜

 UDP보다 느린 속도
 - UDP 방식에 비해 데이터 송수신 속도가 느리며 네트워크 부하가 상대적으로 높다

-------------------------------------------

높은 신뢰성
 - 3-way handshaking 과정을 통해 연결을 설정하고
 - 4-way handshaking 과정을 통해 연결을 해제한다
 - 이러한 데이터 흐름 제어 과정으로 인해 UDP 방식에 비해 속도가 느리지만 높은 신뢰성을 보장

 


 

#. UDP 프로토콜 방식 사용

같은 멀티캐스트 address를 사용하는 서버 인스턴스들이 하나의 cluster group 으로 묶이는 구조이다.

각 업무 별로 다른 멀티캐스트 address를 지정해야 한다.

출처 : https://chanchan-father.tistory.com/769

 

jgroups-udp,  jgroups-udp-fd 소캣에서 사용하는 포트를 모두 open해야 한다.

Interface 초기값이 모두 private 으로 되어있다. public 으로 수정해준다.

서버 장비마다 모두 양방향으로 open 해야한다.

 

1. jgroups-udp 소캣

port-offset이 적용된다. 포트가 겹치지 않도록 socket binding group 마다 기준점 변경해준다.

 

2. jgroups-udp 소캣의 Multicast Port (UDP)

port-offset이 적용되지 않으므로 socket binding group 마다 다르게 수정해준다.

 

3. jgroups-udp-fd 소캣

port-offset이 적용된다. 포트가 겹치지 않도록 socket binding group 마다 기준점 변경해준다.

 


 

Default 포트 설정 기준으로

방화벽 open이 필요한 포트는 아래와 같다.

<ha 프로파일 사용할 경우>

총 3개 포트가 open 되어야 한다

UDP 포트
 - jgroups-udp 포트 : 55200 (##port-offset 적용 대상##)
 - jgroups-udp 멀티캐스트 포트 : 45688 (port-offset 적용 안됨)

TCP 포트
 - jgroups-udp-fd 소캣의 포트 : 54200 (##port-offset 적용 대상##)

===============================================
 
<full-ha 프로파일 사용할 경우>

위 3개에 추가로 하나를 더 오픈해야 한다
 - HTTP 서비스 포트 (각 서버 인스턴스의 HTTP 포트)

 


 

#. TCP 프로토콜 방식 사용

jgroups-tcp,  jgroups-tcp-fd 로 총 2개의 port를 사용한다.

 

default 상태에서는 UDP 프로토콜을 사용하도록 되어있다.

Subsystems -> JGroups -> Channel -> ee 메뉴로 이동하여

Stack 옵션을 tcp 로 변경한다.

 

TCPPING 프로토콜을 사용하도록 해야 multicast address 사용을 완전히 걷어낼 수 있다.

해당 설정은 standalone-ha.xml / domain.xml 파일에서 직접 수정하는 것이 편리하다.

            <subsystem xmlns="urn:jboss:domain:jgroups:8.0">
                <channels default="ee">
                    <channel name="ee" stack="tcp" cluster="ejb"/>
                </channels>
                    .....
                    <stack name="tcp" statistics-enabled="true">
                        <transport type="TCP" socket-binding="jgroups-tcp"/>
                        <protocol type="TCPPING">
                            <property name="initial_hosts">192.168.56.101[7600],192.168.56.102[7600]</property>
                            <property name="port_range">0</property>
                        </protocol>
                        <protocol type="MERGE3"/>
                        <socket-protocol type="FD_SOCK" socket-binding="jgroups-tcp-fd"/>
                        <protocol type="FD_ALL"/>
                        <protocol type="VERIFY_SUSPECT"/>
                        <protocol type="pbcast.NAKACK2"/>
                        <protocol type="UNICAST3"/>
                        <protocol type="pbcast.STABLE"/>
                        <protocol type="pbcast.GMS"/>
                        <protocol type="MFC"/>
                        <protocol type="FRAG3"/>
                    </stack>
                </stacks>
            </subsystem>

 

Domain mode 사용 시에는 host-slave.xml 파일도 수정해야 한다.

host-slave.xml

        <interface name="private">
            <inet-address value="${jboss.bind.address.private:192.168.56.101}"/>
        </interface>

        <interface name="private">
            <inet-address value="${jboss.bind.address.private:192.168.56.102}"/>
        </interface>

 

jgroups-tcp 와 jgroups-tcp-fd 소캣의 인터페이스는 public 으로 변경한다.

private 설정 시 ->  127.0.0.1:7600 

public 설정 시 -> 실제 ip address:7600

 


 

#. clustering 활성화 확인

어플리케이션 deploy가 되어야만 JGroups 포트가 활성화 된다.

{어플리케이션 디렉토리}/WEB-INF/web.xml 파일에 <distributable/> 태그를 작성해야

session clustering 기능과 JGroups 포트가 활성화 된다.

 

아래와 같이 JGroups 포트가 활성화 되었다면 정상.

 

cluster group에 새로운 인스턴스 추가 시에는 아래 로그가 기록되며

Received new cluster view for channel ejb

 

인스턴스가 프로세스 종료되어 cluster group 상에서 제거될 시에는 아래 로그가 기록된다

Node **** left the cluster

 


 

#. 세션 복제 방식 변경

<replication-trigger>를 사용하여 세션이 언제 복제될 것인지를 설정

<replication-granularity>를 사용하여 세션 복제 범위를 지정

 


 

#. full-ha 프로파일 ActiveMQ 관련

standalone-full-ha.xml 설정파일을 사용할 경우 ActiveMQ subsystem이 추가된다.

ActiveMQ 모듈에서 각 인스턴스의 HTTP 서비스 포트를 통해  서버 인스턴스 간에 메시지를 주고받는다. 

 

방화벽이 open 되어있지 않을 경우,

아래와 같은 ActiveMQ 관련 AMQ224091 에러가 발생한다. (Connection 실패로 인한 retry 메시지)

 

jgroups로 이미 session clustering 구현이 가능하므로,

ActiveMQ는 session clustering에 있어 반드시 필요한 기능이 아니다.

추가적으로 방화벽 open이 필요하다는 번거로움도 있다.

반드시 해당 기능이 필요한 경우에만 사용하도록 한다.

 


 

(ActiveMQ 사용하는 경우 - default 패스워드 변경)

 

standalone.xml / /domain.xml 파일에서 CHANGE ME 키워드로 검색한다.

 

CHANGE ME!! 부분을 삭제 후

management user 의 password를 입력한다.

해당 패스워드는 자유롭게 입력 가능한 것으로 보이지만

통일성을 위해 management user 의 password와 동일한 값으로 수정한다.

 


 

#. 참고사항 - weblogic 클러스터와 비교

TCP 프로토콜을 사용하도록 설정하면

weblogic의 unicast 클러스터와 동일하게 master/slave (one-to-one) 방식으로 동작.

(메시지가 그룹 리더에 전달되면, 그룹 리더가 나머지 멤버에 메시지 전달)



UDP 프로토콜을 사용하도록 설정하면

weblogic의 multicast 클러스터와 동일하게 many-to-many 방식으로 동작.

(네트워크 내 각 인스턴스에 직접 메시지 송수신)