一、 LAMT搭建以及部署应用
1、LAMT部署
(1)、安装Apache
(2)、安装Tomcat
(3)、安装Mysql5.1
(4)、部署jspxcms应用
2、LNMT部署
二、Tomcat简单会话保持集群
1、后端tomcat环境搭建
2、nginx + tomcat cluser
基于IP哈希绑定会话
3、httpd + tomcat集群基于balancer实现
(1)、基于http模块实现会话粘性
(2)、基于ajp模块实现会话粘性
(3)、启用管理接口
三、Tomcat 会话复制集群
1、负载均衡配置
2、启用tomcat会话复制
3、添加<distributable/>元素
四、session会话保持之session服务器
1、集群架构
2、配置tomcat
3、创建测试页面
4、配置前端调度器
5、测试会话保存功能
一、LAMT搭建以及部署应用:
1、LAMT部署
LAMT=Linux Apache(httpd) MySQL Tomcat ,即通过httpd反向代理tomcat向外提供服务;
httpd的代理模块有三种:
proxy_http_module:适配http协议客户端;
proxy_ajp_module:适配ajp协议客户端;
proxy mod_jk :Apache与Tomcat的连接器,需编译,少数旧服务器使用;
根据代理模块不同,主体结构可分为下面三种
Client (http) –> httpd (proxy_http_module)(http) –> tomcat (http connector) –>mysql
Client (http) –> httpd (proxy_ajp_module)(ajp) –> tomcat (ajp connector) –>mysql
Client (http) –> httpd (mod_jk)(ajp) –> tomcat (ajp connector) –>mysql
各种的代理配置如下(proxy mod_jk过于陈旧,本文不做讨论)如为httpd2.2,需去掉Require all granted显示授权配置;
proxy_http_module代理配置示例:
<VirtualHost *:80> ServerName www.jev6.com ProxyRequests Off ProxyVia On ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / http://172.16.250.169:8080/ ProxyPassReverse / http:// 172.16.250.169:8080/ <Location /> Require all granted </Location> </VirtualHost>
proxy_ajp_module代理配置示例:
<VirtualHost *:80> ServerName www.jev6.com ProxyRequests Off ProxyVia On ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / ajp:// 172.16.250.169:8009/ ProxyPassReverse / ajp:// 172.16.250.169:8009/ <Location /> Require all granted </Location> </VirtualHost>
本为于httpd通过ajp模块反向代理tomcat为例:
(1)、安装Apache
[root@jev6 ~]#yum install httpd -y
安装Tomcat:
[root@jev6 ~]# yum install java-1.7.0-openjdk-devel tomcat-lib tomcat-admin-webapps tomcat-webapps -y [root@jev6 ~]#vim /etc/httpd/conf.d/LAMT-ajp.conf
[root@jev6 ~]#service httpd restart
(2)、安装Tomcat
[root@jev6 ~]#tomcat version
[root@jev6 ~]#tomcat start
从浏览器访问http://172.16.250.169,注意:selinux以及iptables策略
到此LAT部署完成;
(3)、安装Mysql5.1
[root@jev6 ~]#yum install mysql-server -y [root@jev6 ~]#service mysqld start
授权jspxcms用户使用权限:
[root@jev6 ~]#mysql mysql> grant all privileges on jspxcms.* to 'jspxcms'@'%' identified by 'jspxcmspass';
(4)、部署jspxcms应用
创建应用安装目录/var/lib/tomcat/webapps/jspxcms/(也可以直接使用webapps下的ROOT/,此时注意清空自带的ROOT/下的文件)
下载jspxcms(http://www.jspxcms.com)
解压后将解压后的ROOT目录里面的文件拷贝到/var/lib/tomcat/webapps/jspxcms/下
[root@jev6 ~]#wget http://www.jspxcms.com/info_download.jspx?id=239 [root@jev6 ~]#mv info_download.jspx\?id\=239 jspxcms-7.0.1-release.zip [root@jev6 ~]#unzip jspxcms-7.0.1-release.zip [root@jev6 ~]#mv ROOT/* /var/lib/tomcat/webapps/jspxcms/
在server.xml的host组件里面加入虚拟主机配置<Context path="/jspxcms" docBase="jspxcms" reloadable="true" />;
[root@jev6 ~]#vim /etc/tomcat/server.xml
重启tomcat:
[root@jev6 ~]#service tomcat restart
在浏览器打开http://172.16.250.169/jspxcms/(如果应用部署在默认的ROOT下,直接输入IP即可如:http://172.16.250.169)
重启tomcat:
[root@jev6 ~]#service tomcat restart
从浏览器打开http://172.16.250.169/jspxcms/测试
到此LAMT部署jspxcms到此成功;
【如果出现404报错】:
[root@jev6 ~]#vim /etc/tomcat/web.xml
将/etc/tomcat/web.xml 112行左右<init-param> 中<param-value>ture</param-value>的fslse改为ture;
[root@jev6 ~]#service tomcat restart
2、LNMT部署
LNMT即Linux Nginx MySQL Tomcat,只需要将LAMT的httpd关闭替换为Nginx即可,其他配置依然保存不变,具体如下;
[root@jev6 ~]#httpd -k stop [root@jev6 ~]#yum install nginx -y
在default.conf的server里面加入代理配置:
location / { proxy_pass http://172.16.250.169:8080; }
[root@jev6 ~]#vim /etc/nginx/conf.d/default.conf
在浏览器打开http://172.16.250.169/jspxcms/
注:
如果需要动静分离,只需要修改location配置:
location ~* \.(jsp|do)$ { proxy_pass http://172.16.250.169:8080; }
需要后端程序设计时将动静态内容分开存储;
二、Tomcat简单会话保持集群
本文主要通过httpd(或nginx)负载均衡到后端tomcat服务器,并实现会话粘性;
两个tomcat节点:172.16.250.121(tomcatA.jev1.com),172.16.250.122(tomcatB.jev2.com)
一个负载均衡节点:172.16.250.169
主体架构:Clients–>172.16.250.169–>(tomcatA, tomcatB)
1、后端tomcat环境搭建
注意:centos6只对java1.7的兼容性较好
【安装java虚拟机以及tomcat】:
[root@jev-1 ~]# yum install java-1.7.0-openjdk-devel tomcat-lib tomcat-admin-webapps tomcat-webapps -y [root@jev-1 ~]# mkdir -pv /var/lib/tomcat/webapps/test/{WEB-INF,lib,classes} [root@jev-1 ~]# vim /var/lib/tomcat/webapps/test/index.jsp [root@jev-1 ~]# tomcat start
TomcatB的软件布置操作同上;
【创建测试页】:
在TomcatA上某context中(如/test),提供如下页面
<%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA.jev.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("jev.com","jev.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
【浏览器访问测试】
在浏览器打开172.16.250.121:8080/test/index.jsp测试【注意Chrome浏览器的本地缓存机制,建议使用其他浏览器】
在TomcatB上某context中(如/test),提供如下页面
<%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="blue">TomcatB.jev.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("jev.com","jev.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
2、nginx + tomcat cluser
前端通过nginx负载均衡到后端tomcat集群,并通过IP绑定的方式实现会话粘性;
【安装nginx】
[root@jev6 ~]#yum install nginx
【nginx负载均衡配置】
[root@jev6 ~]#vim /etc/nginx/nginx.conf
在http上下文加入upstream负载均衡配置
upstream tcsrvs { server 172.16.250.121:8080 server 172.16.250.122:8080 }
[root@jev6 ~]#vim /etc/nginx/conf.d/default.conf
在localtion中加入proxy_pass http://tcsrvs/;
[root@jev6 ~]#nginx -t
[root@jev6 ~]#nginx -s reload
【浏览器访问测试】
在浏览器打开172.16.250.169/test/index.jsp不断刷新测试,可以看到已经负载均衡,但无法绑定会话;
【基于IP哈希绑定会话】
[root@jev6 ~]#vim /etc/nginx/nginx.conf
在upstream tcsrvs加入ip_hash;
[root@jev6 ~]#service nginx restart
在浏览器打开172.16.250.169/test/index.jsp不断刷新测试,可以看到已经实现会话绑定;
[root@jev6 ~]#service nginx stop
3、httpd + tomcat集群基于balancer实现
【安装httpd】
[root@jev6 ~]#yum install httpd
【确认balancer模块正常加载】
[root@jev6 ~]#httpd -M | grep proxy_balancer_module proxy_balancer_module (shared) [root@jev6 ~]#httpd -v Server version: Apache/2.2.15 (Unix)
(1)、基于http模块实现会话粘性
【负载均衡配置】
基于http模块反向代理的负载均衡配置如下
<proxy balancer://tcsrvs> BalancerMember http://172.16.250.121:8080 BalancerMember http://172.16.250.122:8080 ProxySet lbmethod=byrequests </Proxy> <VirtualHost *:80> ServerName lb.jev.com ProxyVia On ProxyRequests Off ProxyPreserveHost On # <Proxy *> # Require all granted # </Proxy> ProxyPass / balancer://tcsrvs/ ProxyPassReverse / balancer://tcsrvs/ # <Location /> # Require all granted # </Location> </VirtualHost> ###如果httpd版本为2.4,需将上面的6行注释行全部掉,启用授权###
[root@jev6 ~]#vim /etc/httpd/conf.d/tomcat_http.conf
[root@jev6 ~]#service httpd start
通过浏览器访问http://172.16.250.169/test/index.jsp,不断刷新,测试是否正常调度;
【基于route标签实现会话粘性】:
TomcatA:在Engine标签里面(在105行附近)加入jvmRoute="TomcatA"
[root@jev-1 ~]#vim /etc/tomcat/server.xml
[root@jev-1 ~]#service tomcat restart
TomcatB:在Engine标签里面(在105行附近)加入jvmRoute="TomcatB"
[root@jev-2 ~]#vim /etc/tomcat/server.xml
[root@jev-2 ~]#service tomcat restart
在前端httpd配置加入基于route标签粘性配置(下图红色框内部分):
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED <proxy balancer://tcsrvs> BalancerMember http://172.18.100.67:8080 route=TomcatA BalancerMember http://172.18.100.68:8080 route=TomcatB ProxySet lbmethod=byrequests ProxySet stickysession=ROUTEID </Proxy>
[root@jev6 ~]#vim /etc/httpd/conf.d/tomcat_http.conf
重启httpd
[root@jev6 ~]#service httpd restart
【打开浏览器测试】
(2)、基于ajp模块实现会话粘性:
【负载均衡配置】
基于jap模块反向代理的负载均衡配置如下:
<proxy balancer://tcsrvs> BalancerMember ajp://172.18.100.67:8009 BalancerMember ajp://172.18.100.68:8009 ProxySet lbmethod=byrequests </Proxy> <VirtualHost *:80> ServerName lb.jev.com ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / balancer://tcsrvs/ ProxyPassReverse / balancer://tcsrvs/ <Location /> Require all granted </Location> <Location /balancer-manager> SetHandler balancer-manager ProxyPass ! Require all granted </Location> </VirtualHost>
将上部分试验的配置文件tomcat_http.conf备份,将http协议改为ajp,端口改为8009,删除route标签,暂时注释掉通过Cookie保存会话的配置:
[root@jev6 ~]#cp /etc/httpd/conf.d/tomcat_http.conf{,.bak} [root@jev6 ~]#mv /etc/httpd/conf.d/tomcat_http.conf /etc/httpd/conf.d/tomcat_ajp.conf
[root@jev6 ~]#vim /etc/httpd/conf.d/tomcat_ajp.conf
通过浏览器访问http://172.16.250.169/test/index.jsp,不断刷新,测试是否正常调度;
注意:如果http版本为2.4,需将注释掉的<Proxy>和<Location>组件启用;
【基于route标签实现会话粘性】:
恢复刚刚删除以及注释掉的配置,修改后如下图:
到此httpd + tomcat cluster 基于ajp实现完成。
在浏览器打开172.16.250.169/test/index.jsp不断刷新测试,可以看到已经实现会话绑定;
(3)、启用管理接口:
httpd自带有balancer-managerGUI管理接口,可以通过图形界面对后端主机进行监控;
接口启用配置如下:
<Location /balancer-manager> SetHandler balancer-manager ProxyPass ! # Require all granted </Location> ###如果httpd版本为2.4,需将去掉"Require all granted"前面的注释(显式授权)###
[root@jev6 ~]#vim /etc/httpd/conf.d/balancer-manager.conf
在浏览器输入http://172.16.250.169/balancer-manager打开管理界面
[root@jev-1 ~]#service tomcat stop
暂停tomcatA服务,可以看到家tomcatA状态从Ok转为Err:
选中"Worker URL"栏的URL,可以对后端主机进行负载均衡配置及控制;
三、Tomcat 会话复制集群
1、负载均衡配置
前端负载均衡可以参考(二、2)或(二、3)中的负载均衡配置;
2、启用tomcat会话复制
确保server.xml配置文件Engine的jvmRoute属性配置正确,将下列配置放置于<engine>或<host>中,注意各节点配置不同(截图中黄色边框内部分)。
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.250.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
【配置tomcatA节点】
[root@jev-1 ~]#vim /etc/tomcat/server.xml
【配置tomcatA节点】
[root@jev-2 ~]#vim /etc/tomcat/server.xml
3、添加<distributable/>元素
拷贝tomcat自带模板到Webapp的WEB-INF/下面:
[root@jev-1 ~]#cp /etc/tomcat/web.xml /var/lib/tomcat/webapps/test/WEB-INF/web.xml
编辑WEB-INF/web.xml,添加<distributable/>元素;
[root@jev-1 ~]#vim /var/lib/tomcat/webapps/test/WEB-INF/web.xml
tomcatB配置同tomcatA;
[root@jev-1 ~]#scp /var/lib/tomcat/webapps/test/WEB-INF/web.xml 172.16.250.122://var/lib/tomcat/webapps/test/WEB-INF/web.xml
在局域网内任意的主机上抓包(本处我选择在centos7上),可以看到两台主机在互相通告:
~]#tcpdump -i eno16777736 -nn port 45564
【测试】
打开浏览器测试,不断刷新,可以发现已经实现会话粘性:
四、session会话保持之session服务器
【Memcached】是一款分布式的内存对象缓存系统,用于减少数据库的负载,加快web应用程序的访问. Memcached简单并且强大,其简单的设计加快了部署,易于开发,缓存解决了面临的大量数据时很多的问题;
【MSM(memcached session manager)】是一款实现Tomcat话保持的管理组件,支持粘性和无粘性的配置, 目前可以在Tomcat6,7,8中使用,并且支持Memcached会话故障转移;
注:本想在centos6.8上实现session会话保持之session服务器,但由于调试了几次,还是实现不了会话粘性,故转移到centos7上做,一次成功,下文调试系统为centos7。centos6.8等日后实现后再补充;
1、集群架构
两个tomcat节点:172.16.250.131(tomcatA.jev.com),172.16.250.132(tomcatB.jev.com)
两个memcache节点(tomcat节点兼):172.16.250.131(n1),172.16.250.132(n2)
一个负载均衡节点:172.16.250.169 (centos6.8)
主体架构:Clients–>172.16.250.169(httpd)–>(tomcatA, tomcatB)–> (n1<–> n2)
各软件版本:
Memcached version "1.4.15", Java(Oracle) version "1.7.0_91",Tomcat version "7.0.54",Httpd version " 2.2.15"
软件环境布置(以节点1为例,节点2于1系统):
[root@jev71 ~]#yum install memcache java-1.7.0-openjdk-devel tomcat-lib tomcat-admin-webapps tomcat-webapps -y
[root@jev71 ~]#systemctl start memcached
[root@jev71 ~]#systemctl start tomcat
2、配置tomcat
memcached-session-manager
项目地址:https://github.com/magro/memcached-session-manager
下载地址:http://repo1.maven.org/maven2/de/javakaffee/msm/
将memcached-session-manager jar添加到tomcat
下载如下jar文件至各tomcat节点的tomcat安装目录下的lib(/usr/share/tomcat/lib)目录中,其中的${version}要换成你所需要的版本号,tc${6,7,8}要换成与tomcat版本相同的版本号。
memcached-session-manager-${version}.jar
memcached-session-manager-tc${6,7,8}-${version}.jar
spymemcached-${version}.jar
msm-javolution-serializer-${version}.jar
javolution-${version}.jar
注意:memcached-session-manager-tc7- $ {version} .jar要求tomcat 7.0.23+
本文以msm-1.8.1为例,各jar版本信息如下:
memcached-session-manager-1.8.1.jar
memcached-session-manager-tc7-1.8.1.jar
spymemcached-2.10.2.jar
msm-javolution-serializer-1.8.1.jar
javolution-5.4.3.1.jar
分别在两个tomcat上的host上定义一个用于测试的context容器(两节点配置一样),并在其中创建一个会话管理器,如下所示:
<Context path="/test" docBase="test" reloadable="true"> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.16.250.131:11211,n2:172.16.250.132:11211" failoverNodes="n2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" /> </Context>
[root@jev71 ~]#vim /etc/tomcat/server.xml
[root@jev71 ~]#systemctl restart tomcat
TomcatB配置同上;
3、创建测试页面
【tomcatA】的context提供测试页面:
[root@jev71 ~]#mkdir -pv /var/lib/tomcat/webapps/test/WEB-INF/{classes,lib} [root@jev71 ~]#vim /usr/local/tomcat/webapps/test/index.jsp
添加如下内容:
<%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA.jev.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("jev.com","jev.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
从浏览器打开http://172.16.250.131:8080/test/index.jsp效果如下:
【tomcatB】的context提供测试页面:
[root@jev72 ~]#mkdir -pv /var/lib/tomcat/webapps/test/WEB-INF/{classes,lib} [root@jev72 ~]#vim /usr/local/tomcat/webapps/test/index.jsp
添加如下内容:
<%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="blue">TomcatB.jev.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("jev.com","jev.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
从浏览器打开http://172.16.250.131:8080/test/index.jsp效果如下:
4、配置前端调度器:
注:本章节使用httpd为前端调度器,也可以使用其他调度器;
[root@jev6 ~]#yum install httpd
在172.16.250.169上配置反向代理的负载均衡内容,类似如下所示:
<Proxy balancer://tcsrvs> BalancerMember http://172.16.250.121:8080 loadfactor=1 BalancerMember http://172.16.250.122:8080 loadfactor=1 ProxySet lbmethod=byrequests </Proxy> ProxyVia Off ProxyRequests Off ProxyPass / balancer://tcsrvs/ ProxyPassReverse / balancer://tcsrvs/ <Proxy *> Order Allow,Deny Allow From all </Proxy> <Location /> Order Allow,Deny Allow From all </Location>
[root@jev6 ~]#vim /etc/httpd/conf.d/tomcat_msm.conf
[root@jev6 ~]#service httpd start
5、测试会话保存功能
在浏览器中访问http://172.16.100.6/test,不断刷新,结果如下所示,其session ID在负载均衡环境中保持不变。
从测试结果可以看出,现在启用会话共享服务的memcache节点为n1,此时将n1节点的memcache关闭;
[root@jev71 ~]#systemctl stop memcached
不断刷新,结果如下所示。
此时,其session ID在负载均衡环境中保持不变,只是提供memcache服务的节点转为n2;
实现了基于memcache的会话保持集群;
【本文完】
原创文章,作者:Jev Tse,如若转载,请注明出处:http://www.178linux.com/68388