Tomcat LB cluster实战详解

新博客网站1

新博客网站2

一,会话保持

1.session sticky source ip,cookie
2.session cluster 利用多播集群内互相传递session
3.session server 高性能的kv server memcached,redis 使用redis

二,准备环境

1.准备3台contos7的虚拟机 分别为node[1-3],node[1-2]提供Tomcat服务,node3提供集群调度
2.关闭防火和selinux
3.同步时钟
4.配置好java环境
5.在node[1-2]部署好tomcat

三,配置集群

1.在node1和node2的tomcat的server.xml中添加一个Host


       
       
     

2.为node1,node2提供不同的应用
3.在node3上安装并配置nginx

#nginx安装不说了
#配置文件
在http配置段中添加,最好在server段的上方添加
upstream tcsrvs {
        server www.node1.com:8080;
        server www.node2.com:8080;
        }
location ~*\.(jsp|do)$ {
                proxy_pass http://tcsrvs;
        }

在server段中修改location,指明只有jsp,do等后端内容时才代理到upstream server
启动nginx,测试即可

四,会话绑定

在upstream中加入ip_hash;即可
upstream tcsrvs {
        ip_hash;
        server www.node1.com:8080;
        server www.node2.com:8080;
        }

PS:LNAMT nginx做负载均衡器,在每台tomcat上配置httpd反向代理用户请求

五,使用httpd做负载均衡器

1.方案一

(1)apache: mod_proxy,mod_proxy_http mod_proxy_balancer
(2)tomcat http connector

2.方案二

(1)apache: mod_proxy,mod_proxy_ajp mod_proxy_balancer
(2)tomcat ajp connector

3.方案三 (不怎么使用了)

(1)apache: mod_jk

  (2)tomcat   ajp connector

六,配置httpd

#关闭中心主机
[root@node3 ~]# vim /etc/httpd/conf/httpd.conf
注释掉DocumentRoot "/var/www/html"

#修改每台主机的server.xml文件,添加jvmRoute 唯一标识,不是必须


准备特定的index.js文件
演示效果,在TomcatA上某context中(如/test),提供如下页面
<%@ page language="java" %>

  TomcatA
  
    

TomcatA.magedu.com

<% session.setAttribute("magedu.com","magedu.com"); %>
Session ID<%= session.getId() %>
Created on <%= session.getCreationTime() %>
演示效果,在TomcatB上某context中(如/test),提供如下页面 <%@ page language="java" %> TomcatB

TomcatB.magedu.com

<% session.setAttribute("magedu.com","magedu.com"); %>
Session ID<%= session.getId() %>
Created on <%= session.getCreationTime() %>
在node3 httpd然后自定义一个配置文件(虚拟主机) [root@node3 conf.d]# pwd /etc/httpd/conf.d [root@node3 conf.d]# vim vhosts.conf BalancerMember http://192.168.66.129:8080 loadfactor=10 route=TomcatA BalancerMember http://192.168.66.130:8080 loadfactor=10 route=TomcatB ServerName www.node1.com ProxyVia On ProxyRequests Off ProxyPreserveHost On Require all granted ProxyPass / balancer://lbcluster1/ ProxyPassReverse / balancer://lbcluster1/ Require all granted

问题1 httpd -t 警告
[root@node3 conf.d]# httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.66.131. Set the 'ServerName' directive globally to suppress this message
解决方法
添加ServerName localhost:80

PS:刷新是发现用户seesion变化了,这里使用stickysession解决 session绑定

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

   BalancerMember http://192.168.66.129:8080 loadfactor=10 route=TomcatA
   BalancerMember http://192.168.66.130:8080 loadfactor=10 route=TomcatB
   ProxySet stickysession=ROUTEID

配置请参考httpd mod_proxy_balancer模块官方文档

七,httpd ajp模式

#Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

   BalancerMember ajp://192.168.66.129:8009 loadfactor=10 route=TomcatA
   BalancerMember ajp://192.168.66.130:8009 loadfactor=10 route=TomcatB
  #ProxySet stickysession=ROUTEID


   ProxyVia On
   ProxyRequests Off
   ProxyPreserveHost On
   
     Require all granted
   
   ProxyPass / balancer://lbcluster1/
   ProxyPassReverse / balancer://lbcluster1/
   
     Require all granted
   
#会话绑定只需要开启ProxySet stickysession=ROUTEID
#开启管理模块
用于mod_proxy状态信息的输出

  SetHandler balancer-manager
  Proxypass !
  Order Deny,Allow
  Allow from all

八,session集群

标准会话管理器(StandardManager):

maxInactiveInterval="7200"/>
默认保存于$CATALINA_HOME/work/Catalina///下的SESSIONS.ser文件中。
maxActiveSessions:最多允许的活动会话数量,默认为-1,表示不限制;
maxInactiveInterval:非活动的会话超时时长,默认为60s;
pathname:会话文件的保存目录;

持久会话管理器(PersistentManager):

将会话数据保存至持久存储中,并且能在服务器意外中止后重新启动时重新加载这些会话信息。持久会话管理器支持将会话保存至文件存储(FileStore)或JDBC存储(JDBCStore)中。
保存至文件中的示例:
saveOnRestart="true">
directory="/data/tomcat-sessions"/>

每个用户的会话会被保存至directory指定的目录中的文件中,文件名为.session,并通过后台线程每隔一段时间(checkInterval参数定义,默认为60秒)检查一次超时会话。
保存至JDBCStore中的示例:
saveOnRestart="true">
driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydb?user=jb;password=pw"/>

九,会话复制配置

     

          

          
            
            

            
              
            
            
            
          

          
          

          

          
        

为需要使用session cluster的webapps开启session distribution的功能:
WEB-INF/web.xml中添加

配置请参考tomcat官方文档

十,session服务器

参考实现
百度 tomcat redis session
Tomcat8 + Redis实现session集中管理
使用Redis存储Nginx+Tomcat负载均衡集群的Session
搭建Tomcat集群&通过Redis缓存共享session的一种流行方案

你可能感兴趣的:(Tomcat LB cluster实战详解)