尽管我们选择了LVS的分发方法,但是大多时候我们要保证返回给客户端的所有响应请求必须来自于同一台Real Server,这里我们就要用到LVS Persistence(持久性)。当使用SSL会话的时候,我们常常期望只交换一次密钥就可以建立永久连接,因此,LVS持久性在SSL会话中经常被用到。
使用LVS持久性的时候,Director在内部使用一个连接根据记录称之为“持久连接模板”来确保所有来自同一个客户端的请求被分发到同一台Real Server上。
LVS 持久性类型分为PCC、PPC、PNMP、混合类型:
1、Persistent client connections
来自同一客户端所有服务的请求都被重定向到同一台Real Server上,以IP地址为准。PCC是一个虚拟服务没有端口号(或者端口号为0),以"-p" 来标识服务。
缺点是定向所有服务,期望访问不同的Real Server无法实现。
假设一个用户在访问购物网站时同时使用HTTP(80)和HTTPS(443)两种协议,就需要这样定义:
ipvsadm -A -t 192.168.110.1:0 -s rr -p
ipvsadm -a -t 192.168.110.1:0 -r 192.168.110.2 -m
ipvsadm -a -t 192.168.110.1:0 -r 192.168.110.3 -m
2、Persistent port connections
来自同一服务的请求都被重定向到同一台Real Server上,以端口号为准。例如:client---->LVS(80,22)---->RS1
client---->LVS(23)---->RS2
缺陷:期望访问不同的端口到同一台RS上,无法实现。
3、Persistent Netfilter Marked Packet persistence
根据iptables 的规则,将对于某类服务/几个不同端口的访问定义为一类。具体过程是先对某一特定类型的数据包打上标记,然后再将基于某一类标记的服务送到后台的Real Server上去,后台的Real Server 并不识别这些标记。
由于LVS-DR模型作了网卡别名,所以并不适合PNMP,因此PNMP只能用在LVS-NAT模式下:
# iptables -t mangle -A PREROUTING -i eth0 -d 192.168.110.1 -p tcp --dport 80 -j MARK --set-mark 2
# ipvsadm -A -f 2 -s wlc -p 3600
# ipvsadm -a -f 2 -r 192.168.110.2 -m -w 2
# ipvsadm -a -f 2 -r 192.168.110.3 -m -w 5
服务状态
# ipvsadm -Ln
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 2 wlc persistent 3600
-> 192.168.110.3:0 Masq 5 0 70
-> 192.168.110.2:0 Masq 2 0 0
来自同一客户端的访问请求都被分发到192.168.110.3这台Real Server上去了。
将持久和防火墙标记结合起来就能够实现端口姻亲功能,只要是来自某一客户端的对某一特定服务(需要不同的端口)的访问都定义到同一台Real Server上去。
假设这样一种场景:一个用户在访问购物网站时同时使用HTTP(80)和HTTPS(443)两种协议,我们需要将其定义到同一台Real Server上,而其他的服务不受限制,可以这样来实现:
这里会用到根CA,读者如果不清楚的话可以看看小编原来的博客
Real Server 1:
# cd /etc/pki/tls/certs/
# make httpd.pem //做一个自签名证书,内容如8-1示:
图 8-1
# mv httpd.pem /etc/httpd/ //将证书存放在httpd目录下;
# yum install mod_ssl -y //为Web服务添加openssl功能;
# cd conf.d/
# vim ssl.conf
SSLCertificateFile /etc/httpd/httpd.pem // 指定证书位置;
SSLCertificateKeyFile /etc/httpd/httpd.pem //指定密钥位置;
重启httpd 服务。
# vim /etc/hosts //修改IP地址到主机名的映射;
192.168.110.2 web1.a.com web1
Real Server 2 证书的配置过程同Real Server 1过程一样,在此不再赘述,证书内容如图8-2所示:
# make -C /etc/pki/tls/certs httpd.pem
图 8-2
# vim /etc/hosts // 修改IP地址到主机名称的映射;
192.168.110.3 web2.a.com web2
Director:
为客户端对http(80)服务、https(443)服务的访问打上标记5:
# iptables -t mangle -A PREROUTING -d 192.168.110.1 -p tcp --dport 80 -j MARK --set-mark 5
# iptables -t mangle -A PREROUTING -d 192.168.110.1 -p tcp --dport 443 -j MARK --set-mark 5
# ipvsadm -A -f 5 -s wlc -p //定义服务;
# ipvsadm -a -f 5 -r 192.168.10.2 -m -w 2 //添加Real Server;
# ipvsadm -a -f 5 -r 192.168.10.3 -m -w 5 // 添加Real Server;
# ipvsadm -Ln
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 5 wlc persistent 3600
-> 192.168.110.3:0 Masq 5 0 23
-> 192.168.110.2:0 Masq 2 0 0
使用Windows客户端访问的时候要修改C:\WINDOWS\system32\drivers\etc\hosts 文件,添加两条名称解析记录:
192.168.110.1 web1.a.com
192.168.110.1 web2.a.com
使其能够解析192.168.0.127所对应的主机名。
此时客户端无论是 访问192.168.110.1的http服务还是https 服务都会被定义到同一台Real Server上去。
4、FTP Connections
众所周知FTP在被动模式下,所使用的数据传输的端口不是固定的,这就使我们在定义持久性时无法为其打上标签。此时我们可以指定一个范围,将范围内的端口打上标记,然后使VSFTPD在被动模式下不再使用随机端口,而是使用范围内的随机端口,从而实现FTP的负载均衡。具体实现如下:
修改vsftpd的主配置文件定义在被动模式下使用的端口的范围:
vim /etc/vsftpd.conf:
pasv_min_port=10000
pasv_max_port=20000
必须保证在LVS-NAT集群模式下,服务端返回给客户端的数据包的源地址为VIP,而不是Real Server 的RIP,在vsftpd的主配置文件中添加一行:
vim /etc/vsftpd.conf
pasv_address=VIP
在Director上使用iptables定义端口:
iptables -t mangle -A PREROUTING -p tcp -d VIP --dport 21 -j MARK --set-mark 21
iptables -t mangle -A PREROUTING -p tcp -d VIP --dport 10000:20000 -j MARK --set-mark 21
好嘞,LB的东东小编算是给讲完啦,不知读者你收到多少啦,LB群集能很好的实现各种应用的负载均衡啦,非常的实用,可是读者还要考虑一个问题,万一前端的Director死掉啦咋办啦,还记得HA吧,呵呵,把HA群集的关键业务设置成处理Director,不就解决了么,这就是HA+LB的群集架构啦,读者可以去自己动手先做一做,小编会在之后的博客中附上HA+LB+NAS的实现啦,敬请关注