LVS负载均衡实战
LVS有四种集群类型:
1.LVS/NAT(地址转换)
2.LVS/DR(直接路由)
3.LVS/TUN(隧道)
4.LVS/FULLNAT
这里我们就进行LVS/(DR/NAT)类型的实战,如果想详细了解LVS,可以参考https://www.cnblogs.com/clsn/p/7920637.html#auto_id_22
一、集群环境说明
主机名 | IP地址 | 软件 | 系统版本 |
lb1 | 192.168.231.150 | lvs keepalived | CentOS release 6.6 (Final) |
lb2 | 192.168.231.151 | lvs keepalived | CentOS release 6.6 (Final) |
rs1 | 192.168.231.152 | Apache | CentOS release 6.6 (Final) |
rs2 | 192.168.231.153 | Apache | CentOS release 6.6 (Final) |
VIP为:192.168.231.154
这一个实验没用到lb2,可以不进行配置。
注意:实验前关闭iptables和selinux。
二、LVS/DR实战
1.在rs1和rs2中yum安装Apache
yum install httpd -y
然后在/var/www/html/目录中创建index.html文件
rs1:
echo "web1" > /var/www/html/index.html
rs2:
echo "web2" > /var/www/html/index.html
进行测试:
[root@lb1 ~]# curl 192.168.231.152
web01
[root@lb1 ~]# curl 192.168.231.153
web02
2.在lb1和lb2安装ipvsadm管理工具
yum install ipvsadm -y
查看当前LVS状态,顺便激活LVS内核模块
ipvsadm
3.在lb1和lb2中进行相关配置
配置LVS负载均衡服务步骤:
1.在eth0网卡上绑定VIP地址,并设置广播地址和掩码
2.添加路由
3.开启路由转发功能
4.清空LVS规则
5.添加虚拟服务(-A),-t指定虚拟服务的IP端口,-s指定调度算法
6.在虚拟服务中添加真实服务器(-a),-r真实服务器,-gDR类型,-w真实服务器权重
7.查看配置后的LVS规则
命令集
[root@lb1 ~]# ifconfig eth0:0 192.168.231.154 broadcast 192.168.231.154 netmask 255.255.255.255
[root@lb1 ~]# route add -host 192.168.231.154 dev eth0:0
[root@lb1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@lb1 ~]# ipvsadm -C
[root@lb1 ~]# ipvsadm -A -t 192.168.231.154:80 -s rr
[root@lb1 ~]# ipvsadm -a -t 192.168.231.154:80 -r 192.168.231.152:80 -g -w 1
[root@lb1 ~]# ipvsadm -a -t 192.168.231.154:80 -r 192.168.231.153:80 -g -w 2
[root@lb1 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.231.154:80 rr
-> 192.168.231.152:80 Route 1 0 0
-> 192.168.231.153:80 Route 2 0 0
lb1配置完成
4.配置rs1和rs2
配置步骤:
1.修改arp_ignore和arp_announce响应级别
2.添加VIP地址到lo接口上,并配置网关,掩码
3.配置路由
命令集
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0 192.168.231.154 broadcast 192.168.231.154 netmask 255.255.255.255
route add -host $VIP dev lo:0
配置arp_ignore和arp_announce可以用一个脚本进行,方便以后实验用到,set.sh:
#!/bin/bash
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/all/arp_announce
;;
stop)
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/all/arp_announce
;;
esac
配置后可以查看是否绑定VIP:
[root@rs1 script]# ip addr list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 192.168.231.154/32 brd 192.168.231.154 scope global lo:0
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:d2:c3:35 brd ff:ff:ff:ff:ff:ff
inet 192.168.231.152/24 brd 192.168.231.255 scope global eth0
inet6 fe80::20c:29ff:fed2:c335/64 scope link
valid_lft forever preferred_lft forever
arp_ignore和arp_announce参数:
为什么VIP要设置在lo接口上?
要让RS能够处理目标地址为VIP的包,那就要让RS能够接受到,而在lo接口上进行配置VIP就能够接受并将结果返回。如果配置在eth0网卡上,就会影响RS的ARP请求,造成ARP缓存表混乱,使集群不能工作。
为什么要抑制ARP响应?
客户端发起请求,进行广播,请求VIP的MAC地址,RS都能收到请求,DR也能收到请求,都会进行响应,那么前端路由就会混乱,不知道发送到那里(可能响应快的服务会响应请求),所以RS就需要定义arp配置
arp_ignore: 定义接收到ARP请求时的响应级别;
0:只要本地配置的有相应地址,就给予响应;
1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应;
arp_announce:定义将自己地址向外通告时的通告级别;
0:将本地任何接口上的任何地址向外通告;
1:试图仅向目标网络通告与其网络匹配的地址;
2:仅向与本地接口上地址匹配的网络进行通告;
测试访问:
火狐浏览器,按F5一直刷新,就可以看到访问的RS的不同,及实现负载均衡
而实现LVS/NAT就是把两个RS的网关修改为DS的网关即可。
LVS持久连接
无论使用什么算法,LVS持久都能实现在一定时间内,将来自同一个客户端请求派发至此前选定的RS。
在基于SSL,需要用到持久连接;
1、 ipvsadm带有持久连接模板:
ipvsadm -A|E … -p timeout
timeout: 持久连接时长,默认300秒;单位是秒;
直接修改
ipvsadm -E -t 192.168.231.154:80 -s rr -p 300
测试:
长按F5,会一直显示web02
2.PNMPP:持久防火墙标记连接
iptables -t mangle -A PREROUTING -d 192.168.231.154 -i eth0 -p tcp --dport 80 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -d 192.168.231.154 -i eth0 -p tcp --dport 23 -j MARK --set-mark 8
ipvsadm -A -f 8 -s rr -p 300定义防火墙标记为服务
ipvsadm -a -f 8 -r 192.168.231.152 -g -w 3
ipvsadm -a -f 8 -r 192.168.231.153 -g -w 3
测试:
23号端口可以用telnet命令测试
下一篇将进行LVS+keepalived高可用搭建