nginx + tomcat + memcache负载均衡集群搭建

  • Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器
    本文讲述的是简单的 nginx+tomcat+memcache 实现的负载均衡和session共享
    其中用memcache来存储session,tomcat作为servlet容器,nginx作为tomcat代理,对外接口。这个时候只要保证memcache服务器不停,tomcat之间可以任意热插拔。实现了session的独立存储,需要的话,还可以存储到数据库或者文件中,也不用考虑是否使用黏性session

1. 首先进行jdk,java环境的安装

获取 jdk 的安装包,安装到 /usr/local/
并进行软链接
这里写图片描述
进行环境变量的修改

 vim /etc/profile
 编辑内容如下:
 export JAVA_HOME=/usr/local/java
 export CLASSPATH=.:$JAVA_HOME/LIB:$JAVA_HOME/jre/lib
 export PATH=$PATH:$JAVA_HOME/bin

这里写图片描述
这里写图片描述

2. 进行tomcat的安装

获取 tomcat的安装包,安装到 /usr/local/

并进行软链接
这里写图片描述
软链接
这里写图片描述

启动tomcat

tomcat的启动脚本在其家目录下的/bin中
这里写图片描述
在浏览器进行测试
这里写图片描述

在另一个tomcat主机进行相同操作

分别在两个tomcat服务器编辑测试文件

server1:
这里写图片描述
server2:
这里写图片描述
在浏览器进行测试:
这里写图片描述
这里写图片描述

3. 通过nginx进行tomcat负载均衡

通过nginx进行tomcat服务器简单的负载均衡,以两个tomcat节点为例,sticky模块的负载均衡

  • sticky 英文原意为粘滞的
    nginx提供请求反向代理以及负载均衡,一个插件nginx sticky用于将用户的请求发到同一台服务器上,也就使得同一用户的一个浏览器登陆状态能与同一个服务器保持交互。
    在大中型企业中,一个应用会布置在好几个主机,如,40.40.42.42-40.40.42.44,这三台主机上布置着同一个taobao.war的应用,每台主机有2个实例,instance1,instance2。
    现在用户a通过浏览器,登陆到www.taobao.com/index.jsp,第一次登陆,用户上传一个空的cookie,nginx会将请求分配到三台主机中的一台,比如就是40.40.42.42上,42.42主机服务器处理http请求,服务器返回响应头以及响应内容,nginx生成有route的cookie,此route对应一个服务器,浏览器保存cookie,此时浏览器中拥有一个route,此route对应着42.42主机,之后的每次请求都会带上这个cookie,nginx在识别出cookie中带有的route之后,将此次请求带有此route的请求,会被nginx分配到42.42主机上去处理,这就可以使得session保持。
    关于在大型秒杀类活动中,出现提示重新登录的提示框。出现这种现象就是因为,你的session在服务器上失去响应,当出现大并发量的时候,服务器负载会出现临界值,出现宕机的时候就是session失去响应的时候。
    nginx sticky的工作机制就是依靠cookie实现负载均衡,一个浏览器中的route对应一个服务器。
    以上解释来源于https://blog.csdn.net/zhj574182446/article/details/53606046

nginx服务器在 server10上
编辑nginx配置文件:

 vim /usr/local/lnmp/nginx/conf/nginx.conf
 http {
        upstream tomcat {
        server 172.25.21.1:8080;    # 添加服务器
        server 172.25.21.10:8080;
        }
 ........省略........        
        location ~ \.jsp$ {   # 识别.jsp
           proxy_pass   http://tomcat;  # 与上文tomcat 对应

这里写图片描述
这里写图片描述
编辑完配置文件,进行重新加载,服务(nginx服务需要启动)
这里写图片描述
在客户端进行负载均衡测试
这里写图片描述
这里写图片描述

修改测试文件(test.jsp)

编辑测试文件,此测试文件.jsp简单测试文件,可进行简单的信息录入,进行简单的session

  • Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。有关使用 Session 对象的详细信息,请参阅“ASP 应用程序”部分的“管理会话”。注意 会话状态仅在支持 cookie 的浏览器中保留。
  • Session复制共享:可以用Tomcat自带的插件进行Session同步,使得多台应用服务器之间自动同步Session,保持一致。如果一台发生故障,负载均衡会遍历寻找可用节点,Session也不会丢失。缺点:必须是Tomcat和Tomcat之间,Session的复制也会消耗系统 的性能,使得同步给成员时容易造成内网流量瓶颈。
 vim /usr/local/tomcat/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> 

在浏览器进行测试,刷新浏览器,进行浏览
这里写图片描述
这里写图片描述
这里写图片描述
进行默认轮询,但不符合我们生产环境的需求

假设我们在向网页中写入信息,但是刷新以后,信息就消失,因为已经建立的新的链接,这样明显是不合适的,我们可以通过为nginx添加sticky 模块进行解决此问题

编辑nginx 配置文件
添加sticky模块

  vim /usr/local/lnmp/nginx/conf/nginx.conf
  http {
         upstream tomcat {
         sticky;       # 添加sticky 模块
         server 172.25.21.1:8080;    # 添加服务器
         server 172.25.21.10:8080;
         }

进行测试,向浏览器中添加会话,因为sticky模式,不会nginx重新请求服务器,使session的以保存,但是,若是此session所在服务器宕机,则会使用户信息流逝,造成损失,这就是我们后面要提到的高可用了

session示例:
这里写图片描述
这里写图片描述

4. 进行高可用

运用两个tomcat节点进行写入服务,可能出现单机故障,这样就会造成信息的损失,我们可以通过对其进行交叉写入的方式,来解决这一问题,当节点一写入信息时候,向node2中写入,反之节点二写入信息时,向节点一中写入,若是任一节点宕机,所有信息将会写入到另一存活节点上,保持session的同步。如下图:
这里写图片描述
我们可以结合memcahce来进行tomcat高可用负载均衡

为两个tomcat 服务器进行 memcaced 的安装

这里写图片描述

编辑 tomcat 配置文件

编辑之前关闭tomcat服务

 [root@server10 ~]# vim /usr/local/tomcat/conf/context.xml
 添加如下内容:
 <Manager    className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
 memcachedNodes="n1:172.25.21.10:11211,n2:172.25.21.1:11211"
 # memcached 的节点及对应IP
 failoverNodes="n1"   # server10 上为 n1,对应写入节点
 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo. KryoTranscoderFactory"
 />

server10:
这里写图片描述

server1 写入如下:
这里写图片描述
编辑完成后,启动tomcat服务,并启动memcached

 /usr/local/tomcat/bin/startup.sh # 启动tomcat
 /etc/init.d/memcached start # 启动memcached
 tail -f /usr/local/tomcat/logs/catalina.out
 监控tomcat的日志情况

然后查看年tomcat日志
server10:
这里写图片描述
server1:
这里写图片描述
若是如上述情况,则表示tomcat 启动成功
进行高可用测试
在n1节点进行写入
这里写图片描述
人工宕掉n1节点(关闭nq所在节点上的tomcat)
继续进行会话,发现会话保持,信息为消失
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Buster_ZR/article/details/81477249