设为首页 收藏本站
查看: 737|回复: 0

[经验分享] 基于linux实现tomcat集群的会话保持

[复制链接]

尚未签到

发表于 2018-12-1 09:08:02 | 显示全部楼层 |阅读模式
拓扑图


IP网络规划







nginx
172.17.10.150


tomcatA
172.17.10.168


tomcatB
172.17.10.169

访问原理
  用户访问nginx客户端,nginx通过反向代理功能,把.jsp和.do后缀的请求发送到后端的tomcat集群,后端的tomcat集群会话session复制,从而实现会话保持功能。

nginx配置文件


user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
error_log  /var/log/nginx/error.log  info;
#pid        logs/nginx.pid;
events {
worker_connections  65535;
}
http {
include       mime.types;
default_type  application/octet-stream;
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log     /var/log/nginx/access.log  main;
sendfile        on;
tcp_nopush     on;
tcp_nodelay    on;
#keepalive_timeout  0;
keepalive_timeout  65;
gzip  on;
upstream tomcat-cluster {
#   ip_hash
server 172.17.10.168:8080  weight=1;
server 172.17.10.169:8080  weight=1;
}
server {
listen     80;
server_name  xiaomi.mage.com;
root /data/xiaomi;
#charset koi8-r;
#access_log  logs/host.access.log  main;
#       if ($http_user_agent ~ "WOW64") {
#       rewrite ^(.*)$ /404.html break;
#       }
location ~* \.(jsp|do)$ {
proxy_pass http://tomcat-cluster;
}
location / {
index  index.jsp index.php index.html index.htm;
}
location /status{
stub_status on;
auth_basic "status AH";
auth_basic_user_file ./htpasswd;
}
#error_page  404              /404.html;
# redirect server error pages to the static page /50x.html
#
error_page   500 502 503 504  /50x.html;
location = /50x.html {
root   html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
#    proxy_pass   http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
#    root           html;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include        fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
#    deny  all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
#    listen       8000;
#    listen       somename:8080;
#    server_name  somename  alias  another.alias;
#    location / {
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
#    root           html;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include        fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
#    deny  all;
#}
}
  这样实现分离的话会出现一个问题,访问172.17.10.150/index.jsp页面如下
http://i2.运维网.com/images/blog/201711/25/018dead17c4f4a67f3f9e4ceb789ed58.png
由于是实验环境,我们可以在nginx配置文件中server段中添加一个location,把.css和.png也代理到后端的tomcat集群,这样就能找到.css和.png文件了。(这样配置只是为了试验,如果本机有其他web服务里有以.png或者.css结尾的文件就找不到了)

location ~* \.(css|png)$ {
proxy_pass http://tomcat-cluster;
}

  或者可以nginx代理端和tomcat处在一个物理机上,把root指向tomcat的工作目录也可以

root  /usr/locat/tomcat/webapps/BOOT----------->tomcat默认的.jsp文件在这个目录下
后端集群实现session会话

方法一 基于集群的session复制实现(适用于小型集群)

tomcat配置文件server.xml



















server.xml配置详解

Cluster配置:
  Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. className 表示tomcat集群时,之间相互传递信息使用那个类来实现信息
之间的传递. channelSendOptions可以设置为2、4、8、10,每个数字代表一种方式
2 = Channel.SEND_OPTIONS_USE_ACK(确认发送)
4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步发送)
8 = Channel.SEND_OPTIONS_ASYNCHRONOUS(异步发送)
在异步模式下,可以通过加上确认发送(Acknowledge)来提高可靠性,此时channelSendOptions设为10

Manager介绍
  Manger对象用于实现HTTP会话管理的功能,Tomcat中有5种Manger的实现:
(1).StandardManager
Tomcat6的默认会话管理器,用于非集群环境中对单个处于运行状态的Tomcat实例会话
进行管理。当Tomcat关闭时,这些会话相关的数据会被写入磁盘上的一个名叫
SESSION.ser的文件,并在Tomcat下次启动时读取此文件。
(2).PersistentManager
当一个会话长时间处于空闲状态时会被写入到swap会话对象,这对于内存资源比较吃紧
的应用环境来说比较有用。
(3).DeltaManager(目前这个更适用)
用于Tomcat集群的会话管理器,它通过将改变了会话数据同步给集群中的其它节点实现
会话复制。这种实现会将所有会话的改变同步给集群中的每一个节点,也是在集群环境中
用得最多的一种实现方式。
(4).BackupManager
用于Tomcat集群的会话管理器,与DeltaManager不同的是,某节点会话的改变只会同
步给集群中的另一个而非所有节点。

Manager配置
  className-指定实现org.apache.catalina.ha.ClusterManager接口的类,信息之间的管

expireSessionsOnShutdown-设置为true时,一个节点关闭,将导致集群下的所有
Session失效
notifyListenersOnReplication-集群下节点间的Session复制、删除操作,是否通知
session listeners


Channel介绍和配置
  Channel是Tomcat节点之间进行通讯的工具。Channel包括4个组件:
Membership 集群的可用节点列表
Receiver 接收器,负责接收消息
Sender 发送器,负责发送消息
Interceptor Cluster的拦截器


Membership:维护集群的可用节点列表,它可以检查到新增的节点,也可以检查到没有心跳的节点
  className-指定Membership使用的类
address-组播地址
port-组播端口
frequency-发送心跳(向组播地址发送UDP数据包)的时间间隔(单位:ms)。默认值为500
dropTime-Membership在dropTime(单位:ms)内未收到某一节点的心跳,则将该节点从可用节点列表删除。默认值为3000
注: 组播(Multicast):一个发送者和多个接收者之间实现一对多的网络连接。
一个发送者同时给多个接收者传输相同的数据,只需复制一份相同的数据包。
它提高了数据传送效率,减少了骨干网络出现拥塞的可能性
相同组播地址、端口的Tomcat节点,可以组成集群下的子集群


Receiver : 接收器,负责接收消息
  接收器分为两种:BioReceiver(阻塞式)、NioReceiver(非阻塞式)
className-指定Receiver使用的类
address-接收消息的地址
port-接收消息的端口
autoBind-端口的变化区间
如果port为4000,autoBind为100,接收器将在4000-4099间取一个端口,进行监听
selectorTimeout-NioReceiver内轮询的超时时间
maxThreads-线程池的最大线程数

  
(这里这个接收地址默认auto绑定的是本机的127地址,可以修改为本机桥接地址,便于通信)
Sender : 发送器,负责发送消息
  Sender内嵌了Transport组件,Transport真正负责发送消息


  Transport:定义传输方式
Transport分为两种:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式)



Interceptor : Cluster的拦截器
  TcpFailureDetector-网络、系统比较繁忙时,Membership可能无法及时更新可用节点列表,此时TcpFailureDetector可以拦截到某个节点关闭的信息,并尝试通过TCP连接到此节点,以确保此节点真正关闭,从而更新集群可以用节点列表


  MessageDispatch15Interceptor-查看Cluster组件发送消息的方式是否设置为
Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster标签下的channelSendOptions为8时)。 设置为Channel.SEND_OPTIONS_ASYNCHRONOUS时,
MessageDispatch15Interceptor先将等待发送的消息进行排队,然后将排好队的消息转给Sender


  ClusterListener : 监听器,监听Cluster组件接收的消息
使用DeltaManager时,Cluster接收的信息通过ClusterSessionListener传递给DeltaManager -->


配置文件web.xml


index.html
index.htm
index.jsp

   (在文件结尾处上方加上这个参数就行)

测试页面



TomcatA

TomcatA


Session ID




Created on





如图

  如果测试不通过的话,就复制tomcat配置文件conf目录下的web.xml文件到你的测试目录下的WEB-INF(需要手动创建)
http://i2.运维网.com/images/blog/201711/27/256c3cb856920d0604f52a3b57d082ae.png

这样基于tomcat集群的session复制的配置就完成了~

方法二 tomcat结合memcached实现seesion共享 (适用于比较大的集群)

环境准备
  Tomcat Session Server (memcached)
https://github.com/magro/memcached-session-manager
支持的session server类型:
memcached:
redis:

相关包
  memcached-session-manager-2.1.1.jar
memcached-session-manager-tc7-2.1.1.jar(注意:要根据tomcat版本下载相应的)
spymemcached-2.11.1.jar
msm-javolution-serializer-2.1.1.jar
javolution-5.4.3.1.jar

剩下的内容下次博客再来详细介绍,溜了溜了~




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-641812-1-1.html 上篇帖子: Tomcat的三种会话保持 下篇帖子: 16.1 Tomcat介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表