不同应用环境下会话保持方式的选择

简介:
会话保持是 ADC(应用交付控制器)的基本特性,绝大多数的应用环境下都涉及到该功能的配置,如果选择的会话保持方式不恰当,可能带来业务处理的不均衡甚至异常,因此能否根据不同的应用环境选择合适的会话保持方式,就涉及到工程师对应用环境的理解,进而还涉及到客户对ADC产品运行效果的评价。
绝大多数的负载均衡产品都支持两类基本的会话保持方式:源 /目的地址会话保持和cookie会话保持,另外像hash,URL Persist等也是比较常用的方式,但不是所有设备都支持。
在应用交付环境中我们面临的常见应用主要有如下几大类: 基于 C/S结构的应用,基于B/S结构(包括三层架构中间件平台)的应用,基于UDP协议的应用,链路负载均衡,以及某些特殊的应用等,下面我们具体分析在不同的环境下怎样选择合适的会话保持。
基于C/S结构的应用:
该类应用一般选择(对于某些负载均衡产品来说也是唯一选择)源地址会话保持。在绝大多数情况下,源地址会话保持工作应该是正常的,但是源地址会话保持有如下弱点:
1) 如果客户端地址是做了 NAT,可能会引起服务器分发的不均衡。
2) 如果客户端出口有多条链路轮询分发并做了 NAT的,一方面会引起服务器分发的不均衡,另一方面可能因为源地址的改变导致会话不能保持,从而引起访问的不正常。
为了保证服务器分发的均衡性和处理的正确性,必须通过别的方式来实现会话保持,  A10公司的AX产品支持基于TCL语言的aFlex脚本,可以灵活地分析四七层的数据包,比如说针对做了NAT的客户端,aFlex脚本可以不根据源地址做会话保持,而是提取客户端数据包的某个独一的字段,用这个字段来为每个客户端实现会话保持。
基于B/S结构的应用:
对于普通 B/S结构的应用内容,例如网站的静态页面,可以不用配置任何的会话保持,但是对于一个基于B/S结构尤其是中间件平台的业务系统来说,必须配置会话保持,一般情况下,我们配置源地址会话保持可以满足需求,但是考虑到客户端可能有上述不利于源地址会话保持的环境,采用Cookie会话保持是一个更好的方式。Cookie会话保持会把负载均衡设备选择的Server信息保存在Cookie中发送到客户端,客户端持续访问时,会把该Cookie带来,负载均衡器通过分析Cookie把会话保持到之前选定的服务器。Cookie分为文件Cookie和内存cookie,文件cookie保存在客户端计算机硬盘上,只要该cookie文件不过期,则无论是否重复关闭开放浏览器都能保持到同一台服务器。内存Cookie则是把Cookie信息保存在内存中,Cookie的生存时间从打开浏览器访问开始,关闭浏览器结束。另外该Cookie的会话保持还跟不同版本的浏览器有关,IE6之前的浏览器如果在打开一个浏览器实例的同时再打开一个新的实例访问相关的内容,新的浏览器不会传递该Cookie,因此新浏览器的请求会被当作新的会话来分发。IE6以后的浏览器如果打开新的实例访问相关的内容,则Cookie会话保持会被延续。由于现在的浏览器对Cookie都有一定默认的安全设置,有些客户端可能规定不准使用文件Cookie,所以现在的应用程序开发多使用内存Cookie。
然而,内存 Cookie也不是万能的,第一,基于它分发的颗粒度仍然不够细,第二,浏览器为了安全可能会完全禁用Cookie,这样Cookie会话保持就失去了作用。怎么办?对于普通的只简单支持Cookie会话保持的负载均衡设备确实是束手无策。但是如果结合应用程序的开发我们有别的办法,大家都知道,某些应用平台特别是中间件平台的开发中常用到Session-id来保持和同步会话,针对禁用Cookie的环境,我们可以通过Session-id来实现会话保持,很不幸,这要求分析处理HTTP包中的Url才能实现,这是让很多厂家的负载均衡器为难的原因,而这对A10公司的aFlex脚本没有任何障碍,该脚本可以获得客户端Url中的Session-id信息,并以该Session-id作为判断会话是否应该保持的依据。如下是aFlex脚本的实现(该脚本同时支持Cookie和Url两种方式的分析):
rule sessionid_persist
when HTTP_REQUEST {
set session_id [findstr [HTTP::uri] “JSESSIONID=” 11 “ ;”]
if { ( $session_id eq “” ) and ( [HTTP::cookie exists JSESSIONID] ) } {
set session_id [HTTP::cookie JSESSIONID]
}
if { $session_id ne “” } {
persist uie $session_id
}
}
when HTTP_RESPONSE {
set session_id [HTTP::cookie JSESSIONID]
if { $session_id ne “” } {
persist add uie $session_id
}
}
基于UDP协议的应用:
基于 UDP协议的应用最常见的是DNS和Radius负载均衡。DNS应用基本上不涉及到会话保持,Radius应用稍微有点复杂,由于Bras设备和Radius服务器会形成长连接,一种需求是要求负载均衡设备能够随着每个请求关闭之前会话并重新选择会话,A10设备针对Radius负载均衡专门支持Stateless Per-Packet Round Robin的负载均衡策略,可以让非常均衡地把不同数据包分发到不同的服务器。实现以上需求要求每台Radius Server都可以处理任意的请求包,例如认证请求到达Server1, 计费请求到达Server2这种处理是没问题的,另外是多台Radius Server之间能够共享同步Bras传递过来的用户状态。由于以上要求可能原来的Radius系统无法实现,那么可能客户会要求基于单个用户的请求和计费来实现会话保持,这就必须在数据包中分离每个用户并实现会话保持,A10设备同样是通过aFlex来实现的。
链路负载均衡中的会话保持:
链路负载均衡的会话保持常用的是基于源地址和目的地址的会话保持,基于源地址选择链路来分发数据包时常采用源地址会话保持,而基于目的地址选择链路来分发数据包时可以选择源地址会话保持也可以选择目的地址会话保持,采用何种会话保持方式还需要考虑用户内部网络的结构,例如用户内网不同的部门分别做了 NAT,选择会话保持方式的不同,可能导致NAT地址和链路的压力大不相同。保证链路负载均衡会话保持正常工作的一个非常重要的因素是NAT地址的保持,假设用户是在访问网银,不同的链接访问出去的时候虽然走的是同一条链路,但用的不是同一个NAT地址,那么网银系统会拒绝处理该用户的请求。这跟做服务器负载均衡时,由于客户端NAT地址变化引起的访问异常是一样的,当然不排除网银还有一些安全性方面的措施。A10设备通常是通过Hash的方式来实现NAT地址的保持和唯一性:
when CLIENT_ACCEPTED {
set remote_addr [IP::local_addr]
set bwfile_group_id [ POLICY::bwlist id $remote_addr chinall ]
scan $remote_addr "%d.%d.%d.%d" a b c d
#set number of CNC/CTC NATs
set ctc_nat_num 5
set cnc_nat_num 5
 
set ctc_hash [ expr { 1+$d%$ctc_nat_num} ]
set cnc_hash [ expr { 1+$d%$cnc_nat_num} ]
set cnc_nat "cnc_nats_$cnc_hash"
set ctc_nat "ctc_nats_$ctc_hash"
if { ($bwfile_group_id equals 2) and ( [LB::status node 1.1.1.1 ] == "up") } {
         snatpool $cnc_nat
         pool netcom_gw
 } else {
         snatpool $ctc_nat
         pool telecom_gw
    }
}
其他应用中的会话保持:
A10设备对于某些专门的应用还提供专门的会话保持方法,比如对于 SSL协议的应用,支持基于SSL Session-ID的会话保持,对于SIP协议的应用支持基于SIP的会话保持等,由于需求不够广泛,这里不做一一讨论。
wyl)
 


本文转自 virtualadc 51CTO博客,原文链接:http://blog.51cto.com/virtualadc/592454
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
5月前
|
存储 数据采集 供应链
数据中台是什么?怎么搭建数据中台?
本文深度解析数据中台本质:非“管数据”,而是让数据“流动起来、用起来”。厘清其作为统一数据能力平台的定位,详解六大核心架构模块(采集、存储计算、治理安全、服务化、组织、性能),并给出从0到1落地四阶段路径,同时警示三大常见误区。
|
4月前
|
机器学习/深度学习 弹性计算 人工智能
2026年阿里云服务器收费价格表(轻量/ECS/GPU):一年、1个月与小时费用清单
阿里云2026年推出轻量应用服务器、云服务器ECS及GPU服务器三大高性价比套餐,阿里云官方活动:https://t.aliyun.com/U/FzmsXA 覆盖个人建站、企业应用与AI训练等场景。提供包年、月付、按量三种计费模式,价格透明,新老用户同享优惠,支持一键部署与弹性扩展
2625 13
|
8月前
|
存储 人工智能 安全
什么是OSS?简要介绍阿里云对象存储OSS的使用场景
阿里云对象存储OSS是海量、安全、低成本的云存储服务,支持无限扩展,适用于音视频、教育、AI、物联网、影视、基因等行业。数据持久性达12个9,提供多种存储类型与灵活计费模式,助力企业高效降本。
|
Docker 容器
将本地的应用程序打包成Docker镜像
将本地的应用程序打包成Docker镜像
2403 122
|
安全 Linux
CentOS下载ISO镜像的方法
访问CentOS官方网站(https://www.centos.org/download/),在“Downloads”页面找到ISO镜像下载链接,选择所需版本和架构(如x86_64)开始下载。CentOS分为Linux版和Stream版,前者每两年发行一次并提供10年安全维护,后者为滚动更新。旧版本可在Vault(https://vault.centos.org/)下载。建议选择DVD格式镜像,包含完整系统和常用软件。
34421 16
CentOS下载ISO镜像的方法
|
Linux API 虚拟化
VMware WorkStation Pro 15.5(低版本安装) 教学用
VMware WorkStation Pro 15.5(低版本安装) 教学用
2059 5
|
JavaScript 前端开发 Go
Docker 入门:如何打包、部署并运行你的应用
Docker 入门:如何打包、部署并运行你的应用
1986 0
|
存储 Ubuntu 数据安全/隐私保护
如何使用Docker Hub如何使用Docker Hub
如何使用Docker Hub
10200 1
|
计算机视觉 C++
Qt中实时调取摄像头(利用OpenCV)
Qt中实时调取摄像头(利用OpenCV)
1058 1
Qt中实时调取摄像头(利用OpenCV)
|
Linux
CentOS 7 配置yum阿里源 (三步即可)
CentOS 7 配置yum阿里源 (三步即可)
36938 1