type
Post
status
Published
t-status
complete
date
Apr 9, 2020
slug
summary
~~
tags
Linux
Tomcat
main-category
BackEnd
category
Linux
icon
password
각 다른 서버에 동작하고있는 WAS간 세션공유가 필요하여 Tomcat 클러스터링 한 내용을 정리.
환경
서버 : 3대
운영체제 : Linux(centos7)
설정하기
Clustering/Session Replication HOW-TO 문서를 보면 간단히 할 수 있다.
WEB-INF/web.xml 에 아래 내용 추가
<distributable/> <!-- 톰켓세션클러스터링 -->
tomcat을 설치한 폴더 apache-tomcat-7.0.90/conf/server.xml 내용 수정
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" >
위 부분이 주석되어있을텐데 그부분부터 아래내용을 넣으면 된다.
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6"> <Manager className="org.apache.catalina.ha.session.BackupManager" mapSendOptions="6" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.0.100" port="4001" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt|.*\.jsp|.*\.apk"/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" /> </Cluster>
16라인의 address는 각 톰켓의 주소를 입력한다.
공식문서에는 auto로 설정하게끔되어있는데, auto로 설정한 결과 ip를 못찾는 경우가 발생하였다.
17라인은 각 서버의 ip가 다르므로 같은포트로해도 무관하나, 하나의서버에 was만 여러대를 켤 경우에는 다른 포트를 사용해야한다.
Manager 부분에 BackupManager로 설정하였다.
두가지 방법이있는데 DeletaDeltaManager 는 all-to-all 방식이고
BackupManager방식은 master-slave방식이다.
위 처리를 하고 구동 하면 클러스터링이 될거라 생각하였으나, 클러스터링이 제대로 되지 않는 상황 발생하여
확인해본결과 방화벽때문이었다.
45564 tcp,udp 오픈
4000:4100 tcp
을 하고 실행하였고, 혹시나 안된다면 리눅스 기본 방화벽인 iptables도 확인해보자
서버구동이 정상적으로 이뤄졌으며 세션공유도 잘 되는것을 확인하였으나, 로그인하는부분에서 문제발생 -_-
(setAttribute: Non-serializable attribute key 에러)
Was간 데이터 공유를 하기 위해선 직렬화를 하여야하는데, 로그인시 Session값안에 직렬화하지 않은 객체를 담는 작업이 있었다.
해당클래스에 Serializable 를 상속시켰다
ex) class A implements Serializable
이 후 정상 작동 하였다.
추가로, 서버가 기본적으로 멀티캐스팅 지원이 되어야한다.
ifconfig -a 명령어 입력
MULTICAST 설정이 안되어있다면
ifconfig enp0s3 multicast
(네트워크 인터페이스 이름은 다를수있다.)
입력하면 된다.