LVS 介绍
lvs 负载均衡( linux virtual server),linux虚拟服务器,是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发,目前是负载均衡性能最好的集群系统。
负载均衡原理
传统实现负载均衡:DNS ,算法单一、对后方没有健康检测
负载均衡方法:
DR> Tun > NAT> fullNAT
前三种没有抗攻击能力,且对后端没有健康检测
最后一个有上述两种功能,但性能相对较差,不过硬件可以弥补
大概实现过程:
C(Client) ----> DR —> RS ----> C(Client)
1.进行lvs集群的搭建
环境搭建:client --> DR -->RS -->client
安装的是管理工具,第一种叫ipvsadm,第二种叫keepalive
ipvsadm是通过命令行管理,而keepalive读取配置文件管理
本次负载均衡实验采用DR模式,
server1为DR
server23为RS
server1:
yum install -y ipvsadm
新建一个虚拟服务,它需要有一个vip(virtual ip)
ip addr add 172.25.76.100/24 dev eth0
查看ip
ip addr
添加虚拟服务以及将其关联到真实服务器上去
ipvsadm -A -t 172.25.76.100:80 -s rr # 添加虚拟服务
ipvsadm -a -t 172.25.76.100:80 -r 172.25.76.2:80 -g #将虚拟服务关联到真实服务上
ipvsadm -a -t 172.25.76.100:80 -r 172.25.76.3:80 -g #LVS默认无80端口,需另外添加新的虚拟IP记录
添加之后,查看配置结果
可以看到server23都同步了
ipvsadm -ln
ipvsadm-save -n > /etc/sysconfig/ipvsadm (保存配置)
2.后端(real server)提供服务
server23:
yum install -y httpd
systemctl enable --now httpd
echo server2(3)>/var/www/html/index.html
real server禁用arp
##在DR(直连)模式中,客户端想要通过vip访问到真实后端的资源,要求调度节点和后端都要有相同的vip,但是同时会有一个问题产生 DR模式下,调度节点和真实服务器在一个vlan(同一个网段)里面,并且拥有相同的vip,那么其它主机访问vip的时候如何能够根据实现定义好的调度算法正确的在两个real server之间完成调度呢?
我们可以禁用后端的arp(地址广播协议),让主机不要对外广播自己的vip地址,就相当于不要告诉别人我有这个ip,链路层的传输只需要mac地址而不需要通过ip
在真机curl一下添加的vip地址
curl 172.25.76.100
访问不到资源但是在server1上可以看到调度次数:
这是因为没有在server2,3上添加vip
给两台服务器上的网卡绑定VIP地址
[root@server2 ~]# ip addr add 172.25.76.100/32 dev eth0
[root@server3 ~]# ip addr add 172.25.76.100/32 dev eth0
在真机上再curl 172.25.1.100
发现可以访问到资源,可以轮询调度
但是,现在的负载均衡还是有问题,因为此时能够负载均衡只是因为客户端随机访问到了server1上的vip所以才能够正常调度,正常情况下,server1、2、3上都有vip,因此客户端访问vip的时候可能会随机访问到这三个节点的任何一个节点上,那么我们该如何保证客户端在访问vip的时候只能访问到调度节点server1呢?这就需要禁用server2和server3节点的arp协议,让它们不对外广播vip地址
我们在真机上先抓出ip地址
arp -an | grep 100
记住这f4:67的结尾
然后删掉vip 再次抓出ip为空
这时候重新ping 172.25.76.100就可以使得vip重新过来
ping 172.25.76.100arp -an | grep 100
观察两次抓出的ip后面at后的数据是不一样的
因为第二次连接的是server2的vip
重新curl 172.25.76.100观察 全部都是server2
再次重复这次的操作后 我们发现at后的参数和最之前的一样了
但是这也是不对的,我们需要实现的是一直在server2,server3上负载均衡!
禁用arp协议:
使用arptables_jf工具(相当于arp防火墙)禁用
arptable只针对arp协议生效,只控制arp,不影响其它协议
在server2,server3上都要执行:
yum install arptables.x86_64 -y
[root@server2 html]# arptables -A INPUT -d 172.25.76.100 -j DROP[root@server2 html]# arptables -A OUTPUT -s 172.25.76.100 -j mangle --mangle-ip-s 172.25.76.2[root@server2 html]# systemctl restart arptables.service
[root@server3 html]# arptables -A INPUT -d 172.25.76.100 -j DROP[root@server3 html]# arptables -A OUTPUT -s 172.25.76.100 -j mangle --mangle-ip-s 172.25.76.3[root@server3 html]# systemctl restart arptables.service
查看策略
和前面一样,删掉ip节点重新ping一下,发现查到的ip地址的数据没有变化了,都是server1
这时候再进行负载均衡测试发现没有问题。
3.iptable(防火墙)与LVS调度是否有冲突
我们在server1也也装上apache服务编写发布页,再次访问vip,lvs是否能将我们的请求调度到server2和server3上面而不调度server1
在server1上:
yum install -y httpd
systemctl start httpd
echo server1 > /var/www/html/index.html
然后再次到真机进行负载均衡测试:
发现还是OK的,并没有调度server1
这个过程是怎么实现的呢 server1调度节点上的apache为什么不会被访问到
我们在防火墙INPUT链中添加相关策略再进行访问测试,在server1调度节点上添加防火墙策略:所有访问172.25.76.100的请求都丢弃,这时候我们再来客户端访问172.25.76.100,观察是否能够正常完成调度,如果无法调度,则说明防火墙策略优先级高。
server1
iptables -A INPUT -d 172.25.76.100 -j DROP
然后iptables -nL查看策略已经删掉
查看发现无响应
iptables -F (重置策略)
所以防火墙优先级最高,防火墙数据包过滤防火墙,只要数据包进来就会受到它的控制,轮不到ipvs生效
ipvsadm是一个管理工具,内核中的ipvs、iptables < kernel netfilter, iptables优先级最高
iptables允许输入:80 进入,ipvs标记读出:80 后续进入lvs策略(DR模式)
另一种情况 :某台RealServer 死了
server2或者server3上的httpd停掉!
systemctl stop httpd,然后进行负载均衡测试:
调度器依然正常工作,但客户端将会有错误连接提示,这就说明调度器并不关心后端real server的死活,即使已经down掉了也依然会对其进行调度 这时候,只需要删掉server2,或者server3上的 调度策略,这时候客户端在访问的时候就不会有错误信息提示了
ipvsadm -d -t 172.25.76.100:80 -r 172.25.76.2
4.Keepalive+LVS高可用
Keepalived 一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。
开启一台虚拟机server4准备测试lvs的高可用
[root@server1 ~]# yum install keepalived -y[root@server4 ~]# yum install ipvsadm keepalived -y
server1:
清除之前server1上的ipvsadm策略:
ipvsadm -C
删除server1上的vip
ip addr del 172.25.76.100/24 dev eth0
修改keepalive配置文件
cd /etc/keepalived
vim keepalived.conf
! Configuration File for keepalivedglobal_defs {notification_email {root@localhost #邮件通知,如果主机联网的话可以写外部邮箱,用于通知集群状态,写localhost本机的话需要安装mailx}notification_email_from keepalived@localhost #邮件来源smtp_server 127.0.0.1 #必须是本机smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr#vrrp_strict #禁掉这个选项vrrp_garp_interval 0vrrp_gna_interval 0}vrrp_instance VI_1 {%高可用部分,vrrp协议巧妙利用了路由器硬件的冗余state MASTER %主调度节点interface eth0virtual_router_id 76 #这个写自己的数字priority 100%优先级,只要设置backup优先级比master优先级低就可以advert_int 1%与backup之间每秒发一次心跳authentication {%认证auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.76.100# 写vip}}virtual_server 172.25.76.100 80 {%这部分相当于将lvs的策略以文本的方式写出来了,集群将会根据这部分内容来制定lvs策略delay_loop 6 %每隔6秒钟对后端做一次健康检查lb_algo rr %定义调度算法lb_kind DR%lvs模式(注意大小写)#persistence_timeout 50%50秒内同一个客户端发过来的请求将会交给同一个后端处理,为了看到效果,建议注释掉protocol TCPreal_server 172.25.76.2 80 {weight 1%权重TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 172.25.76.3 80 {weight 1TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 172.25.76.3 80 {weight 1TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3}}}
修改之后重启服务:
systemctl start keepalived
把2,3上的httpd服务都启动一下:
在真机负载均衡恢复:
这个时候如果停掉server3的httpd服务:
在server1上查看ipvsadm -ln
会提示有邮件
这个时候把server2也停掉httpd
此时打开前面下载好的server4
把server1上的 /etc/keepalived/keepalived.conf 复制到server4上
scp /etc/keepalived/keepalived.conf server4:/etc/keepalived/
修改一下:修改优先级为77和state为backup
然后启动服务:
启动server2,server3的httpd服务
systemctl start keepalived.serviceipvsadm -ln
ip addr
发现vip也出现了
查看server1 4的日志: cat /var/log/messages
以实现负载均衡
将server1的keepalive down掉之后,server4将接管成为master,并且获得vip和ipvs策略,仍然不影响客户端的正常访问,调度依然可以进行
如果server1再次启开keepalive,则server4又会称为backup,vip和ipvs策略都会迁移到server1上,因为server1优先级更高