카테고리 보관물: IMDG

Hazelcast WEB Session Clustering

  • Concept

기본 목적은 로드 밸런싱으로 묶인 WAS 그룹간의 세션 정보의 공유이며 그룹내의 임의의 WAS가 Fail over되어도 세션 정보를 유실하지 않고 다른 WAS에서 세션 연결을 가능케 하는 것입니다.

그로 인해 부가적으로 이기종 WAS간에도 세션 공유를 가능케 할 수 있다는 큰 이점이 있습니다.

  • 구동 방식
  1. 사용자의 request가 was에 도달(servlet container)
  2. request의 session id를 대조 하는 절차 진행시(WAS에서 세션 정보 조회 전)
  3.  webfilter를 통해 request의 쿠키가 가진 session id를 IMDG의 맵에서 조회
  4. 조회 값을 반환 할 경우 기존 session으로 할당 처리( 후 request 응답 처리)
  5. 조회 값이 없을 경우 webfilter를 통해 지정된 형식으로 session id 생성 후 그 id로 sessionlistener를 통해 httpsession 생성
  6. request가 완료되면 생성된 session 정보를 IMDG 맵에 저장
  • IMDG

노드들을 클러스터 구성 하여 여러 서버의 메모리를 파티셔닝 또는 샤딩이라는 기술을 통해 하나의 메모리 공간처럼 활용, 데이터를 임의의 노드 메모리에 분산 저장시 실시간 또는 비동기로 생성된 백업 데이터는 원본 데이터를 소유한 노드 이외의 다른 노드에 분산 저장됩니다.
이 기능을 이용하여 세션 정보의 손실을 방지 하며 빠른 I/O 성능을 보장합니다.

https://www.sierracloud.kro.kr/imdg-overview/

  • 구성 ( hazelcast 3.12 기준, JDK 1.8 )
  1. WEB-INF에 web.xml 및 hazelcast-client.xml 설정
  2. 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 -->
TopicDescDefault
map-name세션 오브젝트가 저장될 분산맵의 이름 선언
session-ttl-seconds세션 오브젝트가 저장될 분산맵의 수명(초) 설정, 0이상의 정수형(최대2147483647)으로 설정1800(30분)
sticky-sessiontrue 설정시, 모든 세션 요청이 세션이 처음 만들어진 멤버로 라우팅 됨. 더 좋은 성능을 제공함. false 설정시, 세션이 멤버상에서 업데이트 될 때, 모든 멤버상의 이 세션 엔트리는 무효화 됨.
이 파라메터를 설정하기 전에 로드 밸런서(L4) 구성상황을 알 필요가 있음
true
Generic Parameter 의미
  • 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>

IMDG Overview

IMDG(In-Memory Data Grid)란?

일반적인 Legacy 구조는 WEB-WAS-RDBMS 계층의 구조이며 RDBMS는 데이터를 하드디스크에 적재하였습니다. 하지만 나날이 늘어가는 데이터의 양과 사용자의 폭발적인 증가로 인해 기존의 Legacy 구조에서는 WAS 또는 AP를 병렬적으로 확장하더라도 RDBMS의 병목으로 인해 처리량 향상의 한계에 다다르게 되었습니다.

그로 인해 메모리 캐시를 활용하는 것을 뛰어넘어 메인 메모리에 데이터를 보관하는 IMDG와 IMDB가 등장하게 되었습니다.

전통적인 하드디스크에 데이터를 적재하는 구조에서 벗어나 메인 메모리에 데이터를 적재하는 점은 IMDB(In-Memory Database), MMDB(Main Memory Database)와 유사하지만 아래의 차이점이 있습니다.

  • 다수의 서버를 클러스터링하여 데이터를 분산, 복제 보관
  • Active/Standby 관계가 아닌 모든 서버가 활성화 되어 고가용성(High Availability) 및 확정성(Scalability) 보장
  • 비 관계형, 객체지향의 NoSQL기반(Key, Value) 데이터 구조
  • 메모리 기반 연산(Computing)

IMDG가 각광 받기 시작한 것은 최근 수년동안이지만 메모리 저장소 개념이 등장한 것은 꽤 오래된 개념입니다. 과거에는 고가의 메모리를 저장소로 사용하는 부분에 가격적인 부담이 크고 메모리에 데이터를 보관하면서 발생할 수 있는 데이터 정합성, 지속성 문제로 인해 단순히 Buffer 개념의 캐시 서버(Cache Server)로 사용 하였지만 근래 들어 메모리 가격의 인하, 컴퓨팅 파워의 획기적인 증가, 분산Lock등의 데이터 정합성 유지를 위한 기능들로 인해 다시 주목을 받게 되었습니다.

IMDG(In-Memory Data Grid)의 종류

다양한 제품군이 존재하며 대부분 오픈소스와 상용제품군 투트랙으로 서비스 하고 있습니다. 제품 종류는 아래와 같습니다.

  • Hazelcast
  • Ignite / GridGain
  • infinispan / Red Hat JBoss Data Grid
  • Terracotta
  • Oracle Coherence
  • VMware Gemfire
  • IBM eXtreme Scale

IMDG 적용 분야

IMDG는 IMDB와 달리 IMDG 내부에 처리 로직(Processing Logic)을 적재하여 저장 또는 수정되는 데이터를 통해 해당 작업을 수행 하며 기존의 3 Tier 구조의 한계를 뛰어넘는 초고속의 비즈니스 로직 구현이 가능합니다. 적용 가능한 대표적인 분야는 아래와 같습니다.

  • 빅데이터 분석 플랫폼(Hadoop)
  • AI / ML
  • 이상 거래 탐지(Fraud Detection)
  • Session Clustering
  • 기타 복잡한 데이터 전처리가 필요한 모든 분야

※ 각 밴더별 IMDG 제품 자료는 정리될 때마다 올리도록 하겠습니다…