LVS会话保持的问题


调度器 :eth0 192.168.1.1 eth1 172.16.1.1

realserver1:eth1 172.16.1.2 (RS1)
realserver2:eth1 172.16.1.3 (RS2)

realserver default gw 172.16.1.1


#echo 1 > /proc/sys/net/ipv4/ip_forward
#ipvsadm -A -t 192.168.1.1:80 -s wrr -p 900
#ipvsadm -a -t 192.168.1.1:80 -r 172.16.1.2:80 -m
#ipvsadm -a -t 192.168.1.1:80 -r 172.16.1.3:80 -m

#ipvsadm -A -t 192.168.1.1:443 -s wrr -p 900
#ipvsadm -a -t 192.168.1.1:443 -r 172.16.1.2:443 -m
#ipvsadm -a -t 192.168.1.1:443 -r 172.16.1.3:443 -m

当client 访问 192.168.1.1:443 这个VIP时分配到的RS 为RS1,并且在900S内保持在RS1上
900S后,分配到RS2,说明-p 900是起作用的

但当client 访问192.168.1.1:443 到 RS1时,紧跟着访问192.168.1.1:80 却被分配到了RS2


没有保持在RS1上,


但是RS1上有用户的SESSION,所以必须是同一个用户上来,访问443后,走80端口,LVS定位到同一台机器

虽然有的兄弟会说下面的WEB SERVER 用共享存储来存SESSION,但是现是不能这样做


请问LVS有什么访问解决我的问题吗,或者用-s 用sh ?


当使用source hash时能解决吗?


看看下面的配置行吗?

#ipvsadm -A -t 192.168.1.1 -s wrr -p 900
#ipvsadm -a -t 192.168.1.1 -r 172.16.1.2 -m
#ipvsadm -a -t 192.168.1.1 -r 172.16.1.3 -m


当client 访问 192.168.1.1:443 这个VIP时,分配到的RS 为可能是RS1,RS2中的任意一个,只不过当分配到某一个节点后,会在此节点上保留900秒,然后调度器会负责跳转到另一个节点执行,

应该是这样理解的!


实际上,对于配置了p的vs,系统在在建立新连接前先调度并创建一个连接模板例如,该连接模板的超时时间为p的参数,例如900s.然后再根据模板创建本次可用的连接,例如这样数据就都从该连接过。如果紧接着又有的新请求,vs则会寻找找模板,如果找到,就不重新schedule,而是根据该模板提供的rs创建真实连接,并同时reset该模板的超时时间,即又重置到900s.



QUOTE:
原帖由 qtdszws 于 2007-5-18 22:17 发表于 4楼
实际上,对于配置了p的vs,系统在在建立新连接前先调度并创建一个连接模板例如,该连接模板的超时时间为p的参数,例如900s.然后再根据模板创建本次可用的连接,例如在我的测试中,客户端的所有请求都是基于80端口的,

那么当创建模版完毕,在此模版上操作超过900s后,接下来是不是要重新创建连接模版,如果能找到新的连接模版,就不用重新schedule,也就是仍然在此节点来完成下一个客户端请求,如果找不到连接模版,就重新schedule,从另外一个节点来完成下一个客户端请求呢?

还是

当创建模版完毕,在此模版上操作超过900s后,直接从另外一个节点创建新的连接模版,当创建模版完毕,来完成下一个客户端请求?然后就这样循环下去呢?

而创建和寻找模版是一个什么概念呢?




1.模板其实也是一个连接,ipvsadm -Lcn应该能看到
2.该连接的超时时间就是p的参数,如果该模板被重用,超时时间就被重设
那么用户的每次的http请求不超过超时时间,则用户的请求都根据模板发往固定的rs.

>>那么当创建模版完毕,在此模版上操作超过900s后,接下来是不是要重新创建连接模版,如果能找到新的连接模版,就不用重新schedule,也就是仍然在此节点来完成下一个客户端请求,如果找不到连接模版,就重新schedule,从另外一个节点来完成下一个客户端请求呢?

对。如果找不到模板,就schedule一个rs.再创建模板和连接


>>当创建模版完毕,在此模版上操作超过900s后,直接从另外一个节点创建新的连接模版,当创建模版完毕,来完成下一个客户端请求?然后就这样循环下去呢?

我想你的"从另外一个节点"应该表述为调度一个rs

>>而创建和寻找模版是一个什么概念呢?

模板也是连接,不过比较特别罢了.


十分感谢qtdszws 老兄的耐心讲解,想qtdszws 学习!


在ipvsadm 的用法中,很多文档对于persistent参数是这样说明的。

-p –persistent [timeout]
持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。


现在不明白的是,“来自同一个客户”该怎么理解呢,是基于IP的客户端还是基于浏览器客户端的Cookie呢,还是都有呢。


有这个疑问的原因是,来自于session会话保持的问题,

lvs中 -p 参数可以指定会话保持时间,而这个会话保持ipvsadm是通过一种什么方式和客户端交互,实现的呢?

按照我的测试和理解,应该是通过浏览器客户端的Cookie来实现会话保持的,


例如:我的调度器是A,realserver有B和C,同时–persistent 设置时间为600秒。调度算法采用rr方式。
当我访问web时,调度器把这个请求分派到了B节点,按照我的理解应该是此后600秒内,在 此客户端进行的操作调度器都会分派到节点B来完成,600秒过后,按照rr调度算法,调度器会把此客户端的请求发到C节点,
可是在我的测试中,600秒以后,调度器有时把请求发送到了C节点,有时仍然发送到B节点,并且发送到B的几率更大,这个web站点只有我一个人在操作,这样的话,就不符合了rr的调度算法。

一点疑问,请大家讨论一下,谢谢!


同时还有一个问题

-p参数让会话保持在了节点B,那么当B宕机以后,按照道理lvs应该将分发到这个节点的请求分发到其他节点,但是由于设置了-p参数,客户端请求会仍然发送到故障节点B,

即使设置"quiescent=no",调度器能够正确的把请求分派到正常节点,那么在原来节点上的session由于不能复制到正常的节点,就丢失了,此时客户端会出现要求重新登陆等的提示,这个怎么处理呢!


>>现在不明白的是,“来自同一个客户”该怎么理解呢,是基于IP的客户端还是基于浏览器客户端的Cookie呢,还是都有呢。

应该是基于源地址.其实还有一个参数[-M netmask],它指出源地址的匹配方式
例如 -p 900 -M 255.255.255.0
就是掩码后网络地址相同的请求使用同一个模板
因此10.1.9.8和10.1.9.9两机器同时访问同一个vs就使用同一个模板,即到同一个rs.


>>可是在我的测试中,600秒以后,调度器有时把请求发送到了C节点,有时仍然发送到B节点,并且发送到B的几率更大,这个web站点只有我一个人在操作,这样的话,就不符合了rr的调度算法。

rr算法很简单,它只维护一个指向rs循环队列的指针,如果vs请求调度,rr就把当前指针所指的rs做为本次连接请求的rs,然后后以指针.它并不管什么模板.


>>即使设置"quiescent=no",调度器能够正确的把请求分派到正常节点,那么在原来节点上的session由于不能复制到正常的节点,就丢失了,此时客户端会出现要求重新登陆等的提示,这个怎么处理呢!

可以把session保存到独立的fs,mysql,网络存储上


lvs操作的流程

数据包->vs->查找是否已存在连接

1.存在就根据该连接发包
2.不存在,是新连接,则开始调度

如果vs是普通服务器,则执行调度算法选择一个rs,然后创建连接,然后发送
如果vs是p服务器,则先看看是否有模板可用,如果有,则根据该模板创建连接,然后发包
如果没有模板可用,就执行调度器调度一个rs并创建模板,然后根据该模板创建连接,最后发包


qtdszws 兄解决我偶最近的一些疑惑,再次感谢!

你可能感兴趣的:(路由交换技术基础,session,算法,浏览器,服务器,测试,web)