- Concept
기본 목적은 로드 밸런싱으로 묶인 WAS 그룹간의 세션 정보의 공유이며 그룹내의 임의의 WAS가 Fail over되어도 세션 정보를 유실하지 않고 다른 WAS에서 세션 연결을 가능케 하는 것입니다.
그로 인해 부가적으로 이기종 WAS간에도 세션 공유를 가능케 할 수 있다는 큰 이점이 있습니다.
- 구동 방식
- 사용자의 request가 was에 도달(servlet container)
- request의 session id를 대조 하는 절차 진행시(WAS에서 세션 정보 조회 전)
- webfilter를 통해 request의 쿠키가 가진 session id를 IMDG의 맵에서 조회
- 조회 값을 반환 할 경우 기존 session으로 할당 처리( 후 request 응답 처리)
- 조회 값이 없을 경우 webfilter를 통해 지정된 형식으로 session id 생성 후 그 id로 sessionlistener를 통해 httpsession 생성
- request가 완료되면 생성된 session 정보를 IMDG 맵에 저장
- IMDG
노드들을 클러스터 구성 하여 여러 서버의 메모리를 파티셔닝 또는 샤딩이라는 기술을 통해 하나의 메모리 공간처럼 활용, 데이터를 임의의 노드 메모리에 분산 저장시 실시간 또는 비동기로 생성된 백업 데이터는 원본 데이터를 소유한 노드 이외의 다른 노드에 분산 저장됩니다.
이 기능을 이용하여 세션 정보의 손실을 방지 하며 빠른 I/O 성능을 보장합니다.
https://www.sierracloud.kro.kr/imdg-overview/
- 구성 ( hazelcast 3.12 기준, JDK 1.8 )
- WEB-INF에 web.xml 및 hazelcast-client.xml 설정
- WEB-INF/lib 또는 Classpath에 hazelcast-wm.jar(hazelcast-all.jar 가능) 위치
- web.xml 설정
<!-- hazelcast filter start --> <filter> <filter-name>hazelcast-filter</filter-name> <filter-class>com.hazelcast.web.WebFilter</filter-class> <init-param> <param-name>map-name</param-name> <param-value>hazelcast-sessions</param-value> </init-param> <init-param> <!-- Embedded only --> <param-name>session-ttl-seconds</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>keep-remote-active</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>sticky-session</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>cookie-name</param-name> <param-value>hazelcast.sessionId</param-value> </init-param> <init-param> <!-- 도메인 없을 때 비울것 --> <param-name>cookie-domain</param-name> <param-value>www.example.com</param-value> </init-param> <init-param> <param-name>cookie-secure</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>cookie-http-only</param-name> <param-value>false</param-value><!-- default false --> </init-param> <init-param> <param-name>debug</param-name> <param-value>true</param-value><!-- default false --> </init-param> <init-param> <param-name>shutdown-on-destroy</param-name> <param-value>false</param-value> </init-param> <init-param> <!-- 이부분이 설정파일의 위치(Embaded 설정) --> <param-name>config-location</param-name> <param-value>/WEB-INF/config/spring/my-hazelcast.xml</param-value> </init-param> <init-param> <param-name>instance-name</param-name> <param-value>hazel-ses</param-value> </init-param> <init-param> <!-- Client mode only --> <param-name>use-client</param-name> <param-value>true</param-value> </init-param> <init-param> <!-- Client Configuration(or hazelcast-client.xml) --> <param-name>client-config-location</param-name> <param-value>/WEB-INF/classes/hazelcast-client.properties</param-value> </init-param> <init-param> <param-name>deferred-write</param-name> <param-value>true</param-value><!-- default false --> </init-param> <init-param> <param-name>cookie-path</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>cookie-max-age</param-name> <param-value>-1</param-value> </init-param> <init-param> <param-name>use-request-parameter</param-name> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>hazelcast-filter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> <listener> <listener-class>com.hazelcast.web.SessionListener</listener-class> </listener> <!-- hazelcast filter end -->
Topic | Desc | Default |
map-name | 세션 오브젝트가 저장될 분산맵의 이름 선언 | |
session-ttl-seconds | 세션 오브젝트가 저장될 분산맵의 수명(초) 설정, 0이상의 정수형(최대2147483647)으로 설정 | 1800(30분) |
sticky-session | true 설정시, 모든 세션 요청이 세션이 처음 만들어진 멤버로 라우팅 됨. 더 좋은 성능을 제공함. false 설정시, 세션이 멤버상에서 업데이트 될 때, 모든 멤버상의 이 세션 엔트리는 무효화 됨. 이 파라메터를 설정하기 전에 로드 밸런서(L4) 구성상황을 알 필요가 있음 | true |
- Client config 구성 ( hazelcast-client.xml )
<hazelcast-client> ... <group> <name>dev</name> <password>dev-pass</password> </group> <network> <cluster-members> <!--MEMBERS--> <address>192.168.0.101</address> <address>192.168.0.102</address> <address>192.168.0.103</address> </cluster-members> </network> <load-balancer type="round-robin"/> ... </hazelcast-client>