Nginx+tomcat+memcached
使用nginx作为前端服务器来实现tomcat负载均衡及高可用,同时基于jsp的动态特征,我们将引入memcache来保持网页在连接过程中的session保持,利用memcached把多个tomcat的session集中管理
图解:
说明:
客户端请求时nginx通过负载调度算法将请求调度至某一后端服务器;tomcat 把会话通过组播的方式复制到集群各节点;所有节点共享会话;
当memcached有两个时可以采用交叉存储,可以更好的避免单点故障
说明:
Tomcat-1 (T1) 将 session 存储在 memcached-2 (T2)上。只有当 M2 不可用时,T1 才将 session 存储在 memcached-1 上(M1 是 T1 failoverNode)。使用这种配置的好处是,当 T1 和 M1 同时崩溃时也不会丢失 session 会话,避免单点故障。
tomcat负载均衡
环境:
server6:172.25.24.6 nginx + tomcat + memcache
server2: 172.25.24.2 tomcat + memcache
本篇博客中涉及的所有软件包下载可参考此博客:https://blog.csdn.net/qq657886445/article/details/83662696
Server6:
cd /usr/local/
scp -r apache-tomcat-7.0.37/ 172.25.24.2:/usr/local/
scp -r jdk1.7.0_79/ 172.25.24.2:/usr/local/
scp /etc/profile 172.25.24.2:/etc/
/usr/local/tomcat/bin/startup.sh
vim /usr/local/lnmp/nginx/conf/nginx.conf
http {
upstream tomcat {
#此处不填写算法,默认使用轮叫算法roundrobin
server 172.25.24.6:8080;
server 172.25.24.2:8080;
}
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
nginx -t
nginx -s reload
vim tomcat/webapps/ROOT/test.jsp
Server6 the time is: <%=new java.util.Date() %>
Server2:
source /etc/profile
cd /usr/local/
ln -s jdk1.7.0_79/ java
ln -s apache-tomcat-7.0.37/ tomcat
tomcat/bin/shutdown.sh
vim tomcat/webapps/ROOT/test.jsp
Server2 the time is: <%=new java.util.Date() %>
测试:
访问server6 ip可实现tomcat负载均衡
Session共享
修改server6的nginx配置文件并重新加载nginx
vim /usr/local/lnmp/nginx/conf/nginx.conf
http {
upstream tomcat {
sticky; #nginx 编译时需添加sticky模块
server 172.25.24.6:8080;
server 172.25.24.2:8080;
}
nginx -t
nginx -s reload
Server2与Server6安装并开启memcached修改 tomcat的页面 并修改tomcat配置文件
yum install -y memcached
/etc/init.d/memcached start
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>
vim /usr/local/tomcat/conf/context.xml
在<Context>下面添加
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.24.9:11211,n2:172.25.24.4:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
将以下软件包放在/usr/local/tomcat/lib下
重启tomcat
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
cat /usr/local/tomcat/logs/catalina.out # 查看tomcat日志
有此INFO:提示表示tomcat启动成功,并且为交叉缓存先在n1memcache缓存当n1down掉时才使用n2缓存,本机为n2
测试:
访问server6 ip可实现session会话保持
提交数据,查看日志得是使用server2的tomcat服务,其实是保存在server6的memcache上
查看memcache缓存 ,telnet用yum install -y telnet安装
telnet 172.25.24.2 11211
get 5D24979FFAF5D330AC8495E04E336B43-n1
此时关掉server6的memcache,继续在网页提交数据
可以看见session ID变为n2
在server2上查看memcache缓存,发现在server6的memcache缓存的数据
打开server6的memcache,关闭server2的tomcat,继续在网页提交数据
此时Info提示为server6,memcacheID仍然为n2,并且session保持
查看server2的memcache缓存和server6的tomcat日志