做者: ISADBA|FH.CN 日期: 06/01/2012
转载请注明:
做者:ISADBA.COM|FH.CN
BLOG:http://isadba.com
原文:http://isadba.com/?p=67
LVS持久链接技术
lvs的持久性链接有两方面:
把同一个client的请求信息记录到lvs的hash表里,保存时间使用persistence_timeout控制,单位为秒。
persistence_granularity 参数是配合persistence_timeout的,在某些状况特别有用,他的值是子网掩码,表示持久链接的粒度,默认是255.255.255.255,也就是单独的client ip
,若是改为,255.255.255.0就是client ip一个网段的都会被分配到同一个real server。
一个链接建立后空闲时的超时时间,这个时间为3种
tcp的空闲超时时间
lvs收到客户端tcp fin的超时时间
udp的超时时间
如何查看这些值?
ipvsadm # 能够查看链接空闲的超时时间(persistent 10)。
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 122.225.32.142:http rr persistent 10
-> 122.225.32.137:http Route 1 0 1
-> 122.225.32.136:http Route 1 0 0
ipvsadm -L -timeout # 查看tcp tcpfin udp的超时时间
Timeout (tcp tcpfin udp): 900 120 300
他们是如何工做的?
ipvsadm -Lcn IPVS connection entries pro expire state source virtual destination TCP 00:57 NONE 110.184.96.173:0 122.225.32.142:80 122.225.32.136:80 TCP 01:57 FIN_WAIT 110.184.96.173:54568 122.225.32.142:80 122.225.32.136:80
当一个client访问vip的时候,ipvs或记录一条状态为NONE的信息,expire初始值是persistence_timeout的值,而后根据时钟主键变小,在如下记录存在期间,同一client ip链接上来,都会被分配到同一个后端。
FIN_WAIT的值就是tcp tcpfin udp的超时时间,当NONE的值为0时,若是FIN_WAIT还存在,那么NONE的值会重新变成60秒,再减小,直到FIN_WAIT消失之后,NONE才会消失,只要NONE存在,同一client的访问,都会分配到统一real server。
如何设置这些值?
persistence_timeout能够经过如下两种方法设置
ipvsadm -A -t 192.168.20.154:80 -s rr -p 60
注意:上面命令中红色标记的80端口,表示同一客户端访问服务器的80端口,会被定义到同一个real server,若是把80端口改成0,那么同一客户端访问服务器的任何服务都会被转发到同一real server。
修改keepalived配置文件,在虚拟服务器配置下面加入persistence_timeout 60
tcp tcpfin udp的配置
ipvsadm –set tcp tcpfin udp # ipvsadm –set 120 50 50 //实例
建议:tcpfin的值最好小于persistence_timeout的值,这样比较方便计算。
lvs持久性参考资料:
http://www.linuxvirtualserver.org/docs/persistence.html
lvs的持久链接
本文出自 “成长全记录” 博客,请务必保留此出处http://lymrg.blog.51cto.com/1551327/684681
因为HTTP是一种无状态协议,每次请求完毕以后就当即断开了,当用户浏览购物网站挑选商品的时候,看到一件商品加入购物车,此过程被重定向到了REALSERVER1上面来,当把第二件商品加入购物车又被重定向到了REALSERVER2上面,最后结帐的时候在REALSERVER2上面,只有一件商品,这显然是用户没法接受的,此时就须要一种持久链接机制,来把同一用户的HTTP请求在超时时间内都重定向到同一台REALSERVER,超时时间能够本身定义,好比说2个小时,在超时时间内服务器会不断追踪用户的访问请求,把某一用户的全部请求都转发到同一台REALSERVER上面,若是超时时间事后用户依然在访问,则默认按照每次两分钟的方式无限加长
这里的全部操做都以DR模型为例,试验环境参见:http://lymrg.blog.51cto.com/1551327/660925
对于LVS的持久链接来讲常见的分为三种PCC,PPC和基于防火墙标记的持久链接,下面咱们就来分别讨论
PCC
PCC用来实现把某个用户的全部访问在超时时间内定向到同一台REALSERVER,这种方式在实际中不经常使用
ipvsadm -A -t 192.168.0.1:0 -s wlc -p 600(单位是s) ipvsadm -a -t 192.168.0.1:0 -r 192.168.1.2 -w 4 -g ipvsadm -a -t 192.168.0.1:0 -r 192.168.1.3 -w 2 -g
此时测试一下会发现经过HTTP访问VIP和经过SSH登陆VIP的时候都被定向到了同一台REALSERVER上面了
PPC
PPC用来把某个用户对同一服务的访问在超时时间内定向到同一台REALSERVER
ipvsadm -A -t 192.168.0.1:80 -s wlc -p 600 ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.2 -w 4 -g ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.3 -w 2 -g ipvsadm -A -t 192.168.0.1:22 -s wlc -p 300 ipvsadm -a -t 192.168.0.1:22 -r 192.168.1.2 -g ipvsadm -a -t 192.168.0.1:22 -r 192.168.1.3 -g
此时再测试会发现某个用户在超时时间内对于某个服务的访问都会被重定向到同一台REALSERVER上面
防火墙标记
基于防火墙标记的持久链接
对于电子商务网站来讲,用户在挑选商品的时候使用的是80端口来浏览的,当付款的时候则是经过443的ssl加密的方式,固然当用户挑选完商品付款的时候咱们固然不但愿https的443跳转到另一台REALSERVER,很显然应该是同一REALSERVER才对,这时候就要用到基于防火墙标记的持久链接,经过定义端口的姻亲关系来实现
首先两个REALSERVER要配置SSL,很明显证书应该也是同样的
定义端口的姻亲关系,给80和443端口打上一样的防火墙标记
配置实现基于防火墙标记的LVS
yum install mod_ssl 两个服务器上面都安装一下
在REALSERVER1上面。也就是192.168.1.2上面以下操做
cd /etc/pki/tls/certs/ make httpd.pem #此种SSL证书的生成方式只为测试,在实际操做中构建
SSL参见我博客前面的完整步骤
填写相关信息,主机名称必定要和VIP在互联网上面解析的DNS名称一致
cp httpd.pem /etc/httpd/ vi /etc/httpd/conf.d/ssl.conf # 找到以下行启用而且修改 DocumentRoot "/var/www/html" ServerName www.test.org:443 #这里修改成你得服务器名称 # 修改证书路径 SSLCertificateFile /etc/httpd/httpd.pem SSLCertificateKeyFile /etc/httpd/httpd.pem scp httpd.pem 192.168.1.3:/etc/httpd scp /etc/httpd/conf.d/ssl.conf 192.168.1.3:/etc/httpd/conf.d/
防火墙添加mark
iptables -t mangle -A PREROUTING -d 192.168.0.1 -p tcp --dport 80 -j MARK --set-mark 10 (0-99范围) iptables -t mangel -A PREROUTING -d 192.168.0.1 -p tcp --dport 443 -j MARK --set-mark 10 ipvsadm -A -f 10 -s wlc -p 600 ipvsadm -a -f 10 -r 192.168.1.2 -g -w 4 ipvsadm -a -f 10 -r 192.168.1.3 -g -w 2
本文出自 “成长全记录” 博客,请务必保留此出处http://lymrg.blog.51cto.com/1551327/684681
关于arp_announce和arp_ignore
http://lymrg.blog.51cto.com/1551327/660925
VS/DR或VS/TUN应用的一种模型中(全部机器都在同一个物理网络),全部机器(包括Director和RealServer)都使用了一个额外的IP地址,即VIP。
当一个客户端向VIP发出一个链接请求时,此请求必需要链接至Director的VIP,而不能是RealServer的。由于,LVS的主要目标就是要Director负责调度这些链接请求至RealServer的。所以,在Client发出至VIP的链接请求后,只能由Director将其MAC地址响应给客户端(也多是直接与Director链接的路由设备),而Director则会相应的更新其ipvsadm table以追踪此链接,然后将其转发至后端的RealServer之一。
若是Client在请求创建至VIP的链接时由某RealServer响应了其请求,则Client会在其MAC table中创建起一个VIP至RealServer的对就关系,并以致进行后面的通讯。此时,在Client看来只有一个RealServer而没法意识到其它服务器的存在。
为了解决此问题,能够经过在路由器上设置其转发规则来实现(静态的MAC-IP绑定)。固然,若是没有权限访问路由器并作出相应的设置,则只能经过传统的本地方式来解决此问题了。 这些方法包括:
禁止RealServer响应对VIP的ARP请求;
在RealServer上隐藏VIP,以使得它们没法获知网络上的ARP请求;
基于“透明代理(Transparent Proxy)”或者“fwmark (firewall mark)”;
禁止ARP请求发往RealServers;
传统认为,解决ARP问题能够基于网络接口,也能够基于主机来实现。Linux采用了基于主机的方式,由于其能够在大多场景中工做良好,但LVS却并不属于这些场景之一,所以,过去实现此功能至关麻烦。如今能够经过设置arp_ignore,arp_announce,这变得相对简单的多了。
Linux 2.2和2.4(2.4.26以前的版本)的内核解决“ARP问题”的方法各不相同,且比较麻烦。幸运的是,2.4.26和2.6的内核中引入了两个新的调整ARP栈的标志(device flags):arp_announce和arp_ignore。基于此,在DR/TUN的环境中,全部IPVS相关的设定都可使用arp_announce=2和arp_ignore=1/2/3来解决“ARP问题”了。如下是官方说明:
arp_annouce:
Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface; 0 - (default) Use any local address, configured on any interface. 1 - Try to avoid local addresses that are not in the target's subnet for this interface. 2 - Always use the best local address forthis target. arp_ignore: Define different modes for sending replies in response to received ARP requests that resolve local target IP address. 0 - (default): replyfor any local target IP address, configured on any interface. 1 - reply only if the target IP address is local address configured on the incoming interface. 2 - reply only if the target IP address is local address configured on the incoming interface and both with the sender's IP address are part from same subnet on this interface. 3 - do not reply for local address configured with scope host,only resolutions for golbal and link addresses are replied. 4-7 - reserved 8 - do not reply for all local addresses
arp_announce 定义了网卡在向外宣告本身的MAC-IP时候的限制级别,有三个值: 0:默认值,无论哪块网卡接收到了ARP请求,只要发现本机有这个MAC都给与响应 1:尽可能避免响应ARP请求中MAC不是本网卡的,一个主机有多块网卡,其中一块网卡接收到了ARP请求,发现所请求的MAC是本机另外一块网卡的,这个时候接收到ARP请求的这块网卡就尽可能避免响应 2:老是使用最合适的网卡来响应,一个主机有多块网卡,其中一块网卡接收到了ARP请求,发现所请求的MAC是本机另外一块网卡的,这个时候接收到ARP请求的这块网卡就必定不响应,只有发现请求的MAC是本身的才给与响应
arp_ignore 定义了网卡在响应外部ARP请求时候的响应级别,这里有8个值,但咱们只使用了2个 0:默认值,无论哪块网卡接收到了ARP请求,只要发现本机有这个MAC都给与响应 1:老是使用最合适的网卡来响应,一个主机有多块网卡,其中一块网卡接收到了ARP请求,发现所请求的MAC是本机另外一块网卡的,这个时候接收到ARP请求的这块网卡就必定不响应,只有发现请求的MAC是本身的才给与响应在RealServers上,VIP配置在本地回环接口lo上。若是回应给Client的数据包路由到了eth0接口上,则arp通告或请应该经过eth0实现,所以,须要在sysctl.conf文件中定义以下配置: vim /etc/sysctl.conf net.ipv4.conf.eth0.arp_ignore = 1 net.ipv4.conf.eth0.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 以上选项须要在启用VIP以前进行,不然,则须要在Drector上清空arp表才能正常使用LVS。
关于链接追踪
到达Director的数据包首先会通过PREROUTING,然后通过路由发现其目标地址为本地某接口的地址,所以,接着就会将数据包发往INPUT(LOCAL_IN HOOK)。此时,正在运行内核中的ipvs(始终监控着LOCAL_IN HOOK)进程会发现此数据包请求的是一个集群服务,由于其目标地址是VIP。因而,此数据包的原本到达本机(Director)目标行程被改变为经由POSTROUTING HOOK发往RealServer。这种改变数据包正常行程的过程是根据IPVS表(由管理员经过ipvsadm定义)来实现的。
若是有多台Realserver,在某些应用场景中,Director还须要基于“链接追踪”实现将由同一个客户机的请求始终发往其第一次被分配至的Realserver,以保证其请求的完整性等。其链接追踪的功能由Hash table实现。Hash table的大小等属性可经过下面的命令查看:
ipvsadm -Lcn
为了保证其时效性,Hash table中“链接追踪”信息被定义了“生存时间”。LVS为记录“链接超时”定义了三个计时器:
空闲TCP会话;
客户端正常断开链接后的TCP会话;
无链接的UDP数据包(记录其两次发送数据包的时间间隔);
上面三个计时器的默认值能够由相似下面的命令修改,其后面的值依次对应于上述的三个计时器:
ipvsadm --set 28800 30 600
数据包在由Direcotr发往Realserver时,只有目标MAC地址发生了改变(变成了Realserver的MAC地址)。Realserver在接收到数据包后会根据本地路由表将数据包路由至本地回环设备,接着,监听于本地回环设备VIP上的服务则对进来的数据库进行相应的处理,然后将处理结果回应至RIP,但数据包的原地址依然是VIP。
DIP要配置在接口上,VIP要配置在接口别名上
在前端服务器上的配置(配置VIP)
ifconfig eth0:0 $192.168.0.1 broadcast $192.168.0.1 netmask 255.255.255.255 up route add -host $192.168.0.1 dev eth0:0 route add -host $192.168.1.1 dev eth0 echo 1 >/proc/sys/net/ipv4/ip_forward
在REALSERVER上面的配置
RIP要配置在接口上,VIP要配置在lo的别名上
定义内核参数,禁止响应对VIP的ARP广播请求
echo 1>/proc/sys/net/ipv4/conf/lo/arp_ignore echo 1>/proc/sys/net/ipv4/conf/all/arp_ignore echo 2>/proc/sys/net/ipv4/conf/lo/arp_announce echo 2>/proc/sys/net/ipv4/conf/all/arp_announce
配置VIP
ifconfig lo:0 $192.168.0.1 broadcast $192.168.0.1 netmask 255.255.255.255 up route add -host 192.168.0.1 dev lo:0 # 确保若是请求的目标IP是$VIP,那么让出去的数据包的源地址也显示为$VIP
在前端服务器配置并启动服务
ipvsadm -A -t 192.168.0.1:80 -s wlc ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.2 -g -w 4 ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.3 -g -w 2 ipvsadm -L -n ab -c -n 10000 http://192.168.0.1/index.html watch -n 1 'ipvsadm -L -n'