Table of Contents
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
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,来使同一个客户端的请求落在同一台服务器上
- 客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器
- 后端服务器处理完请求,将响应数据返回给nginx
- 此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值
- 客户端接收请求,并保存带route的cookie
- 当客户端下一次发送请求时,会带上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/
- 将下载的jar包导入Tomcat的lib目录下(node1和node2均要导入)
- 修改Tomcat配置文件
vim /usr/local/tomcat/conf/context.xml
node1:
node2:
- 重启Tomcat并开启memcached
关闭server1,再写入
打开server1,关闭server2,再写入