您的位置:首页 > 理论基础 > 计算机网络

linux lvs持久链接和防火墙标记实现http和https共享同一集群服务

2014-05-09 12:55 531 查看
在对web服务做lvs负载均很集群的时候(这里主要考虑dr模式中的rr调度算法,weight都为1),有一种问题就是如何让session共享。例如一个用户登录了一个网站,此时负载均衡到的一个服务器是a服务器,然后发表帖子以后,由于负载均衡的影响,会马上负载均衡到b服务器,由于session是保存在服务器端的,这个时候用户的session在a服务器上,b服务器上没有这个session信息,就会弹出让用户重新登录的信息出来。我们知道可以通过memcache共享session的机制来实现服务器之间的session同步,这里我们采用另一种方式-lvs的持久链接来解决这样一个问题。

lvs的持久连接就是通过ipvsadm的一个选项来实现,其主要目的就是可以通过持久化的机制,来保证用户的每次访问都跳转到同一个服务器上面,而忽略调度算法的影响。这样就可以让用户后续的操作都负载均衡到同一台服务器上,这样就可以避免服务器之间共享session造成的影响。

但是同时还有一个问题,lvs的dr模型不能像nat模式那样做端口映射功能。在某些网站,可能有些时候为了保证数据的安全,其采用了https协议。比如csdn的登陆页面就是这种形式。这样刚开始的时候用户可能走的是80端口,然后登陆的时候就跳到443(https的默认端口)端口,由于dr模式的局限性,不能实现不同的两个端口当做一个集群来实现,所以必须借组另外一种方式来实现把两个不同的端口当做同一个集群来使用,这就是iptables的防火墙标记可以帮忙处理的事情。

要使用iptables的防火墙标记功能,默认的方法是:iptables -t mangle -A PREROUTING -d $DIP -p tcp --dport $DPORT -j MARK --set-mark $NUM。$DIP是本地的ip地址,$DPORT是要访问本地的端口,$NUM是防火墙标记位。如果想让2个不同的端口当做同一个集群服务的话,这里的$NUM的值要一样。现在对80端口和443端口做一个防火墙标记来实现同一集群服务:

iptables -t mangle -A PREROUTING -d $DIP -p tcp --dport 80 -j MARK --set-mark 100

iptables -t mangle -A PREROUTING -d $DIP -p tcp --dport 443 -j MARK --set-mark 100

这样就把http和httpd协议当做同一个集群服务了,下面只需要在VIP的机子上执行:

ipvsadm -A -f 100 -s rr -p 300

ipvsadm -a -f 100 -r $REALSERVER1 -g

ipvsadm -a -f 100 -r $REALSERVER2 -g

-f选项就表明了这次的集群我们采用了防火墙标记的方式,后面的100就是我们上面iptables定义的MARK标记值。-p指定了超时时间,默认是600秒。当把所有的服务正常启动以后,来自同一客户端的请求,不管是http还是https协议的,都会被负载均衡到同一服务器上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: