클라우드에서 redis로 tomcat session 관리 구성
서비스 가용성을 위해 서버를 이중화하여 한대의 서버에 장애가 발생해도 다른 한대에서 서비스를 제공하는 것 외에도, tomcat 을 사용하는 경우 사용자가 연결되어 있던 세션도 다른 서버로 넘겨줘야 할 필요가 생긴다.
이전 회사에는 미들웨어 운영팀이 있어서, 내가 tomcat을 만질일이 전혀 없었지만, 옆에서 지켜보면 session clustering을 구성하는 것은 그닥 간단하지 않은 것 같아 보였다.
대부분의 클라우드 사업자는 멀티캐스트를 지원하지 않기 때문에(예전에는 지원안했는데, 현재는 어떤지 확실히 모르겠음) 클라우드 환경에서는 Redis를 활용하여 세션을 관리할 수 있도록 구성한다.
네이버클라우드에서 LB, VM, Redis Cluster를 활용해서 세션 클러스터링 컨셉 구성을 진행해봤다.
먼저 CentOS 서버 2대에 tomcat을 설치하고 Proxy LB 에 연결하여 이중화 구성을 한 후 Redis Cluster를 생성했다.
1. VM에 java 설치
java 설치는 이 링크를 참고
https://cleanupthedesk.tistory.com/29
2. Tomcat 설치
cd /home/download #아무데나 다운로드 받아도 상관은 없음
wget http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.59/bin/apache-tomcat-8.5.59.tar.gz
tar zxvf apache-tomcat-8.5.59.tar.gz
mv /home/download/apache-tomcat-8.5.59 /usr/local/lib
>> 환경 설정 파일 업데이트
vi /etc/profile
export JAVA_HOME=/usr/java/jdk-14.0.2
export PATH=$PATH:/usr/java/jdk-14.0.2/bin
PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
CATALINA_HOME=/usr/local/lib/apache-tomcat-8.5.59
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar
export CATALINA_HOME
source /etc/profile
echo $CATALINA_HOME
cd /usr/local/lib/apache-tomcat-8.5.59/bin
./startup.sh
tomcat 서버에 8080 포트로 브라우저에서 접속해본다. tomcat 호랑이 그림 나오는 페이지 보이면 정상
2대 서버 모두 설정해준다.
3. Network Proxy Load Balancer 설정
1) LB Target Group , Health Check 설정
아래 이미지는 생성한 이후 설정 내역을 조회한것이라서, 실제 생성할 때는 이미지의 값을 참고하면 된다.
4. Tomcat 서버에 Redis Session Manager 다운로드 및 tomcat 설정 변경
cd /home/download
wget https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/2.0.4/tomcat-cluster-redis-session-manager.zip
unzip tomcat-cluster-redis-session-manager.zip
cd /usr/local/lib
cp /home/download/tomcat-cluster-redis-session-manager/lib/* ./apache-tomcat-8.5.59/lib/
cp /home/download/tomcat-cluster-redis-session-manager/conf/* ./apache-tomcat-8.5.59/conf/
redis cluster 의 end-point 정보를 아래와 같이 확인한다.
>> redis-data-cache.properties 수정
vi /usr/local/lib/apache-tomcat-8.5.59/conf/redis-data-cache.properties
redis.hosts=redisc-XXXXX.vpc-cdb.ntruss.com:6379 ## redis endpoint 추가
>> web.xml 수정
vi /usr/local/lib/apache-tomcat-8.5.59/conf/web.xml
<session-config>
<session-timeout>60</session-timeout> ## 60 으로 변경
</session-config>
>> context.xml 수정
vi /usr/local/lib/apache-tomcat-8.5.59/conf/context.xml
<Context> ## <Context> </Context> 사이에 아래 내용 추가
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />
</Context>
모든 설정은 완료되었으므로, tomcat 을 재기동 한다.
cd /usr/local/lib/apache-tomcat-8.5.59/bin
./shutdown.sh
./startup.sh
tail -f /usr/local/lib/apache-tomcat-8.5.59/logs/catalina.out
5. Test 페이지 설정 (참고 : https://1mini2.tistory.com/43)
cd /usr/local/lib/apache-tomcat-8.5.59/webapps/ROOT
mv index.jsp index.bk
>> 서버 ip와 session id를 확인할 수 있는 테스트 페이지 다운로드
wget https://s3.ap-northeast-2.amazonaws.com/youngwoo.lab/download/tomcat_session_test_jsp/tomcat_session_test.jsp
mv tomcat_session_test.jsp index.jsp
/usr/local/lib/apache-tomcat-8.5.59/bin/shutdown.sh
/usr/local/lib/apache-tomcat-8.5.59/bin/startup.sh
NPLB 의 도메인으로 브라우저에서 접속해보면 서버 ip와 세션 ip를 확인할 수 있다.
10.0.1.15 서버의 tomcat을 중지시키면, 10.0.1.16 서버에서 서비스를 제공하지만 세션 ID는 변경되지 않은 것을 확인할 수 있다.