본문 바로가기
WAS/TOMCAT

6. tomcat 클러스터링 2

by coldplayer83 2023. 7. 24.
728x90

https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html

https://tomcat.apache.org/tomcat-8.5-doc/config/cluster.html

https://sarc.io/index.php/tomcat/111-tomcat-session-cluster-1

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

      <Cluster
          channelSendOptions="8"
          channelStartOptions="3"

jvmRoute : apache mod_jk의 경우 jvmRoute 값을 이용하여 사용 was 판단

설정시 각 JSESSION_ID의 끝에 tag가 설정됨
ex) 5364B126FE79474FE1CA714D4D104825.tomcat1

 

channelSendOptions : 세션 공유 방식 설정. 동기 방식 6. 비동기 방식 8(디폴트)

 

channelStartOptions : 클러스터에 사용하는 channel 개체에 대한 시작 및 중지 플래그 설정

멀티캐스팅 없이 서버 시작하려면 3으로 지정

 

<Manager
	className="org.apache.catalina.ha.session.DeltaManager"
	expireSessionsOnShutdown="false"
	notifyListenersOnReplication="true" />
종류 설명
org.apache.catalina.session.StandardManager 가장 기본적인 Manager 로 하나의 Tomcat 인스턴스에만 유효함
org.apache.catalina.session.PersistentManager Session persistence 를 위하여 파일시스템 혹은 DB 를 사용
org.apache.catalina.ha.session.DeltaManager Cluster 환경에서 사용하며, cluster 간에 모든 session 을 replication 
org.apache.catalina.ha.session.BackupManager Cluster 환경에서 사용하며, 정해진 backup 인스턴스로만 replication

※ BackupManager는 아직 DeltaManager만큼 검증되지 않았다고 함

 

expireSessionsOnShutdown : tomcat 서버가 shutdown될 때 모든 노드의 모든 세션들을 expire할지 여부.

디폴트는 false

 

notifyListenersOnReplication : 다른 tomcat에서 세션이 생성, 소멸될 때 알림 수신 여부

 

<Channel className="org.apache.catalina.tribes.group.GroupChannel">
	<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
		<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
	</Sender>

Channel : 서로 다른 tomcat 간의 메시지 송수신에 관련된 하위 Component를 그룹핑

 

Sender : 한 노드에서 다른 노드로 네트워크를 통해 전송되는 모든 아웃바운드 연결 및 데이터 메시지 관리

노드에서 클러스터로 메시지를 보내는 역할

 

Transport : 기본적으로 'org.apache.catalina.tribes.transport.nio.PooledParallelSender'를 사용하지만 non-blocking 방식으로 동시에 여러 노드로 메시지를 보낼 수도, 하나의 노드에 여러 메시지를 동시에 보낼 수도 있음

'org.apache.catalina.tribes.transport.bio.PooledMultiSender'는 blocking 방식 사

 

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
	address="192.168.56.101"
	port="3100"
	autoBind="0"
	maxThreads="6"
	selectorTimeout="5000" />

https://tomcat.apache.org/tomcat-8.5-doc/config/cluster-receiver.html

 

Receiver : 클러스터로부터 메시지를 수신하는 역할을 하며,

blocking 방식인 'org.apache.catalina.tribes.transport.bio.BioReceiver'와

non-blocking 방식인 'org.apache.catalina.tribes.transport.nio.NioReceiver'를 지원
Tomcat에서는 스레드 기아 상태에 빠지지 않고 클러스터를 확장할 수 있도록 non-blocking 방식을 추천함

제한된 스레드 수로 많은 양의 메세지를 처리할 수 있으며, 기본 규칙은 노드 당 1개의 thread를 할당

 

Address : 현재 장비의 ip

port : 클러스터 수신 포트. 기본값은 4000.

포트 충돌을 피하기 위해 Receiver는 자동으로 범위 내에서 사용 가능한 포트에 바인딩 함.

port <= bindport < port+autobind

 

autoBind : 수신 포트 변경 범위. 기본값은 100. 수신 대상이 고정일 때 0으로 설정

 

maxThreads : Receiver 스레드 풀의 최대 스레드 수. 기본값은 15

 

selectorTimeout : NioRecever의 polling 대기 시간. 기본값은 5000(ms)

※ polling : 브라우저가 일정한 주기로 HTTP 요청을 보내는 방식

 

<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor" staticOnly="true"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
	<Member className="org.apache.catalina.tribes.membership.StaticMember"
		host="192.168.56.102"
		port="3100"
		uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2}" />
</Interceptor>

https://tomcat.apache.org/tomcat-8.5-doc/config/cluster-interceptor.html

 

사용 가능한 Interceptor

org.apache.catalina.tribes.group.interceptors.TcpFailureDetector
org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor
org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor
org.apache.catalina.tribes.group.interceptors.NonBlockingCoordinator
org.apache.catalina.tribes.group.interceptors.OrderInterceptor
org.apache.catalina.tribes.group.interceptors.SimpleCoordinator
org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor
org.apache.catalina.tribes.group.interceptors.TwoPhaseCommitInterceptor
org.apache.catalina.tribes.group.interceptors.DomainFilterInterceptor
org.apache.catalina.tribes.group.interceptors.FragmentationInterceptor
org.apache.catalina.tribes.group.interceptors.GzipInterceptor
org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor
org.apache.catalina.tribes.group.interceptors.EncryptInterceptor

Interceptor : 메시지와 멤버십 알림을 위한 인터셉터 지원

org.apache.catalina.tribes.group.interceptors.TcpFailureDetector 뒤에 org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor를 작성하면 동적 멤버십 외에 정적 멤버십 지원 가능

 

host : 클러스터링 할 서버 장비 ip

세가지 형식으로 작성 가능.

1) ip : 123.123.1.23

2) hostname : tomcat1.domain.com 또는 tomcat1

3) 문자열 형식의 byte 배열 : {216,123,12,3}

 

port : 클러스터 수신 포트

 

uniqueId : 정적 멤버에 대한 범용 uniqueId. 문자열 형식의 16 byte 배열로 작성.

ex) {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}

 

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
	filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

https://tomcat.apache.org/tomcat-8.5-doc/config/cluster-valve.html

Valve : 'org.apache.catalina.ha.ClusterValve'를 구현한 객체로 일반적인 톰캣 Valve와 다르지 않음

HTTP 요청에 대한 호출 체인 인터셉터

'org.apache.catalina.ha.tcp.RelicationValve' : HTTP Request가 끝나는 시점에 데이터를 복제할지 말지 결정하도록 클러스터에 알리는 역할

'org.apache.catalina.ha.session.JvmRouteBinderValve' : mod_jk 사용중 failover시 세션 id에 저장한 jvmWorker 속성을 변경하여 다음 request부터는 해당 노드에 고정

fallback 기능을 원하는 경우 이 Valve는 활성화 x.

장애 조치를 유지하고 mod_jk가 중단된 노드를 계속 검색하지 않아도 되도록하려면 이 Valve를 사용

 

filter : 알려진 확장자나 url의 경우 이 Valve를 사용하여 요청이 이 필터 패턴과 일치하면 클러스터는 세션 변경이 없다고 가정 

 

<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"/>

https://tomcat.apache.org/tomcat-8.5-doc/config/cluster-deployer.html

FarmWarDeployer : 클러스터의 다른 노드에서 어플리케이션 deploy, undeploy 가능

호스트 레벨의 클러스터에서만 구성 가능

 

tempDir : 클러스터에서 WAR 다운로드시 바이너리 데이터를 저장할 임시 디렉토리

절대경로 이름 또는 ${CATALINA_BASE} 디렉토리에 상대 경로 이름 지정 가능

 

deployDir : 어플리케이션을 배포하는 배포 디렉토리

절대경로 이름 또는 ${CATALINA_BASE} 디렉토리에 상대 경로 이름 지정 가능

이 속성은 호스트의 appBase와 동일한 값이어야 함

 

watchDir : 어플리케이션의 변경(추가/수정/삭제)을 감시하는 디렉토리

절대경로 이름 또는 ${CATALINA_BASE} 디렉토리에 상대 경로 이름 지정 가능

watchEnabled가 false인 경우 이 속성은 적용되지 않음

 

watchEnabled : 어플리케이션의 변경 사항을 감시하려면 true로 설정. 기본값은 false

 

https://tomcat.apache.org/tomcat-8.5-doc/config/cluster-listener.html

ClusterListener : 클러스터 내 다른 노드의 메시지 수신

DeltaManager를 사용할 경우 Cluster 개체를 통해 메시지를 수신하고 'org.apache.catalina.ha.session.ClusterSessionListener'를 통해 Manager에 메시지 전달

 

'WAS > TOMCAT' 카테고리의 다른 글

5. tomcat 클러스터링  (0) 2023.07.14
4. Connector 속성 정의 (server.xml)  (0) 2023.07.14
3. 서비스 포트 변경  (0) 2023.07.14
2. JAVA 버전 변경  (0) 2023.07.14
1. 설치 및 버전 확인  (0) 2023.07.14