Session共享 —— memcached + Tomcat

Table of Contents

1. Nginx + Tomcat

1.1 实验环境

1.2 实验流程

1.3 Tomcat定义

1.4 安装Tomcat

1.4.1 安装JDK

1.4.2 安装Tomcat

1.4.3 配置JDK

1.4.4 配置Tomcat

1.4.5 负载均衡 

2. sticky模块

2.1 sticky工作原理

3. MemCache在tomcat中实现交叉存储

3.1 下载memcached-session共享的jar包,实现session共享


1. Nginx + Tomcat

1.1 实验环境

node1:192.168.1.11

node2:192.168.1.12

1.2 实验流程

使用node1上nginx作为代理,负载均衡到node1和node2的tomcat上,

1.3 Tomcat定义

Tomcat服务器是一个免费的开发源代码的WEB应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。其主要的应用场景是解析动态程序代码(Java ) 。JSP程序可以处理Tomcat界面。

1.4 安装Tomcat

node1安装Tomcat和JDK,并配置JDK环境变量

1.4.1 安装JDK

下载地址:https://www.oracle.com/java/technologies/javase-downloads.html

1.4.2 安装Tomcat

下载地址:https://tomcat.apache.org/download-90.cgi 

1.4.3 配置JDK

  • 解压JDK
tar zxf jdk-14.0.1_linux-x64_bin.tar.gz -C /usr/local/
  • 做软链接
ln -s jdk-14.0.1 java
  • 添加JDK环境变量
vim /etc/profile
source /etc/profile           # 重载系统环境变量

  • 查看JAVA版本

  • 测试
vim test.java
###
public class test{
	public static void main(String[] args){
		System.out.println("Hello World~~");
	}
}
###
javac test.java        # 编译
java test.java         # 执行

运行正常,说明我们JDK已经配置成功~

1.4.4 配置Tomcat

  • 解压Tomcat
tar zxf apache-tomcat-9.0.35.tar.gz -C /usr/local/
  • 做软链接
ln -s apache-tomcat-9.0.35 tomcat
  • 启动tomcat
/usr/local/tomcat/bin/startup.sh           # 启动tomcat

  • 查看日志
vim /usr/local/tomcat/logs/catalina.out          # 编辑输出日志

  • 查看端口
netstat -tnlp

  • 浏览器访问

但是用户访问的是nginx,而非8080端口,因此我们需要去配置一下nginx

1.4.5 负载均衡 

  • 配置node2主机Tomcat和JDK,与node1相同

  • nginx配置jsp请求负载均衡到node1和node2的Tomcat 
vim /usr/local/lnmp/nginx/conf/nginx.conf

http中定义一个上游服务器组

server中添加

  • 测试访问

负载均衡已经生效

  • 测试访问nginx请求jsp资源

node1:

node2: 

虽然可以访问,但是这明显不是我们想要的结果,图片并没有显示出来。这是因为当前请求是由nginx自行处理,现在我们应该将其交由Tomcat处理

jsp页面中对于静态资源的加载,我们使用的是相对路径,我们请求的url是nginx代理服务器,所以对于相对路径的资源,默认在nginx的发布目录寻找 可以将tomcat的ROOT中的静态资源部署在nginx中,这样就可以加载。

  • 复制静态资源并增加权限 

权限不够,修改权限

成功访问~~

2. sticky模块

在使用负载均衡的时候会遇到会话保持的问题,常用的方法有:

  • ip hash,根据客户端的IP,将请求分配到不同的服务器上
  • cookie,服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发布者

2.1 sticky工作原理

Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上

  1. 客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器
  2. 后端服务器处理完请求,将响应数据返回给nginx
  3. 此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值
  4. 客户端接收请求,并保存带route的cookie
  5. 当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器 
  • 编辑测试页面,部署到node1和node2上

  • 测试访问

输入user为user1,password为111

输入user为user2,password为222

可以看到,因为负载均衡原因,请求在node1和node2来回跳转,导致session信息丢失 

  • 下载sticky
wget http://nginx-sticky-module.googlecode.com/files/nginx-sticky-module-1.1.tar.gz
  • 解压sticky
unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip

  • 重新编译nginx 
./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --user=nginx --group=nginx --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42   
# 增加一个额外增加模块所使用的参数

  • make && make install

模块添加成功~

  • 编辑nginx配置文件,添加sticky

语法无误,验证了模块添加成功~,重启nginx

  • 浏览器访问

可以看到,访问的都是node1,session保存成功~

此时,看似已经完成了结果,但是还有一个隐患,就是我们当前正在node1输入,但是node1服务器突然崩溃了怎么办,这个时候,session会跳转到node2,但是session不会被保存下来

  • 关闭node1的Tomcat,继续输入

可以看到之前session中的信息没有了,这当然是不允许的,那么这里我们就需要使用memcached来保存session,实现session共享

3. MemCache在tomcat中实现交叉存储

为甚么要使用交叉存储呢?

防止某个服务器的Tomcat忽然宕机,这个时候由于我们使用交叉存储,用户的数据在另一个服务器的memcache中存储了一份,可以保证用户数据不丢失。

具体过程:

< t1 > < t2 >

。\         /。

    。X 。

。/         \。

< m1 > < m2 >

为了对数据的保存更加牢靠,我们选择交叉存放session的方法,即将访问tomcat1上的数据存放在memcache2中,将访问tomcat2上的数据存放在memcache1中,这样存放,当其中某个tomcat服务断了之后,访问它的客户session并不会消失,而是存放在了另一个服务器的memcache,如果存放session的memcache坏了,那么它的数据会立即切换到另一个memcached中

3.1 下载memcached-session共享的jar包,实现session共享

官方文档:https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration 

下载地址:

asm.jar包下载:http://www.java2s.com/Code/Jar/a/Downloadasmjar.htm

kroy-4.0.2.jar包下载: https://repo1.maven.org/maven2/com/esotericsoftware/kryo/4.0.2/

izerkryo-serializers-0.9.jar包下载:https://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.9/

memcached-session-manager.jar包下载:https://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.3.2/

memcached-session-manager-tc9.jar下载地址:https://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc9/

minlog-1.3.1.jar包下载:https://www.mvnjar.com/com.esotericsoftware/minlog/1.3/detail.html

msm-kryo-serializer-2.3.2.jar包下载:https://repo1.maven.org/maven2/de/javakaffee/msm/msm-kryo-serializer/2.3.2/

objenesis-3.1.jar包下载:https://www.mvnjar.com/org.objenesis/objenesis/3.1/detail.html

reflectasm-1.11.9.jar包下载:https://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.9/

spymemcached-2.8.4.jar包下载:https://mvnrepository.com/artifact/spy/spymemcached/2.8.4?__cf_chl_jschl_tk__=39e7795fd0bd965da0929df8232d8edd0c8f9118-1589433883-0-AX8rpo0_ePObJALVlQyXZFt9EO1qAizqWJ4XzAd6-StnDzjxmTXGF-GngtQtndI60Vd4AYtAmm0g39Ut4ImKCL80Oo8N7D9CU3mDOMiIS23TJwD6NzbtPtT3D51Xp0DNBRtIStgW76-0Qu5rKm-QWbMGHvQ--HnNm-V15yX5MBsAjkYp7P_iWL8LWu0qrWrZBj0yXumi3c8tUg7BTx28xAFxUhev0IDmwvQHxhAZjNa3pvX6mrXQ_DopW4KkeixVIPtOewnmgZiIn6MTaXmuvD3r1SGU0P3itjXVuv7X2hoWu4zB-Qq-wQGI2eaukHTITKclWl3Mbf3EP-2eSpIU68P4tVL9caFs9KCflbaBgwWLyKaiDQXv9wiwzfP84QCkfg

  • 将下载的jar包导入Tomcat的lib目录下(node1和node2均要导入)

  • 修改Tomcat配置文件
vim /usr/local/tomcat/conf/context.xml

node1:

node2: 

  • 重启Tomcat并开启memcached

关闭server1,再写入

打开server1,关闭server2,再写入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值