Nginx+Redis+tomcat实现服务器集群和session共享
- 概念:
- 概念:反向代理web服务器,作⽤于服务器,管理多个服务器。
- 多进程,多个⼯作进程,⼀个主进程。
- ⽬的:单节点故障,实现负载均衡,load balance,⾮阻塞,解决⼤客户量并发请求问题。
- 代理:
- 正向代理:作⽤于客户端。
- 反向代理:作⽤在服务器端,客户端不知道反向代理服务器的存在。
- 单节点故障:
- ⼤并发请求下,服务器只有⼀个,如果服务器挂掉,单节点发⽣故障,整个就不能正常运⾏了。
- 解决⽅案:配置服务器集群。使⽤ nginx ,通过ip 管理多个 tomcat服务器。
模拟伪集群
-
解压两个tomcat,在serve.xml⽂件配置两套不同的端⼝,8080,8005,8009。
-
修改Nginx的nginx.conf配置⽂件,实现负载均衡。
- 服务器集群配置
- nginx不能处理jsp⻚⾯,交由tomcat处理。
- 代码参考:
#服务器集群配置 upstream jeffrey.com{ server 127.0.0.1:18080 weight=1; #服务器配置,weight是权重,权重越⼤,分配的概率越⼤。 server 127.0.0.1:28080 weight=2; } #当前的nginx配置 server { listen 80;#侦听端⼝号 server_name localhost; #当前服务的域名.如果是localhost:8080的请求,则交给jeffrey.com的集群来处理。 location / { proxy_pass http://jeffrey.com ; #与服务器集群的名称⼀致 proxy_redirect default; } location = /50x.html { root html; } }
-
关闭nginx :
- nginx -s stop
- nginx -s quit
-
这里出现一个新的问题
- ⼀个服务器挂掉后,nginx不会⽴刻判断其死亡,⽽是等待,但是死掉的服务器⾥的信息怎么办?
- ⼀个应⽤通常有多个服务器,登录成功后,session只会在⼀台存储,想要多台服务器都识别到这个session,后端统⼀存储。
- 所以,集群产⽣的新问题:session共享。
-
解决session共享
- session复制
- 后端统⼀存储,后端统⼀找⼀个中间件将Session存起来即可,这个中间件是数据库redis或者缓存。此时,tomcat作为客户端,redis作为服务端。
- 不要使⽤session。
-
redis实现session共享
-
改写tomcat底层
-
三个session的jar包复制到tomcat下的lib中,commons-pool2-2.2.jar,jedis-2.5.2.jar,tomcat-redissession-manager-2.0.0.jar。
-
安装redis server
-
tomcat修改conf/context.xml,新增
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="localhost" port="6379" database="0" maxInactiveInterval="60" />
- 启动redis-server.exe
//启动 redis-server redis.windows.conf //关闭 shutdown
- 启动tomcat,启动nginx;
-
nginx,tomcat,redis集群中。redis处理了两件事情,session共享,缓存。
- 缓存的问题,缓存穿透和击穿。
-
缓存处理流程:
- 前台请求,后台先从缓存中取数据,取到直接返回结果。
- 取不到时从数据库中取,数据库取到更新缓存,并返回结果。
- 数据库也没取到,那直接返回空结果。
网友评论