点赞
评论
收藏
分享
举报
Nginx与HAProxy会话保持的区别(二)
发表于2022-10-19 10:44

浏览 1.4k

前文提要

    上文中我们提到,Nginx的第三方模块nginx-sticky-module支持的会话保持,当第二次请求携带第一次请求响应的Nginx插入的Cookie标识时,Nginx会将该请求转发至后端特定的服务器,此时后端的服务器收到的请求头会包含该Cookie标识。

    HAProxy支持的会话保持,与Nginx第三方模块sticky的实现有些许差别,其支持插入的cookie标识对后端服务器不可见,下面我们将进行进一步的说明。

HAProxy插入COOKIE

    HAProxy支持cookie insert,即当客户端首次请求时,HAProxy后在请求响应中,添加Set-Cookie的HTTP头部信息,并将该Cookie与后端服务器的关系存于缓存的cookie表中。结合配置indirect选项,当第二次客户端携带该Cookie发起请求时,HAProxy通过查询本地缓存的cookie表,删除请求头中自行设置的Cookie标识,将请求转发至对应的服务器。此时后端服务器接受到的请求,不会包含HAProxy设置的Cookie标识,对于后端服务器来说,这个过程是透明的,它并不知道前置负载均衡组件会话保持的行为。

HAProxy的拓扑

    这里我们参照之前Nginx会话保持的拓扑,搭建了一个HAProxy的测试环境,两个后端服务器分别启动了Nginx服务作为服务端,其拓扑如下图所示:

    HAProxy是OpenStack Neutron-LBaaSv2 Pike版本中的负载均衡组件,其会话保持功能HTTP_COOKIE正是利用了HAProxy的insert cookie特性。在此,我们借用Neutron-LBaaSv2组件创建HAProxy的负载均衡器,来探讨HAProxy的会话保持功能。

配置"HTTP_COOKIE"

    首先我们根据拓扑图,利用Neutron命令创建基于HAProxy的负载均衡器:

# neutron lbaas-loadbalancer-create --name lwl-ha-cookie --provider haproxy demo-subnet
# neutron lbaas-listener-create --loadbalancer lwl-ha-cookie --protocol-port 80 --protocol HTTP --name lwl-ha-cookie-listener
# neutron lbaas-pool-create --name lwl-ha-cookie-http-pool --lb-algorithm ROUND_ROBIN --listener lwl-ha-cookie-listener --protocol HTTP --session-persistence type=HTTP_COOKIE

创建出的负载均衡器,其后端服务器组配置的会话保持类型是"HTTP_COOKIE",配置详情如下图所示:

在创建的后端服务器组中,添加两台后端服务器:

# neutron lbaas-member-create --subnet demo-subnet --address 192.168.10.10 --protocol-port 80 lwl-ha-cookie-http-pool
# neutron lbaas-member-create --subnet demo-subnet --address 192.168.10.18 --protocol-port 80 lwl-ha-cookie-http-pool

至此,具有会话保持功能的HAProxy负载均衡器已配置完毕,生成的haproxy.conf文件详情如下:

由上图可以看出,HAProxy在后端backend中,使用"insert indirect"模式,配置了名为"SRV"的cookie标识,而"cookie e164****e7ad"即表示每一个后端服务器对应的cookie标识值。

测试场景一:后端服务器不自带cookie

    首先向HAProxy负载均衡器,在命名空间中,通过wget命令发起第一次客户端请求:

# ip netns exec qlbaas-c6031a71-c0d5-4fca-acde-a20e2c9ca7e0 wget  192.168.10.120 --debug

请求响应的详情如下:

由上图可以看出,客户端收到的响应中包含了"Set-Cookie: SRV=e1641c65-ae6e-4bf0-b022-52d87706e7ad"信息,即HAProxy将请求转发到了该SRV值对应的"192.168.10.10"这台服务器。

    我们分别在HAProxy所在的负载均衡器和后端服务器进行了抓包,其中在负载均衡器上的抓包如下:

可以看到,负载均衡器在响应中包含"Set-Cookie: SRV"标识。在后端服务器上的抓包如下:

可以看到,后端服务器自身发出的响应中并未包含"Set-Cookie: SRV"信息。可以验证客户端首次请求时,HAProxy在响应中添加了后端服务器不感知的Cookie标识。

    向HAProxy发送第二次请求,携带第一次请求响应的的"Cookie:SRV= e1641c65-ae6e-4bf0-b022-52d87706e7ad 信息,请求响应详情如下:

此时在HAProxy负载均衡器上抓包,如下:

    

可以看到负载均衡器的响应中已经没有了"Set-Cookie"标识。此时在后端服务器上抓包如下:

可以看到,后端服务器自身的请求中,并未收到客户端请求的"Cookie"标识。

    在该测试场景下,当后端服务器不自带Cookie信息时,HAProxy用于会话保持的Cookie标识对于后端服务器来说是透明无感知的。

结束语

    在本次介绍中,我们验证了HAProxy insert cookie模式与Nginx的第三方模块Sticky不同,当后端服务器不自带"Set-Cookie" HTTP响应头部时,其后端服务器对于前置的HAProxy的Cookie会话保持无感知。那么,如果后端服务器自带"Set-Cookie"HTTP响应头部,HAProxy又是如何处理"HTTP_COOKIE"会话保持的,我们将在下一期继续和大家进行探讨,敬请期待~


已修改于2023-03-06 02:19
本作品系原创
创作不易,留下一份鼓励
lwl

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(0)

按点赞数排序

按时间排序

关于作者
lwl
这家伙很懒还未留下介绍~
3
文章
0
问答
5
粉丝
相关文章
会话保持  会话保持在负载均衡中是一个非常重要的功能,目前开源的组件Nginx和HAProxy都具备会话保持的功能,但是在实现上,两个组件又有些许区别,下面我们将分章节对这两个组件的实现对下比较。Nginx的会话保持  Nginx的会话保持一般有两种实现方式,一种是原生的ip_hash,一种是来自第三方的模块nginx-sticky-module。ip_hash:即源地址哈希,nginx会将客户端IP地址进行哈希,将来自于同一个客户端IP的请求,转发到同一台后端服务器;sticky:是一个第三方模块提供的功能,利用cookie实现会话保持。客户端请求的后端服务器的响应在经过nginx时,会被nginx插入一个cookie标识,该标识会与后端服务器做唯一的映射。在有效期内,当客户端携带该cookie第二次向nginx发起请求时,nginx会把该请求根据cookie标识,转发至同一台后端服务器;Sticky模块的编译步骤1:获取 nginx-sticky-module模块:https://bitbucket.org/nginx-good
点赞 1
浏览 2k
用户任务1: 点击任务参与任意话题讨论累计2次,并在文章评论区留下您的话题讨论链接; l LV3用户等级权益: 社区官网个人主页展示精美V3等级勋章1个; 有机会在社区官网首页“社区达人”模块展示
点赞 0
浏览 496
缓存是一种通过在本地存储信息来加快客户端(如 Web 浏览器)与服务器(如 Web 服务器)通信速度的机制。缓存可能位于客户端或服务器端,或者更常见的是,同时位于二者之上。 缓存对于处理重复的静态数据
点赞 0
浏览 607