1 概述
负载均衡集群设计时要注意两点:一是否需要会话保持;二是否需要共享存储,共享存储分为NAS,SAN,DS(分布式存储)
本文结合实验介绍了lvs-nat,lvs-dr,FWM的实现,同时介绍持久连接的相关配置
2 lvs-nat
设计要点:
(1) RIP与DIP在同一IP网络, RIP的网关要指向DIP
(2)支持端口映射
(3) Director要打开核心转发功能
实验:VS实现LVS-NAT模式的调度
实验环境准备:
iptables,selinux,关闭,服务器时间同步。
内网网段:172.18.0.0/16
外网网段:192.168.32.0/24
RS1和RS2分别开启httpS服务
client配置172网段ip:172.18.50.65
VS配置两个网卡,分别配置172网段和192网段,eth0 ip 172.18.50.72 eth1 ip 192.168.32.72
RS两台配置192网段 RS1 ip:192.168.32.63 RS2 ip: 192.168.32.73
RS1和RS2的网关要指向 VS 的192.168.32.72
client网关指向VS的172.18.50.72
拓扑图如下
在VS上配置如下三条命令
ipvsadm -A -t 172.18.50.72:443 -s rr
ipvsadm -a -t 172.18.50.72:443 -r 192.168.32.63:443 -m
ipvsadm -a -t172.18.50.72:443 -r 192.168.32.73 -m
如果改规则的时候出现报错,内存分配问题(Memory allocation problem),解决办法,清掉规则,全部重新添加
RS上配置https
VS上要启用路由转发功能。
echo 1 > /proc/sys/net/ipv4/ip_forward
转发功能要永久存盘,
centos7写入/etc/sysctl.d/99-sysctl.conf文件里
vim /etc/sysctl.d/99-sysctl.conf
net.ipv4.ip_forward=1
然后重启网络后生效
centos6写入/etc/sysctl.conf文件
/etc/sysctl.conf
net.ipv4.ip_forward=1
安装http和mod_ssl模块
yum –y install httpd mod_ssl
生成证书
注意,证书可以向CA中心申请,这个案例介绍如何生成自己前面的证书的另一个方法
生成自签名的证书
cd /etc/pki/tls/certs
make http.crt
生成证书http.crt和私有http.key,这里生成key时需要输入密码,这样每次重启httpd服务的时候,需要输入密码才能成功启动
去掉证书密码的命令如下
openssl rsa –in http.key –out http2.key
输入密码后可以生成新的
mv http.key http.key.bak
mv http2.key http.key
这样http.key就没有密码,重启http的时候就不需要输入密码
配置ssl文件,指定证书和私钥的路径
vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/conf.d/http.crt
SSLCertificateKeyFile /etc/httpd/conf.d/http.key
保存后重启http服务即可
将生成的私钥和证书发到另一台机器上,后端的RS的https服务的key和证书要同一个
后端RS的https服务配置完成后,到此,LVS-NAT配置完成,可以将请求调度到后端的https服务器
测试如下
for i in {1..10};do curl -k https://172.18.50.72;done;
结果为轮询调度63和73这两台RS
3 LVS-DR
dr模型中,各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1)在前端网关做静态绑定
(2)在各RS使用arptables
(3)在各RS修改内核参数,来限制arp响应和通告的级别
.限制响应级别:arp_ignore,选择1
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
.限制通告级别:arp_announce,选择2
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告
VIP建议配置在lo口上比较合理(虽然可以配置在任意网卡,但是建议配置在lo)
实验:VS实现LVS-DR模式的调度
环境如下:
五台机器的ip配置如下
host1-->client: eth1: 172.18.50.65/16
host2-->ROUTER: WAN: eth1:172.18.50.62/16
LAN: eth0:192.168.32.62/24
eth0:1 : 10.10.10.12/24
host3-->VS: eth33:192.168.32.72/24
eth33:1 10.10.10.10/24
host4-->RS1:eth0:192.168.32.63/24
lo:1 10.10.10.10/24
host5-->RS2:eth33:192.168.32.73/24
lo:1 10.10.10.10/24
注意:
RS上取消arp的响应和arp_announce
Router上配置三个ip,开启路由转发功能,同时在网卡eth0上配置独臂路由
VS和RS都配置默认的路由,网关都指向 Router LAN: eth0:192.168.32.62/24
VS和RS添加默认路由命令:route add default gw 192.168.32.62
DR模型不能基于端口调度
拓扑图如下
RS的一键配置脚本
#!/bin/bash
vip=10.10.10.10
mask='255.255.255.0'
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd&>/dev/null
service httpd start &> /dev/null && echo"The httpd Server is Ready!"
#echo "
`hostname`
" >/var/www/html/index.html
case $1 in
start)
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev$vip netmask $mask broadcast $vip up
route add -host$vip dev $dev
echo "The RSServer is Ready!"
;;
stop)
ifconfig $devdown
echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 0 >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "The RSServer is Canceled!"
;;
*)
echo "Usage:$(basename $0) start|stop"
exit 1
;;
esac
VS的一键配置脚本
#!/bin/bash
vip='10.10.10.10'
iface='ens33:1'
mask='255.255.255.0'
port='80'
rs1='192.168.32.63'
rs2='192.168.32.73'
scheduler='wrr'
type='-g'
rpm -q ipvsadm &> /dev/null || yum -y installipvsadm &> /dev/null
case $1 in
start)
ifconfig $iface$vip netmask $mask broadcast $vip up
iptables -F
ipvsadm -A -t${vip}:${port} -s $scheduler
ipvsadm -a -t${vip}:${port} -r ${rs1} $type -w 2
ipvsadm -a -t${vip}:${port} -r ${rs2} $type -w 1
echo "The VSServer is Ready!"
;;
stop)
ipvsadm -C
ifconfig $ifacedown
echo "The VSServer is Canceled!"
;;
*)
echo "Usage:$(basename $0) start|stop"
exit 1
;;
esac
测试如下
for i in {1..10};do curl http://172.18.50.72;done;
结果为轮询调度63和73这两台RS
注意,以上环境为生产环境的实际配置,如果不用要把VIP也设置为私有ip,如192.168.32.66,那么在路由器上就不需要多配置一个eth0:1的ip了,路由器上只需要配置两个ip就可以,其他配置都不变。
4 FireWallMark
.FWM:FireWall Mark
.MARK target可用于给特定的报文打标记
同一类服务实现统一调度。如http和https,这里需要加上Mark标记
默认工作模式是dr,默认的调度算法是wlc
--set-mark value
# value是在防火墙的策略上会显示为16进制数,可以随便定义,如这里定义value值是12,但是在防火墙上通过命令iptables –vnL -t mangle 看到的是0xc,是十六进制
.借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度
.实现方法:
.在Director主机打标记:
iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $port1,$port2,… -j MARK --set-markNUMBER
LVS上定义如下
.在Director主机基于标记定义集群服务和管理RS:
ipvsadm -A -f NUMBER [options1]
这里的iptions1可以定义算法,如跟上-s wrr
ipvsadm -a -f NUMBER -r real-server [options2]
这里的iptions2可以定义集群的类型,如-g表示dr模型
实验
在vs上配置
iptables -t mangle -A PREROUTING -d 192.168.32.66 -p tcp -m multiport--dports 80,443 -j MARK --set-mark 12
ipvsadm –A -f 12 -s wrr
ipvsadm -a -f 12 -r 192.168.32.63 -g -w 3
ipvsadm -a -f 12 -r 192.168.32.73 –g
RS配置可以参考LVS-dr的脚本配置
测试
for i in {1..10};docurl -k https://192.168.32.66;curl http://192.168.32.66;done;
结果是轮询调度后端RS的http和https服务。
5 持久连接
来自同一个服务的请求尽可能发到同一台后端的RS上处理。这里可以实现session绑定
注意LVS的算法,默认只有sh能够实现根据session来实现调度。其他的调度算法不能实现session绑定。但是sh的第一次是随机的,不能根据权重调度。
综合sh和其他算法,用持久连接的技术来实现。这是一个折中的方法。
-p [timeout]这个选项来实现持久连接,默认是360s,和man帮助里不一样,man里是300s,实际默认是360s
.session绑定:对共享同一组RS的多个集群服务,需要统一进行绑定,lvs sh算法无法实现
.持久连接(lvs persistence)模板:实现无论使用任何调度算法,在一段时间内(默认360s),能够实现将来自同一个地址的请求始终发往同一个RS
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
.持久连接实现方式:
.每端口持久(PPC):每个端口对应定义为一个集群服务,每集群服务单独调度
.每防火墙标记持久(PFWMC):基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity
.每客户端持久(PCC):基于0端口(表示所有服务)定义集群服务,即将客户端对所有应用的请求都调度至后端主机,必须定义为持久模式.但是实际生产不这么定义,因为这样相当于是把后端的服务都发布到公网了。
例子
ipvsadm -E -f 12 -s wrr -p 20
#这里的-p后面接数字20表示20秒内,同一客户端将会被调度到同一服务器上,如果跟数字20,就是默认的360