Openresty+Tomcat+Memcache实现负载均衡,粘性session架构与交叉存取

tomcat安装

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器
下载
注意下载.tar.gz不要下载src
tomcat运行需要jdk环境
可以通过yum安装也可以去oracle官网下载rpm格式的安装包

[root@server2 pkgs]# yum install ./jdk-8u181-linux-x64.rpm -y
[root@server2 pkgs]# tar xzf apache-tomcat-7.0.37.tar.gz -C /usr/local/
[root@server2 pkgs]# ln -s /usr/local/apache-tomcat-7.0.37 /usr/local/tomcat  ##软链接方便升级

启动tomcat
在这里插入图片描述

使用nginx实现tomcat负载均衡

实验环境:
server1: openresty
server2:tomcat serve3:tomcat
编辑/usr/local/openresty/nginx/conf/nginx.conf

http {
........
 upstream tomcat {
    server 172.25.254.102:8080;
    server 172.25.254.103:8080;
    }
........
server {
	location ~\.jsp$ {
        	proxy_pass http://tomcat;
        	}
}
........
}

在这里插入图片描述

session保持

在tomcat/webapp/ROOT下建立一个test.jsp测试页面

[root@server2 tomcat]# cat webapps/ROOT/test.jsp 
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>

访问测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题:虽然轮循算法实现了负载均衡 但不能保持用户会话
当用户和服务器建立链接后 应该保证会话存活直到用户离开
解决方法:
1 使用ip_hash 算法
ip_hash是利用访问ip来分配服务,虽然保证了会话的持续,但网络中不能有代理,或者CDN网络
2 根据cookie辨别用户身份来进行session跟踪,服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发布者,
注意:cookie需要浏览器支持,且有时候会泄露数据

sticky

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

什么是cookie

在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据( cookie )给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把.上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小的数据

什么是session

session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。

Sticky工作原理

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

编译nginx-sticky-module

下载
下载后解压并重命名(原名称太长)
在这里插入图片描述
重新编译nginx 这里使用的openresty 也是封装了nginx
在这里插入图片描述
在这里插入图片描述
gmake如果出错 进入sticky模块的目录编辑ngx_http_sticky_misc.c添加两行
在这里插入图片描述
将原有的nginx拷贝为nginx.old 把新的nginx覆盖到原来的目录
在这里插入图片描述

使用sticky

只需要在原有的upstream块加入sticky
在这里插入图片描述
效果
在这里插入图片描述
路由码
在这里插入图片描述

memcache和session交叉存取

新的问题
假如后台服务器tomcat挂了,用户的session 也会丢失,在用户看来就是正在访问页面,突然网页丢失

解决方法 使用memcache来存储session 并且交叉存取 可以更好的避免单点故障
在这里插入图片描述

实现步骤
  • 1 在两台tomcat server上安装memcached
yum install memcached -y
[root@server2 jar]# ls
asm-3.2.jar                memcached-session-manager-1.6.3.jar      minlog-1.2.jar             spymemcached-2.7.3.jar
kryo-1.04.jar              memcached-session-manager-tc6-1.6.3.jar  msm-kryo-serializer-1.6.3.jar
kryo-serializers-0.10.jar  memcached-session-manager-tc7-1.6.3.jar  reflectasm-1.01.jar
[root@server2 jar] cp * /usr/local/tomcat/lib/
  • 3 修改 /usr/local/tomcat/conf/context.xml
[root@server2 tomcat]# cat conf/context.xml    
<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- The contents of this file will be loaded for each web application -->
<Context>

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:172.25.254.102:11211,n2:172.25.254.103:11211" ## 这里填写ip
        failoverNodes="n1" ##默认查询n2 如果故障查询n1
            requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
                transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
                    />
</Context>
效果

在这里插入图片描述
此时调度到的server是103 tomcat 使用的n1 存储
把 n1 memcached挂掉
在这里插入图片描述
此时访问本地存储
在这里插入图片描述
此时将server3 tomcat挂掉
在这里插入图片描述
在这里插入图片描述
在将n2存储挂掉
在这里插入图片描述
仍然能保存session 是在server2tomcat 本身内存上
在这里插入图片描述
总结: 只要tomcat server不全挂掉就还能实现session保持

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值