오픈소스 인사이트
home
오픈소스 기술 동향
home
📄

TCPGOSSIP을 활용한 JBoss 세션 클러스터링 설정 가이드

7 more properties
클라우드(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
복사
김성진 프로
에스코어에서 미들웨어 엔지니어로 근무하며, 삼성 그룹사를 비롯한 국내 주요 대기업과 공공기관의 미들웨어 설계 및 기술지원을 담당하고 있습니다