(1) 편에서 설정 중심으로 설명드렸는데, 이번 (2) 편에서는 실행 과정 중심으로 말씀드리겠습니다.

 

1. Tomcat 기동 과정 중

 

org.apache.catalina.connector.Connector

HTTP/1.1 connector 생성

StandardService.addConnector()

AJP/1.3 connector 생성

StandardService.addConnector()
StandardEngine.setJvmRoute.routeId=node1
StandardService.setServer()

 

org.apache.catalina.tribes.transport.ReceiverBase bind
: McastServiceImpl.mcastAddress=/228.0.1.4
: McastServiceImpl.sendFrequency=500
: McastServiceImpl.expireTime=3000
: McastServiceImpl.port=45564
: McastServiceImpl.ttl=-1
: McastServiceImpl.soTimeout=-1

mcastAddress, sendFrequency 등 위 값들은 모두 server.xml 에 SimpleTcpCluster 에서 명시적으로 설정 가능하며, 설정하지 않을 경우 default 값이 적용됩니다. 

org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
INFO: Setting cluster mcast soTimeout to 500
: McastServiceImpl.setRecoveryCounter.recoveryCounter=10
: McastServiceImpl.setRecoverySleepTime.recoverySleepTime=5000
: McastServiceImpl.waitForMembers.level=4
Sleeping for 1000 milliseconds to establish cluster membership, start level:4
: McastServiceImpl.waitForMembers.level=8
Sleeping for 1000 milliseconds to establish cluster membership, start level:8

 

: SimpleTcpCluster.createManager.name=
: DeltaManager.setName=Clone-from-null
: DeltaManager.setName=localhost#

 

org.apache.catalina.ha.session.DeltaManager startInternal
: DeltaManager.getName=localhost#
: DeltaManager.getAllClusterSessions()

 

2. 기동 후

 

node1 이 기동 된 상태에서 node2 를 추가 기동할 때 node1 을 디버깅 해보면,

Membership.memberAlive.entry=null
Membership.addMember()
McastServiceImpl.memberDataReceived.name=pool-1-thread-3
Membership.memberAlive.entry=null
Membership.addMember()
SimpleTcpCluster.memberAdded()
DeltaManager.isSendAllSessions=true

 

만일 node2 를 내리면,

SimpleTcpCluster.memberDisappeared()

 

3. 세션 생성

 

node1 와 node2 가 모두 기동되어 있는 상황에서 node1 에 세션이 생성되면,

< node1 디버깅 >

DeltaManager.createSession.sessionId=null
DeltaManager.createEmptySession()
DeltaManager.getNewDeltaSession()
StandardSession.activityCheck=null
StandardSession.lastAccessAtStart=null
StandardSession.ACTIVITY_CHECK=false
setCreationTime.setAuthType=1396855430388
DeltaSession.setMaxInactiveInterval.interval=1800
DeltaRequest.setMaxInactiveInterval.interval=1800
DeltaSession.setId.id=5427FA09D116BDAA3B838B63F8D58A46.node1
DeltaRequest.setSessionId.sessionId=5427FA09D116BDAA3B838B63F8D58A46.node1
DeltaManager.sendCreateSession.sessionId=5427FA09D116BDAA3B838B63F8D58A46.node1
SessionManagerImpl.contextName=localhost#
SessionManagerImpl.eventtype=1
SessionManagerImpl.sessionID=5427FA09D116BDAA3B838B63F8D58A46.node1
ClusterSession.requestCompleted.sessionId=5427FA09D116BDAA3B838B63F8D58A46.node1
ClusterSession.requestCompleted.sessionId=5427FA09D116BDAA3B838B63F8D58A46.node1
ClusterSession.requestCompleted.expires=false

< node2 디버깅 >

ClusterSessionListener.messageReceived.ctxname=localhost#
DeltaManager.createEmptySession()
DeltaManager.getNewDeltaSession()
StandardSession.activityCheck=null
StandardSession.lastAccessAtStart=null
StandardSession.ACTIVITY_CHECK=false
setCreationTime.setAuthType=1396855430388
DeltaRequest.setSessionId.sessionId=5427FA09D116BDAA3B838B63F8D58A46.node1
DeltaRequest.setSessionId.sessionId=5427FA09D116BDAA3B838B63F8D58A46.node1

 

4. 세션 공유 주기

 

node1 기동 상황에서 node2 를 기동하고, node2 측에 "INFO: Server startup in ... ms" 가 기록되었다고 해서 양 노드 간 세션 공유가 된 것이 아니라 기존 node1 에

ClusterSessionListener.msg.getEventType=4
ClusterSessionListener.msg.getEventTypeString=SESSION-GET-ALL
ClusterSessionListener.messageReceived.ctxname=localhost#
DeltaManager.isSendAllSessions=true
SessionManagerImpl.contextName=localhost#
SessionManagerImpl.eventtype=12
SessionManagerImpl.sessionID=SESSION-STATE
SessionManagerImpl.contextName=localhost#
SessionManagerImpl.eventtype=14
SessionManagerImpl.sessionID=SESSION-STATE-TRANSFERED
Membership.addMember()
SimpleTcpCluster.memberAdded()

에 의하여 

Apr 07, 2014 5:19:17 PM org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded

와 같은 로그가 기록되어야 서로 세션이 동기화된 것입니다. 그런데 어느 때는 기동하자마자 Server startup.. 이 나오기도 전에 될 때도 있고, 어느 때는 기동하고 Server startup .. 이 나온 한참 후에 될 때도 있습니다. 어떠한 주기가 있는 것 같은데 좀 더 확인이 필요합니다. (Membership 에서 receive() 와 memberAlive() 의 디버깅을 해보면 설정되어 있는 바와 같이 500ms 마다 동작을 하고 있기는 합니다)

  

5. TcpFailureDetector

 

TcpFailureDetector 는 default 입니다.

node1 과 node2 가 모두 기동되어 있는 상황에서 node2 를 내렸을 때 디버그입니다.

McastServiceImpl.memberDataReceived()
McastServiceImpl.memberDataReceived()
Membership.removeMember.name=tcp://{192, 168, 0, 102}:4000
Membership.removeMember.members.length=1
McastServiceImpl.memberDataReceived.t != null
TcpFailureDetector.memberDisappeared.Member.name=tcp://{192, 168, 0, 102}:4000
Membership.removeMember.name=tcp://{192, 168, 0, 102:4000
Membership.removeMember.members.length=1
SimpleTcpCluster.memberDisappeared.member.name=tcp://{192, 168, 0, 102:4000
SimpleTcpCluster.unregisterMember.member.name=tcp://{192, 168, 0, 102:4000