您的位置:首页 > 数据库 > Memcache

nginx+tomcat+memcache实现负载均衡

2019-04-30 07:02 1936 查看

实验环境

redhat6.5
iptables和selinux关闭
Server5:172.25.35.55:tomcat1,nginx,memcached
Server1:172.25.35.51:tomcat2,memcached

Tomcat1(T1)将session存储在 memcached2 (T2)上。只有当 M2不可用时,T1才将 session 存储在 memcached1 上(M1是T1 failoverNode)。使用这种配置的好处是,当T1和M1同时崩溃时也不会丢失 session会话,避免单点故障。

在T1、T2都需要实施

server5:
[root@server5 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local
[root@server5 ~]# ln -s /usr/local/jdk1.7.0_79/ /usr/local/jdk
[root@server5 ~]# vim /etc/profile

79 export JAVA_HOME=/usr/local/jdk
80 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
81 export PATH=$PATH:$JAVA_HOME/bin   //$PATH系统原变量
[root@server5 ~]# source /etc/profile
测试java:
[root@server5 ~]# which java
/usr/local/jdk/bin/java
[root@server5 ~]# which javac
/usr/local/jdk/bin/javac
[root@server5 ~]# vim test.java
public class test
{
public static void main(String[] args)
{
System.out.println("hello world");
}
}
[root@server5 ~]# javac test.java
[root@server5 ~]# java test
hello world

安装tomcat:
[root@server5 ~]# tar zxf apache-tomcat-7.0.37.tar.gz
[root@server5 ~]# mv apache-tomcat-7.0.37 /usr/local/tomcat
[root@server5 ~]# cd /usr/local/tomcat/apache-tomcat-7.0.37
[root@server5 apache-tomcat-7.0.37]# mv * ..
[root@server5 apache-tomcat-7.0.37]# cd
[root@server5 ~]# mv jar /usr/local/tomcat/lib/
[root@server5 ~]# cd /usr/local/tomcat/lib/jar
[root@server5 jar]# mv * ..
[root@server5 jar]# cd ..
[root@server5 lib]# ls  //查看含有如下文件
asm-3.2.jar                  memcached-session-manager-tc7-1.6.3.jar
kryo-1.04.jar
minlog-1.2.jar
kryo-serializers-0.10.jar
msm-kryo-serializer-1.6.3.jar
memcached-session-manager-1.6.3.jar
reflectasm-1.01.jar
spymemcached-2.7.3.jar
[root@server5 lib]# vim /usr/local/tomcat/conf/context.xml
......
34 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
35         memcachedNodes="n1:172.25.35.55:11211,n2:172.25.35.51:11211"
36         failoverNodes="n1"  //在TB上此项设置为“n2”
37         requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
38         transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTransco    derFactory"
39 />
......

[root@server5 lib]# /usr/local/tomcat/bin/startup.sh  //开启tomcat

浏览器测试服务是否开启:

安装memcached:
[root@server5 ~]# yum install memcached -y
[root@server5 ~]# /etc/init.d/memcached start  //开启memcached服务

仅在T1上实施

安装nginx,源码安装具体步骤见:https://blog.csdn.net/Ying_smile/article/details/81835216

[root@server5 ~]# nginx  //开启nginx
[root@server5 ~]# cd /usr/local/lnmp/nginx/conf/
[root@server5 conf]# vim nginx.conf
2 user nginx nginx;
3 worker_processes  1;
12 events {
13     worker_connections  1024;
17 http {
18     include       mime.types;
19     default_type  application/octet-stream;
20         upstream tomcat{
21                 sticky;
22                 server 172.25.35.51:8080;
23                 server 172.25.35.55:8080;
24         }
32     sendfile        on;
33     tcp_nopush     on;
36     keepalive_timeout  65;
37
38     gzip  on;
39
40     server {
41         listen       80;
42         server_name  tomcat;
48         location / {
49             root   html;
50             index  index.html index.htm;
51         }
57         error_page   500 502 503 504  /50x.html;
58         location = /50x.html {
59             root   html;
60         }
61         location ~ \.jsp$ {
62                 proxy_pass http://tomcat;
63         }
// nginx-sticky-module 为 nginx 的第三方模块,使 nginx 支持 sticky 模式,所谓 sticky 模式就是指同一个用户的访问请求都被发送到同一个 tomcat 实例上处理。
[root@server5 ~]# nginx -t

浏览器测试nginx服务:

测试:

静态测试:
[root@server5 ~]# cd /usr/local/tomcat/webapps/ROOT/
[root@server5 ROOT]# vim ying.jsp
The time is:<%=new java.util.Date() %>

浏览器测试:

动态测试:
[root@server5 ROOT]# vim test.jsp  //TA和TB都添加
<%@ 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>

测试:
[root@server1 ~]# cd /usr/local/tomcat/logs
[root@server1 logs]# cat catalina.out  //查看日志显示session加载好了
INFO: MemcachedSessionService finished initialization, sticky true, operation timeout 1000, with node ids [n1] and failover node ids [n2]

添加用户和密码:

[root@server5 ~]# telnet localhost 11211  //T1使用的是m2
Trying ::1...
Connected to localhost.
Escape character is '^]'.
get DAC28915B8B11762E8F12F384D7CBF81-n1
VALUE DAC28915B8B11762E8F12F384D7CBF81-n1 2048 127
We"�
e#01e#-�e#-�#DAC28915B8B11762E8F12F384D7CBF81-n1yingyinguseruseruser1user1
END
quit
Connection closed by foreign host.
[root@server1 ~]# /usr/local/tomcat/bin/shutdown.sh
//关掉TA的tomcat,浏览器刷新可以访问到TB并且用户存在,但memcached并没有切换

[root@server5 ROOT]# /etc/init.d/memcached stop
//关掉T2的m2,T2就会使用m1,添加新的用户

[root@server1 ROOT]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
get DAC28915B8B11762E8F12F384D7CBF81-n2
VALUE DAC28915B8B11762E8F12F384D7CBF81-n2 2048 149
We"�
e1�01e4i�e4i�#DAC28915B8B11762E8F12F384D7CBF81-n2aaaaaayingyinguseruserhahahahauser1user1
END
quit
Connection closed by foreign host.
##把T2打开后工作的还是T1,不会调换
说明:down掉当前正在响应的 tomcat实例,nginx会自动把用户的请求调度到另一个tomcat实例上,同时session 也没有丢掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: