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

浏览 1.6k

前文提要

    上文中我们提到,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
粉丝
相关文章