上一篇《企业系统架构——LB集群之LVS负载均衡介绍(3种工作模式)》讲解了DR模式的工作原理及其特点。此篇主要讲解DR模式的(加权)轮询调度器搭建及DR模式下的健康检测(ldirectord)。
1、搭建实验环境==
真机:做客户端client
虚拟机server1(172.25.76.1):做lvs调度器(DS)
虚拟机server2(172.25.76.2) :做后端的web服务器1(RS)
虚拟机server3(172.25.76.3):做后端的web服务器2(RS)
2、实验
在server1上搭建lvs调度器的DR模式:
步骤一:安装ipvsadm服务
ipvsadm工具介绍:
从2.4版本开始,linux内核默认支持LVS。要使用LVS的能力,只需安装一个LVS的管理工具:ipvsadm。
LVS的结构主要分为两部分:
yum install ipvsadm.x86_64 -y
步骤二:查看调度策略
ipvsadm -l # 做解析,慢
ipvsadm -ln # 不做解析,快
systemctl status ipvsadm.service #可以看到这个服务的启动脚本
vim /usr/lib/systemd/system/ipvsadm.service #查看开启这个服务的时候都干了一些什么
systemctl start ipvsadm.service #开启服务,错误
touch /etc/sysconfig/ipvsadm #建立编写策略的文件
systemctl start ipvsadm.service #开启服务,正确
systemctl status ipvsadm.service #再次查看服务的状态
vim /etc/sysconfig/ipvsadm-config
修改lvs服务的配置文件:no->yes,重启服务的时候保存策略
ipvsadm -A -t 172.25.12.100:80 -s rr #设置客户端进入lvs调度器的入口地址,调度算法是轮询
ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.2:80 -g #设置lvs的策略:入口的第一台后端服务器的信息
ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.3:80 -g #设置lvs的策略:入口的第二台后端服务器的信息
-s表示调度算法,rr表示轮询,-g表示lvs调度器工作在DR模式
查看策略文件:
步骤八:在lvs(server1)上面设置用户访问的入口地址vip
ip addr add 172.25.76.100/24 dev eth0
配置web后端服务器(server2):
步骤一:下载httpd服务
yum install httpd -y
步骤二:编辑默认发布页面文件
步骤三:在后端服务器1(server2)上面设置用户访问的入口地址
ip addr add 172.25.76.100/24 dev eth0 #临时添加ip,可在配置文件/etc/sysconfig/network-scripts/中永久添加
配置web后端服务器(server3):
步骤一:下载httpd服务
yum install httpd -y
步骤二:编辑默认发布页面文件
步骤三:在后端服务器1(server2)上面设置用户访问的入口地址
注意:在两个web服务器上设置用户访问的入口地址是为了web服务器可以直接给客户端发送资源,不需要再返回给调度器。
客户端问172.25.8.100要的资源,后端服务器直接把资源给客户端,客户端不会识别
因此要在两个后端服务器上面设置入口地址
客户端测试(真机):
查看server3的mac地址:
再次测试:
注意:此时客户端访问资源有时候轮询,有时候不轮询,出现这样的现象是为什么呢?
因为DR模式是通过 修改MAC地址 进行访问的,调度器和两台web服务器上都有172.25.76.100这个入口地址VIP,所以客户端在请求的时候,三台虚拟机都有可能回复请求,客户端会记录回复他的那台虚拟机的mac地址,所以下次在访问的时候他会找记录过的mac地址对应的虚拟机(有可能是真实的服务器)直接访问,这在现实中是 不允许 的,因为 如果请求全部发往后端某一台真正的服务器的话,这台服务器会因为压力过大而宕机。而且,直接访问后端的真正的服务器,我们的server1(LVS调度器)也就没有起到作用,并没有实现真正意义上的负载均衡,这也是DR模式的一个缺点。这就类似于DDOS攻击,有可能会导致后端服务器瘫痪,造成用户不能正常访问资源。
3、解决DR模式不轮询的问题
将真实服务器的lo接口的ARP响应关闭掉,当客户端进行ARP广播连接vip时,真实服务器将其屏蔽掉。
实现方式1:在iptables防火墙上添加策略
arptables:用户空间工具,用来 管理 linux内核中的ARP规则表。
这些规则用来检查ARP帧,arptables类似于iptables,但没有那么复杂。
iptables工作于ip层,用于对ip包进行管理。arptables工作与arp协议层,用于对arp数据帧进行管理。
arptables可以像iptables那样对arp数据帧进行各种规则设置,可以ACCEPT,DROP等
在真实服务器(server2)上:
步骤一:下载arptables服务
yum install arptables -y
arptables -nL
arptables -A INPUT -d 172.25.76.100 -j DROP #丢弃客户端的直接访问
arptables -A OUTPUT -s 172.25.76.100 -j mangle --mangle-ip-s 172.25.76.2 #使自己以172.25.76.100的身份发送资源给客户端
cat /etc/sysconfig/arptables #查看规则
arptables-save > /etc/sysconfig/arptables #保存策略
cat /etc/sysconfig/arptables #再次查看
systemctl start arptables.service #开启服务
systemctl status arptables.service #查看服务状态
在另一台真实服务器(server3)上:
步骤一:下载arptables服务
yum install arptables -y
arptables -nL
arptables -A INPUT -d 172.25.76.100 -j DROP #丢弃客户端的直接访问
arptables -A OUTPUT -s 172.25.76.100 -j mangle --mangle-ip-s 172.25.76.3 #使自己以172.25.76.100的身份发送资源给客户端
cat /etc/sysconfig/arptables #查看规则
arptables-save > /etc/sysconfig/arptables #保存策略
cat /etc/sysconfig/arptables #再次查看
systemctl start arptables.service #开启服务
systemctl status arptables.service #查看服务状态
客户端(真机)测试:
此时做完这个:就可以实现调度了
web2和web3就不会接受客户端的请求了,每次客户端的访问只能由调度器接受。
只有调度器才会接收这个请求,因此也就是通过访问lvs调度器的MAC地址,调度器改写请求报文的目标MAC地址,因此可以实现访问调度器,调度器转向RS上,将内容直接返回客户。
通过调度器访问时,因为调度器里面设置了调度规则,因此可以实现正常访问。
arp -d 172.25.76.100 #清除缓存
curl 172.25.76.100 #测试
查看调度器server1的eth0网卡ip地址:
4、DR模式下的LVS调度器(加权轮询算法)
调度器(server1):
在轮询算法LVS调度器的基础上,更改调度策略:
1、ipvsadm -C 清空策略
2、 添加策略:
ipvsadm -A -t 172.25.7.100:80 -s wrr
#设置客户端进入lvs调度器的入口地址,调度算法是加权轮询
ipvsadm -a -t 172.25.7.100:80 -r 172.25.7.2:80 -g -w 1
# 设置lvs的策略:入口的第一台后端服务器的信息,加权为1
ipvsadm -a -t 172.25.7.100:80 -r 172.25.7.3:80 -g -w 2
# 设置lvs的策略:入口的第二台后端服务器的信息,加权为2
arp -d 172.25.76.100
curl 172.25.76.100
1、ldirectord介绍
ldirectord对lvs策略的动态维护:ldirectord是监视集群节点(真实服务器),并从集群中自动移除节点,我们需要使用ldirectord程序,这个程序在启动时自动建立IPVS表(不用手动建立了),然后监视集群节点的健康情况,在发现失效节点时将其自动从IPVS表中移除。
2、 ldirectord是如何监视集群节点(真实服务器)的?
ldirectord守护进程通过向每台真实服务器真实IP(RIP)上的集群资源发送访问请求来实现对真实服务器的监控,这对所有类型的LVS集群都是成立的:LVS-DR,LVS-NAT和LVS-TUN。正常情况下,为每个Director上的VIP地址运行一个ldirectord守护进程,当真实服务器不响应运行在Director上的ldirectord守护进程时,ldirectord守护进程运行适当的ipvsadm命令将VIP地址从IPVS表中移除。(以后,当真实服务器回到在线状态时,ldirectord使用适当的ipvsadm命令将真实服务器重新添加到IPVS表中),
为了监视web集群内的真实服务器,ldirectord守护进程使用HTTP协议向每个真实服务器请求一个专用的web页面,如果真实服务器是健康的,Director知道将从真实服务器接收到什么内容,如果从真实服务器返回应答字串或web页面的时间太长,或根本没有返回任何内容,或返回的内容不是预期的,Director就知道该真实服务器出错了,并从IPVS表中将这个真实服务器移除。
背景: 之前DR模式下的LVS,我们都是假设后端服务器是可以正常工作。但对于一台后端服务器来说,它不可能永远是可以使用的,有自己的寿命或者会出现其它问题。当lvs集群中的一台后备服务器挂了之后,为了不影响客户的正常访问,应该将它从集群当中踢出去,让客户不再轮询访问。
模拟问题 :关闭server3的httpd服务,一个web挂了,会影响客户的访问。
客户端访问:
3、使用 ldirectord监视集群节点
LVS调度器 (server1)上
步骤一:配置高可用的yum源
先查看真机共享的镜像中高可用安装包位置:
配置yum仓库:
步骤二:安装ldirectord插件
yum install ldirectord-3.9.5-3.1.x86_64.rpm -y
rpm -qc ldirectord-3.9.5-3.1.x86_64 #查看已安装软件的配置文件
rpm -ql ldirectord-3.9.5-3.1.x86_64 #查询已安装软件包都安装到何处
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
vim /etc/ha.d/ldirectord.cf
systemctl start ldirectord
systemctl status ldirectord
客户端(真机)测试:
RS后端服务器(server2):
关闭httpd服务,模拟宕机。
客户端(真机)测试:
此时只有server3服务器在工作
调度器(server1):
查看到宕机后的server2已经从IPVS表中移除
RS后端服务器(server2):
开启httd服务,使其上线
客户端(真机)测试:
此时又恢复两台服务器轮询工作
调度器(server1):
查看到上线的server2已经从进入IPVS表,进行轮询调度
4、如果两个后端服务器都挂掉时,调度器会暂时充当服务器,给客户提供资源
在LVS调度器(server1)上:
步骤一:下载httpd服务,并编写配置文件
步骤二:关闭两个后端服务器
客户端(真机)测试:
LVS调度器查看IPVS列表:
调度器上线,暂时充当服务器,给客户提供资源