(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