본문 바로가기
미들웨어/Apache,Tomcat

Redis를 활용한 Tomcat session clustering

by _Nate 2024. 4. 5.
반응형

Redis를 활용한 Tomcat session clustering 구성 가이드.


1. 환경정보

  • Tomcat9
  • JDK8

2. 참고사항

  • Tomcat session clustering용도의 redis연동 공식 library는 없음
  • redis에서 제공해주는 jedis library를 사용해 개발이 필요
  • 이번 가이드에서는 tomcat-cluster-redis-session-manager.jar 를 활용

3. library download

https://github.com/ran-jit/tomcat-cluster-redis-session-manager

 

GitHub - ran-jit/tomcat-cluster-redis-session-manager: Tomcat clustering redis session manager java client.

Tomcat clustering redis session manager java client. - ran-jit/tomcat-cluster-redis-session-manager

github.com

 

4. 환경설정

  • redis-data-cache.properties(conf아래 위치)
#-- Redis data-cache configuration

# - ${ENV_VARIABLE_NAME}

#- redis hosts. ex: 127.0.0.1:6379, 127.0.0.2:6379, 127.0.0.2:6380, ....
redis.hosts=${redis_ip}:${redis_port}

#- redis password.
redis.password=${redis_password}

#- set true to enable redis cluster mode. (default value: false)
redis.cluster.enabled=true

#- set true to enable redis sentinel mode. (default value: false)
redis.sentinel.enabled=false
# redis sentinel master name. (default value: mymaster)
redis.sentinel.master=mymaster

#- redis database. (default value: 0)
#redis.database=0

#- redis connection timeout. (default value: 2000 ms)
#redis.timeout=2000

#- enable redis and standard session mode. (default value: false)
# If enabled,
#   1. Must be enabled sticky session in your load balancer configuration. Else this manager may not return the updated session values.
#   2. Session values are stored in local jvm and redis.
#   3. If redis is down/not responding, requests uses jvm stored session values to process user requests. Redis comes back the values will be synced.
lb.sticky-session.enabled=false

#- session persistent policies. (default value: DEFAULT) ex: DEFAULT, SAVE_ON_CHANGE
# policies - DEFAULT, SAVE_ON_CHANGE, ALWAYS_SAVE_AFTER_REQUEST
#   1. SAVE_ON_CHANGE: every time session.setAttribute() or session.removeAttribute() is called the session will be saved.
#   2. ALWAYS_SAVE_AFTER_REQUEST: force saving after every request, regardless of whether or not the manager has detected changes to the session.
session.persistent.policies=DEFAULT
  • 필수항목으로 redis.hosts, redis.password 입력이 필요
  • 위의 예시와 같이 변수사용을 위해서는 tomcat-cluster-redis-session-manager.jar v3.0.4이상을 사용
  • redis의 구성에 따라 cluster, sentinel등의 내용을 설정

 

  • context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Valve className="tomcat.request.session.redis.SessionHandlerValve" />
    <Manager className="tomcat.request.session.redis.SessionManager" />
 ...
 </Context>
  • session manager 를 tomcat.request.session.redis.SessionManager로 설정

 

  • JVM_OPTS
-Dredis_ip=redis_address
-Dredis_port=6379
-Dredis_password=redis_password
  • redis-data-cache.properties에 변수를 선언했다면 JVM_OPTS에 -D로 해당 변수들의 value값들을 설정

 

5. 테스트

여러개 인스턴스를 띄워둔 뒤 RR방식으로 요청을 전달했을 때 session값이 유지되는 것을 확인할 수 있다.

  • 호출1 : IP 끝자리 20, SessionID : 0FE16~~~4C

  • 호출2 : IP 끝자리 31, SessionID: 0FE16~~4C

  • 호출3 : IP 끝자리 37, SessionID: 0FE16~~4C

Tomcat을 Container로 띄우게 될 경우 session 유지의 한가지 방안으로 Redis를 생각해 볼 수 있다.

단 공식적인 library는 없기 때문에 이부분에 대한 고려는 필요하다.

반응형