`

LVS/Nginx如何处理session问题

阅读更多

<转自http://blog.wqgcool.com/?p=634>

业务系统架构为:

拓补一:Nginx(master)+keepalived+Nginx(backup)+3台web集群+mysql(master-slave)+EMC CLARiiON CX4存储
拓补二:lvs(master)+keepalived+lvs(backup) +3台web集群+mysql(master-slave)+EMC CLARiiON CX4存储

操作系统用的是64位RHEl5.4/Centos5.4,服务器采用HP360G6+HP580G5,业务系统最前端的防火墙为华赛USG5000+WAF-T3-500(防DDOS、钓鱼式及注入式攻击等)

拓补一中,如采用Nginx负载均衡器,采用的ip_hash来代替默认的rr方式,即可以将某客户端IP的请求通过哈希算法定位到同一台后端 web服务器上,这样避免了session丢失,解决了session问题。但ip_hash指令无法保证后端服务器的负载均衡,可能有些后端服务器接收的请求多,有些后端服务器接收的请求少;这样失去了负载均衡的意义。我们的解决方案是将用户的登录session信息写进后端的Mysql数据库,这个在后面的CMS系统中也实现了,效果也不错;后来我提出了折衷方案,如果Nginx并发连接数(即Nginx负载均衡器的NginxStatus的 active connections)>2000,即采用将session写进MySQL数据库的方法;如果并发数小的话,ip_hash效果也是相当好的。

另外,如果在upstream中添加了ip_hash参数后,经测试发现后台的某台服务器挂掉后不会自动跳转,可建议采用如下写法:

1. upstream njzq.com {
2. ip_hash;
3. server 172.16.94.216:9000 max_fails=0;
4. server 172.16.94.217:9000 max_fails=0;
5. server 172.16.94.218:9000 max_fails=0;
6. }

拓补二中,lvs采用的ipvsadm -p方案,persistence-会话保持时间,单位是秒。我一般是设为120s,这个选项对动态网站很有用处:当用户从远程用帐号进行登陆网站时,有了这个会话保持功能,就能把用户的请求转发给同一个应用服务器。当用户第一次访问的时候,他的访问请求被负载均衡器转给某个真实服务器,这样他看到一个登陆页面,第一次访问完毕;接着他在登陆框填写用户名和密码,然后提交;这时候,问题就可能出现了—登陆不能成功。因为没有会话保持,负载均衡器可能会把第 2次的请求转发到其他的服务器。那么设置后是不是前面的客户机跟后面的服务器都永远建议连接关系呢,蛮或是过了120秒后或切换到另一台真实的物理服务器呢?我尝试作了以下实验,lvs采用单台,192.168.1.102,VIP为192.168.1.188,后端为二台web服务器,192.168.1.103和192.168.1.104。

lvs上面执行下列脚本,二台真实的服务器下也要执行相关脚本,绑定vip地址192.168.1.188;lvs和真实物理服务器上分别使用lvs_dr.sh和real.sh脚本

1. [root@ltos lvs]# cat lvs_dr.sh
2. #!/bin/bash
3.
4. # website director vip.
5. SNS_VIP=192.168.1.188
6. SNS_RIP1=192.168.1.103
7. SNS_RIP2=192.168.1.104
8.
9. . /etc/rc.d/init.d/functions
10.
11. logger $0 called with $1
12.
13. case “$1″ in
14.
15. start)
16. # set squid vip
17. /sbin/ipvsadm –set 30 5 60
18. /sbin/ifconfig eth0:0 $SNS_VIP broadcast $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP up
19. /sbin/route add -host $SNS_VIP dev eth0:0
20. /sbin/ipvsadm -A -t $SNS_VIP:80 -s wlc -p 120
21. /sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP1:80 -g -w 1
22. /sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP2:80 -g -w 1
23. touch /var/lock/subsys/ipvsadm >/dev/null 2>&1
24.
25. ;;
26. stop)
27. /sbin/ipvsadm -C
28. /sbin/ipvsadm -Z
29. ifconfig eth0:0 down
30. route del $SNS_VIP
31. rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1
32. echo “ipvsadm stoped”
33. ;;
34.
35. status)
36.
37. if [ ! -e /var/lock/subsys/ipvsadm ];then
38. echo “ipvsadm stoped”
39. exit 1
40. else
41. echo “ipvsadm OK”
42. fi
43. ;;
44.
45. *)
46. echo “Usage: $0 {start|stop|status}”
47. exit 1
48. esac
49. exit 0

二台web真实物理服务器运行real.sh脚本

1. #!/bin/bash
2. SNS_VIP=192.168.1.188
3. . /etc/rc.d/init.d/functions
4.
5. case “$1″ in
6. start)
7. ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
8. /sbin/route add -host $SNS_VIP dev lo:0
9. echo “1″ >/proc/sys/net/ipv4/conf/lo/arp_ignore
10. echo “2″ >/proc/sys/net/ipv4/conf/lo/arp_announce
11. echo “1″ >/proc/sys/net/ipv4/conf/all/arp_ignore
12. echo “2″ >/proc/sys/net/ipv4/conf/all/arp_announce
13. sysctl -p >/dev/null 2>&1
14. echo “RealServer Start OK”
15. ;;
16. stop)
17. ifconfig lo:0 down
18. route del $SNS_VIP >/dev/null 2>&1
19. echo “0″ >/proc/sys/net/ipv4/conf/lo/arp_ignore
20. echo “0″ >/proc/sys/net/ipv4/conf/lo/arp_announce
21. echo “0″ >/proc/sys/net/ipv4/conf/all/arp_ignore
22. echo “0″ >/proc/sys/net/ipv4/conf/all/arp_announce
23. echo “RealServer Stoped”
24. ;;
25. *)
26. echo “Usage: $0 {start|stop}”
27. exit 1
28. esac
29. exit 0

通过观察得知,当 客户机192.168.1.100发起第一次连接请求时,lvs负载均衡器将其分配到后面的真实物理服务器192.168.1.104,在完成了三次握手后,连接的状态为ESTABLISHED,随后在终止TCP连接的相当一段时间内,真实web服务器的状态为FIN_WAIT,而在此段时间 192.168.1.100发起的新连接,会一直连接到192.168.1.104。

分享到:
评论

相关推荐

    lvs+keepalived+nginx+tomcat+memcached实现服务负载均衡及session共享

    然后,nginx作为一款高性能的反向代理服务器,可以在lvs之后作为第二层负载均衡器,处理HTTP和HTTPS请求。它支持基于多种策略的负载均衡,如轮询、权重、IP哈希等。此外,nginx还可以处理静态资源,减轻后端应用...

    Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    最后,Keepalived是一种为高可用性而设计的开源工具,主要应用于LVS(Linux Virtual Server)和Nginx等系统。它通过健康检查监控服务器状态,并在主服务器失效时自动将流量切换到备份服务器,确保服务的不间断运行。...

    Nginx、LVS及HAProxy负载均衡软件的优缺点详解.docx

    负载均衡 software 是一种常用的技术,旨在提高网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力,同时能够提高网络的灵活性和可用性。Nginx、LVS 及 HAProxy 是目前使用最广泛的三种负载均衡软件,每种...

    linux服务器之LVS、Nginx和HAProxy负载均衡器对比总结

    LVS特点: 1.抗负载能力强,使用IP负载均衡技术,只做分发,所以LVS本身并没有多少流量产生; 2.稳定性、可靠性好,自身有完美的热备... 可以采用ipvsadm –p(persistence)来保持session,默认是300/s Nginx特点:

    nginx+haproxy.docx

    - **IP Hash**:通过计算客户端IP地址的哈希值来决定请求的转发目标,确保来自同一客户端的请求始终发送到同一台后端服务器,解决了Session会话问题。 - **Fair**:一种第三方模块,基于后端服务器的响应时间进行...

    分布式web技术介绍03分布式web服务框架组件-负载均衡 共7页.ppt

    Nginx可以通过ip_hash实现Session保持,但对后端服务器的健康检查较为有限,仅支持通过端口检测。不过,Nginx在处理动态内容和流量控制方面表现优秀。 在实际应用中,为了克服LVS的部分局限性,可以采用ali-LVS,它...

    Nginx实现集群的负载均衡配置过程解析

    与网络层的LVS(Linux Virtual Server)不同,Nginx工作在应用层,无需对IP或内核进行特殊配置,只需简单地将用户请求转发到后端服务器,这使得后端服务器无需暴露公网IP即可接收请求。 实验环境中,我们假设有一个...

    开源基础架构和集群最佳实践

    为了解决客户端请求可能被分发到不同的后端服务器而导致的Session丢失问题,通常采用以下方法之一实现Session共享: 1. **基于Cookie**: 使用Cookie记录客户端Session信息。 2. **基于数据库**: 将Session数据存储...

    完全用nosql轻松打造千万级数据量的微博系统

    MySQL和Redis分别用来存储用户数据和Session信息。Tokyo Cabinet用来存储物物理数据。 我们的系统架构具有很高的可扩展性和高可用性,能够轻松地处理千万级数据量的微博系统。同时,我们的系统架构也具有很高的实时...

    运维142问不看一定后悔

    12. **LVS与nginx区别**:LVS专注于负载均衡,而nginx作为Web服务器,可处理HTTP/HTTPS请求,同时支持负载均衡。 13. **负载均衡的作用**:提高服务可用性,防止单一服务器过载,提高系统容错能力。 14. **nginx...

    Web网站架构详解.docx

    负载均衡是确保高可用性和扩展性的关键,包括DNS负载均衡、四层负载均衡(如F5、LVS)和七层负载均衡(如Nginx、haproxy)。根据网络环境和需求,选择合适的负载均衡策略对于优化系统性能至关重要。 7. **分布式...

    JAVA集群部署

    本文将详细介绍一个基于14台机器的JAVA集群部署方案,包括LVS负载均衡、Tomcat集群、MySQL主从复制、Nginx动静态分离、Hadoop集群、Memcached/Redis缓存服务以及消息队列等关键技术的应用。 #### 二、架构概述 该...

    第3周 3WEB技术-tomcat 会话同步.html

     nginx: ip_hash 、 haproxy: source 、 lvs: sh (2) session cluster:delta session manager 基于tomcat集群会话保持 分析:tomcat自身带的机制 session cluster,基于组播的方式,一个tomcat 被用户登录访问,...

    负载均衡软件生态分析.docx

    综上所述,选择负载均衡软件应根据实际需求进行,例如中小规模Web应用可以选择Nginx,大型网站或需要高并发处理的场景可以考虑LVS,而HAProxy则适用于对HTTP协议处理有特殊需求的环境。每种工具都有其独特的优势和...

    9.2: 网站架构演变 、 LNP+Mariadb数据库分离 、 Web服务器集群 、 总结和答.docx

    3. Web 服务器集群与 Session 保持:可以通过 Nginx、Haproxy 代理服务器实现 Web 负载均衡集群,也可以使用 LVS 调度器实现 Web 负载均衡集群。部署完 Web 集群后还需要考虑如何进行 Session 会话保持。 4. 动静...

    分布式web技术介绍 分布式web服务框架 共19页.pptx

    框架推荐了如LVS、Tengine、Nginx、HAProxy等软件来实现负载均衡,它们能够有效地将流量分发到不同的服务器,确保系统的稳定性和高可用性。同时,缓存机制如Varnish、Squid或Nginx被用来加速静态内容的分发,减少...

    基于haproxy构建负载均衡集群.docx

    4. source,表示根据请求源 IP,这个跟 Nginx 的 IP_hash 机制类似,我们用其作为解决 session 问题的一种方法,建议关注。 5. ri,表示根据请求的 URI。 6. rl_param,表示根据请求的 URl 参数‘balance url_param...

    高并发解决方案1

    Nginx虽然功能强大,但可能存在单点故障问题,通常工作在网络7层,适合处理静态内容和反向代理。 在实际部署中,通常会设置负载主机、负载备机以及多个真实服务器。例如,配置四台服务器,分别作为负载主机、负载备...

Global site tag (gtag.js) - Google Analytics