Session 黏性和复制集群|学习笔记

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 快速学习 Session 黏性和复制集群

开发者学堂课程【Tomcat 服务器入门详解Session 黏性和复制集群】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/654/detail/10848


Session 黏性和复制集群


1、负载均衡配置说明

下面是它的指令,主要是设定 Balancer 成员,要负载均衡、调度,就需要列出相关成员。

配置代理到balancer

ProxyPass [path] !|url [key=value [key=value …]]

Balancer成员

BalancerMember [balancerur] url [key=value [key=value …]]

设置Balancer或参数

ProxySet url key=value [key=value …]

ProxyPass和BalancerMember指令参数

参数

缺省值

说明

min

0

连接池最小容量

max

1 – n

连接池最大容量

retry

60

apache请求发送到后端服务器错误后等待的时间秒数。0表示立即重试

参数

缺省值

说明

loadfactor

 

定义负载均衡后端服务器权重,取值范围1-100 

lbmethod

byrequests

负载均衡调度方法

byrequests基于权重的统计请求个数进行调度; byrequests基于权重的统计请求个数进行调度; bybusyness通过考量每个后端服务器当前负载进行调度

maxattempts

1

放弃请求前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数

nofailover

Off

如果后端服务器没有Session副本,可以设置为On不允许故障转移。Off故障可以转移

stickysession

 

调度器的sticky session名字,根据web后台编程语言不同,可以设置为JSESSIONID或PHPSESSIONID

Blancer参数

ProxySet指令也可以使用上面的参数。

为了方便大家观察,我们要在t 1、t 2的tomcat 配置中分别增加jvmRoute,这样SessionID,

就变成了SessionID=9c94FA4AFCBE9337F5F0669548BD4DF.To

mcat2,我们就可以看出sessionID属于谁。

我们要打开conf.d/vhosts.conf,这个在讲Tomcat session集群时有用处,打开之后内容如下:image.pngloadfactor设置为1:2,便于观察。观察调度的结果是轮询的。

2、使用 session 粘性

修改conf.d/vhosts.conf

image.png

3、ajp 调度

修改conf.d/vhosts.conf

image.png如果要用ajp,要把

HeaderaddSet-Cookie “ROUTEID=.%{BALANCER_WORKER_ROUTE}e;path=/”e

nv=BALANCER_ROUTE_CHANGED删掉,

再改ajp、8009两处

proxyset stickysession=ROUTEID先禁用看看切换效果,开启后看看黏住效果。

开启后,发现session不变,一直找同一个Tomcat服务器。

image.png虽然,上面的做法实现客户端在一段时间内找同一台Tomcat,从而避免切换后导致的Session丢失。但是如果Tomcat节点挂掉,那么Session依旧丢失。

假设有A、B两个节点,都把Session做了持久化。如果Tomcat A服务下线期间用户切换到了Tomcat B上,就获得了Tomcat B的Session,就算持久化Session的Tomcat A上线了,也是没用了。

上面的方案具有局限,为了解决这种问题,我们要从服务器入手,从服务器入手,就要从Tomcat想办法,什么办法呢?

就是我们开始时说的:一种是复制集群,一种是共享服务器

五、Tomcat Session集群

参考:

https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html 中的For the impatient

我们直接打开网址Apache Tomcat,想要的东西在这基本都能找到

Receiver我们要注意一下,指的是单波复制  address=“auto”这个在大多数情况下都要改,因为auto自动绑定的是127.0.0.1,因为你是被动接收,所以地址要选择别人能访问到的,不要用auto

两个拦截器TcpFailureDetector,MessageDispatchInterceptor

我已经整理出文档,同学们照着这个做不会有太大问题

以下是文档:

Cluster 集群配置
Manager 会话管理器配置
Channel 信道配置
Membership 成员判定。使用什么多播地址、端口多少、间隔时长ms、超时时长ms。同一个多播地址和端口认为同属一个组。使用时修改这个多播地址,以防冲突。Receiver 接收器,多线程接收多个其他节点的心跳、会话信息。默认会从4000到4100依次尝试可用端口。
address=“auto”,auto可能绑定到127.0.0.1上,所以一定要改为可以用的IP上去
Sender 多线程发送器,内部使用了tcp连接池。
Interceptor 拦截器
Valve
ReplicationValve 检测哪些请求需要检测Session,Session数据是否有了变化,需要启动复制过程
ClusterListener
ClusterSessionListener 集群session侦听器
使用
添加到 所有虚拟主机都可以启用Session复制
添加到 ,该虚拟主机可以启用Session复制
最后,在应用程序内部启用之后才可以使用

前提:
时间同步,确保NTP或Chrony服务正常运行。

# systemctl status chronyd
防火墙规则。# systemctl stop firewalld
主机名 t 0 服务为调度器 nginx httpd IP:192.168.32.7
主机名 t 1 服务为Tomcat1 JDK8、Tomcat8 IP:192.168.32.17
主机名 t 2 服务为Tomcat2 JDK8、Tomcat8 IP:192.168.32.27
本次把多播复制的配置放到缺省虚拟主机里面, 即Host之下。
特别注意修改Receiver的address属性为一个本机可对外的IP地址。
要在Tomcat 8容器中运行会话复制,应完成以下步骤:
所有会话属性都必须实现 java.io.Serializable
取消注释Clusterserver.xml中的元素
如果定义了自定义集群阀,请确保ReplicationValve 在server.xml的Cluster元素下也有定义

如果您的Tomcat实例在同一台机器上运行,

请确保Receiver.port 每个实例的属性都是唯一的,在大多数情况下,Tomcat足够聪明,可以通过自动检测4000-4100范围内的可用端口自行解决此问题。

确保你的web.xml有 <distributable/>元素
如果您使用的是mod_jk,

请确保在Engine上设置<Engine name="Catalina" jvm

Route="node01" > 了jvmRoute属性,并且jvmRoute属性值与worker.properties中的工作程序名称匹配。

确保所有节点都具有相同的时间并与NTP服务同步!确保将您的负载均衡器配置为粘性会话模式。
[root@node1 tomcat]#cat conf/web.xml |tail -10
<!-- here, so be sure to include any of the default values that you wish  -->
<!-- to use within your application.       -->

<welcome-file-list>
<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>    
<distributable/>  #表示开启集群  一定要添加
</web-app>
t1的server.xml中,如下
<Host name="t1.likai.com" appBase="/data/webapps" autoDeploy="true" >

其他略去
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.32.17"  #修改对应的ip地址
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>

t2的server.xml中,如下
<Host name="t2.likai.com" appBase="/data/webapps" autoDeploy="true" >
其他略去
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.32.27"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>

Tomcat重启后,ss命令能看到tomcat监听在4000端口上
尝试使用刚才配置过得负载均衡(移除Session黏性),测试发现Session还是变来变去。
准备 web.xml
在应用中增加 WEB-INF,从全局复制一个 web.xml 过来
#mkdir /data/webapps/ROOT/WEB-INF/
# cp /usr/local/tomcat/conf/web.xml /data/webapps/ROOT/WEB-INF/
为 web.xml 的 标签增加子标签 来开启该应用程序的分布式。
重启全部 Tomcat,通过负载均衡调度到不同节点,返回的 SessionID 不变了。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
11月前
|
监控 测试技术
slb测试会话保持功能
slb测试会话保持功能
373 6
|
运维 Kubernetes 监控
在K8S中,K8S的缺点或当前的不足之处是什么?
在K8S中,K8S的缺点或当前的不足之处是什么?
|
弹性计算 运维 监控
一文读懂 Serverless 的起源、发展和落地实践
Serverless 适合哪些业务场景?它可以对业务产生何种价值呢?
15542 6
一文读懂 Serverless 的起源、发展和落地实践
|
JSON Java Android开发
【HarmonyOS】【Json解析】ZSON 与 HiJson 使用
【HarmonyOS】【Json解析】ZSON 与 HiJson 使用
670 0
【HarmonyOS】【Json解析】ZSON 与 HiJson 使用
|
移动开发 JavaScript API
egret接4399平台
egret接4399平台
egret接4399平台
|
数据采集 SQL 运维
Web 漏洞扫描之 BurpSuite(二) | 学习笔记
快速学习 Web 漏洞扫描之 BurpSuite(二)
772 0
Web 漏洞扫描之 BurpSuite(二) | 学习笔记
|
安全 IDE Java
Java8 获取参数名及Idea/Eclipse/Maven配置(转载)
在Java8之前,代码编译为class文件后,方法参数的类型固定,但是方法名称会丢失,方法名称会变成arg0、arg1....。而现在,在Java8开始可以在class文件中保留参数名,这就给反射带来了极大的遍历。像mybatis等需要使用反射机制获取方法参数的时候就可以不用像以前一样需要使用类似于@Para之类的注解。
620 0
Java8 获取参数名及Idea/Eclipse/Maven配置(转载)
|
安全 Linux Shell
Linux服务器总是被猜测密码怎么办?这个脚本帮你简单加固
Linux服务器总是被猜测密码怎么办?这个脚本帮你简单加固
Linux服务器总是被猜测密码怎么办?这个脚本帮你简单加固
|
存储 Ubuntu Unix
使用croc命令在Linux系统电脑之间传输文件和文件夹
使用croc命令在Linux系统电脑之间传输文件和文件夹
564 0
使用croc命令在Linux系统电脑之间传输文件和文件夹
|
安全 数据可视化 网络安全
华为防火墙配置(防火墙基础)
防火墙概述、防火墙介绍、防火墙作用、NGFW、防火墙的工作模式、安全区域、区域分类、防火墙工作原理、Inbound和Outbound、状态化信息、安全策略
1341 1