클라우드(AWS, Azure 등)나 가상화 환경에서 JBoss 클러스터를 구성하다 보면, 보안 정책상 UDP 멀티캐스트가 차단되어 있거나 서버의 IP가 유동적이라 사전에 확정할 수 없는 경우가 많습니다.
이런 환경에서는 일반적인 UDP 기반 클러스터링 방식과 TCP 기반의 IP 고정 방식(TCPPING)을 그대로 적용하기 어렵습니다.
이때 활용할 수 있는 방법이 바로 TCPGOSSIP 입니다. 이번 글에서는 TCPGOSSIP의 개념부터 실제 운영 환경에서의 구축 방법, 그리고 놓치기 쉬운 보안/이중화 이슈까지 정리합니다.
1. TCPGOSSIP이란?
TCPGOSSIP은 JGroups 라이브러리에서 제공하는 멤버십 발견(Discovery) 프로토콜 중 하나입니다.
각 서버(JBoss 인스턴스)가 서로의 IP 주소를 미리 알 수 없거나, 멀티캐스트(Multicast) 통신이 제한된 네트워크 환경에서 중앙 집중형 라우터를 통해 클러스터 멤버를 식별하는 방식입니다.
핵심 구성 요소
구성 요소 | 역할 |
GossipRouter | 클러스터에 참여하려는 모든 인스턴스의 주소 정보를 관리하는 독립적인 프로세스. 일종의 '전화번호부' 역할 |
JBoss (JGroups) | 각 WAS 인스턴스는 시작 시 설정된 GossipRouter에 자신의 정보를 등록하고, 현재 클러스터에 참여 중인 다른 멤버들의 목록을 가져옴 |
주의: GossipRouter는 JBoss 프로세스의 일부가 아니라, 클러스터 멤버가 아닌 완전히 독립된 프로세스입니다.JGroups jar 파일만 있으면 어떤 서버에서도 기동할 수 있으며, 실무에서는 클러스터 노드와는 별개의 경량 서버(또는 컨테이너)에 배치하는 것이 일반적입니다.
2. 작동 원리
1.
라우터 구동: 별도의 서버(또는 컨테이너)에서 GossipRouter를 실행합니다.
2.
등록 및 조회: 각 JBoss 인스턴스가 기동될 때, 설정된 GossipRouter의 IP와 포트로 접속합니다.
3.
정보 공유: GossipRouter는 접속한 인스턴스들의 정보를 취합하여 리스트를 만들고, 요청하는 멤버들에게 배포합니다.
4.
세션 복제: 얻어온 IP 리스트를 바탕으로 JBoss 인스턴스 간에 1:1(Unicast) TCP 통신으로 세션 데이터를 동기화합니다.
GossipRouter는 어디까지나 멤버 정보를 중계하는 역할만 합니다. 실제 세션 데이터는 GossipRouter를 거치지 않고 노드 간 직접 통신으로 전달됩니다.3. 주요 특징 및 장점
•
동적 환경에 적합: 클라우드나 가상화 환경처럼 서버의 IP가 유동적이거나 미리 확정할 수 없는 경우 유용
•
네트워크 제약 극복: 보안 정책상 UDP 멀티캐스트를 사용할 수 없는 환경에서도 TCP 통신만으로 클러스터링 구현 가능
•
유연한 확장: 새로운 노드 추가 시 다른 모든 노드의 설정을 변경할 필요 없이, 중앙 라우터 주소만 알면 즉시 클러스터에 합류 가능
요약 비교
구분 | 일반적인 방식 (UDP/Static) | TCPGOSSIP 방식 |
탐색 주체 | 각 노드가 직접 찾음 | GossipRouter가 중계 |
통신 방식 | Multicast 또는 고정 IP 리스트 | Unicast (TCP) |
권장 환경 | 온프레미스, 폐쇄망 | 클라우드, 동적 IP 환경 |
4. GossipRouter 실행 방법
GossipRouter는 JBoss 배포판에 포함된 JGroups jar 파일만 있으면 실행할 수 있습니다. (JBoss WAS 자체를 기동하는 것이 아니라, jar에 포함된 클래스만 실행하는 것입니다.)
$ java -cp /SW/JBOSS/jboss-eap-8.1.4/modules/system/layers/base/org/jgroups/main/jgroups-5.3.21.Final-redhat-00001.jar org.jgroups.stack.GossipRouter -port 13001 -bind_addr 0.0.0.0 -dump_msgs true
...
GossipRouter started in 78 ms listening on 0.0.0.0:13001
Plain Text
복사
jgroups 라이브러리 경로는 설치되어 있는 JBoss 버전에 맞는 파일명을 지정합니다.주요 옵션 설명
옵션 | 설명 |
-port | GossipRouter가 리스닝할 포트 |
-bind_addr | 바인딩할 네트워크 인터페이스 (0.0.0.0은 전체 인터페이스) |
-dump_msgs | 송수신 메시지를 로그로 상세히 남김 |
운영 스크립트 (nohup)
실제 서비스 적용 시 nohup 명령어를 사용해 터미널이 끊어져도 프로세스가 유지되도록 설정해야 합니다.
#!/bin/bash
cd /SW/JBOSS/jboss-eap-8.1.4/
nohup java -cp /SW/JBOSS/jboss-eap-8.1.4/modules/system/layers/base/org/jgroups/main/jgroups-5.3.21.Final-redhat-00001.jar org.jgroups.stack.GossipRouter -port 13001 -bind_addr 0.0.0.0 -dump_msgs true \
> /SW/JBOSS/jboss-eap-8.1.4/gossip_router.out 2>&1 &
Plain Text
복사
타임스탬프 포함 로그 생성
기본 로그 파일에는 시간 정보가 없습니다. 아래처럼 스크립트를 구성하면 날짜/시간이 포함된 로그를 남길 수 있습니다.
#!/bin/bash
nohup stdbuf -oL java -cp /SW/JBOSS/jboss-eap-8.1.4/modules/system/layers/base/org/jgroups/main/jgroups-5.3.21.Final-redhat-00001.jar \
org.jgroups.stack.GossipRouter -port 13001 -bind_addr 0.0.0.0 -dump_msgs true 2>&1 \
| awk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0; fflush() }' \
>> /SW/JBOSS/jboss-eap-8.1.4/gossip_router.out &
Plain Text
복사
...
[2026-04-28 08:00:05] get(ejb) -> server11 (172.21.133.112:17600), server12 (172.21.133.112:17700)
[2026-04-28 08:00:25] get(ejb) -> server11 (172.21.133.112:17600), server12 (172.21.133.112:17700)
[2026-04-28 08:00:32] get(ejb) -> server11 (172.21.133.112:17600), server12 (172.21.133.112:17700)
...
Plain Text
복사
[참고] 날짜별 로그 로테이션 (logrotate)
/etc/logrotate.d/gossip_router
/SW/JBOSS/jboss-eap-8.1.4/gossip_router.out {
daily # 매일 실행
copytruncate # 파일 포인터를 유지하며 내용을 복사 후 비움 (Java 프로세스 재시작 불필요)
rotate 90 # 90일치 보관
compress # 압축 저장
missingok # 파일이 없어도 에러 미발생
notifempty # 파일이 비어있으면 로테이트 안 함
dateformat _%Y-%m-%d # 파일명 날짜 포맷
dateext # 파일명 뒤에 날짜 붙임
}
Plain Text
복사
5. JBoss 설정 방법
jgroups에 tcpgossip 스택을 추가하고, outbound-socket-binding에 GossipRouter의 IP/PORT 정보를 설정합니다.
...
<subsystem xmlns="urn:jboss:domain:jgroups:9.0">
<channels default="ee">
<channel name="ee" stack="tcpgossip" cluster="ejb"/>
</channels>
...
<stack name="tcpgossip">
<transport type="TCP" socket-binding="jgroups-tcp"/>
<socket-discovery-protocol type="TCPGOSSIP" socket-bindings="jgroups-host-a"/>
<protocol type="MERGE3"/>
<protocol type="FD_SOCK"/>
<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>
...
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
...
<outbound-socket-binding name="jgroups-host-a">
<remote-destination host="172.21.133.111" port="13001"/>
</outbound-socket-binding>
...
</socket-binding-group>
...
Plain Text
복사
6. 운영 시 반드시 챙겨야 할 것들
보안: GossipRouter는 기본적으로 인증이 없다
GossipRouter는 별도의 인증 메커니즘 없이 동작합니다. 즉, 해당 포트(예: 13001)에 접근 가능한 누구나 클러스터 멤버 정보를 조회하거나 등록할 수 있습니다.
운영 환경에서는 다음을 반드시 고려하세요.
•
방화벽으로 GossipRouter 포트 접근 IP를 클러스터 노드로 제한
단일 장애점(SPOF) 이슈
GossipRouter가 다운되더라도 이미 클러스터에 조인된 노드들 사이의 통신(세션 동기화)은 유지됩니다. 다만 그 상태에서는 신규 노드가 클러스터에 합류하지 못하는 문제가 발생합니다.
운영 안정성을 높이려면 GossipRouter를 이중화하는 것을 권장합니다.
socket-discovery-protocol의 socket-bindings 값에 여러 개의 outbound-socket-binding을 띄어쓰기로 나열하면, 다중 GossipRouter를 등록해 하나가 죽어도 나머지가 역할을 대신하도록 구성할 수 있습니다.
...
<subsystem xmlns="urn:jboss:domain:jgroups:9.0">
<channels default="ee">
<channel name="ee" stack="tcpgossip" cluster="ejb"/>
</channels>
...
<stack name="tcpgossip">
<transport type="TCP" socket-binding="jgroups-tcp"/>
<socket-discovery-protocol type="TCPGOSSIP" socket-bindings="jgroups-host-a jgroups-host-b"/>
<protocol type="MERGE3"/>
<protocol type="FD_SOCK"/>
<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>
...
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
...
<outbound-socket-binding name="jgroups-host-a">
<remote-destination host="172.21.133.111" port="13001"/>
</outbound-socket-binding>
<outbound-socket-binding name="jgroups-host-b">
<remote-destination host="172.21.133.112" port="13001"/>
</outbound-socket-binding>
...
</socket-binding-group>
...
Plain Text
복사
7. 마무리 및 체크리스트
TCPGOSSIP은 UDP 멀티캐스트가 막힌 클라우드/폐쇄망 환경이나 IP가 유동적인 동적 인프라에서 JBoss 클러스터링을 구현할 때 특히 유용한 방식입니다.
다만 GossipRouter라는 중계 지점이 추가되는 구조이기 때문에, 아래 체크리스트를 참고해 운영 안정성을 함께 챙기시길 권장합니다.
•
GossipRouter 포트에 대한 방화벽 접근 제어 적용
•
타임스탬프 포함 로그로 장애 발생 시점 추적 가능하도록 구성
•
GossipRouter 이중화(다중 등록) 구성 검토
•
로그 로테이션(logrotate) 적용으로 디스크 관리
Reference
https://docs.redhat.com/en/documentation/red_hat_jboss_enterprise_application_platform/8.1/html/configuration_guide/configuring_high_availability#switch_default_jgroups_channel_tcp
Plain Text
복사
김성진 프로
에스코어에서 미들웨어 엔지니어로 근무하며, 삼성 그룹사를 비롯한 국내 주요 대기업과 공공기관의 미들웨어 설계 및 기술지원을 담당하고 있습니다


