目录
一. LVS简介
二、lvs的三种工作模式
1、NAT模式
2、DR工作模式
3、TUN工作模式
三、DR模式实现负载均衡
四、ARP协议
五、LVS心跳检测——keepalived
六、LVS冗余——高可用
LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器,是一个虚拟的服务器集群系统
LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。但是,只能做代理使用,只支持四层协议。不支持正则处理,不支持动静分离。
工作原理:调度器上双网卡,一个ip为内网ip和节点一个网段,一个ip为VIP,为外网ip,和客户机一个网段,在调度器上设置调度策略,通过客户端访问调度器,调度器修改请求的源和目的地址后发送给要调度的服务器,服务器处理完请求之后,返回数据到调度器(服务器的默认路由是调度器),调度器修改源和目的地址,通过调度器返回数据到客户端
缺点:请求和响应的数据包都必须经过vs,而且需要修改源ip和目的ip,vs的处理能有限,形成瓶颈。
工作原理:在vs和rs上都设置有同一个vip,vs和rs都有两个ip地址,除了vip之外的ip,他们是统一个网段的能够相互通信,在vs上设置轮询策略,在rs设置上丢掉访问vip的请求的策略,那么在client访问vip的时候,就只能唯一经过vs的vip,也就是只能通过vs请求资源,因为他们处于同一个网段,所以使用MAC地址进行通信,在vs上边修改请求的源MAC和目的MAC,不改变源cip和目的ip(vip),所以rs处理完请求后,所以rs直接通过网关直接返回数据包(源vip,目的cip)给客户端,不经过vs。
注意:调度器要有所有服务器的的解析,并且每个主机的两个ip都在同一个网卡上
工作原理:比起NAT技术,由于请求和响应都需要通过VS进行地址的改写,那么当客户端的请求越来越多的时候,VS的处理能力就会成为一个瓶颈。为了解决这个问题,VS通过IP隧道,将客户端的请求(源(cip),目的(vip))通过IP隧道(此过程是对请求数据包进行封装,在原来请求数据的基础上添加头部(包括新的源(vip)和目的rip)),发送给真实的服务器,服务器打开封装(封装里边cip,vip不变),处理请求,处理完成后,直接通过网关直接返回响应给客户端,不经过vs。
server1为调度器,负载流量均衡(基于4层即传输层进行调度,调度算法有WRR/WLC等,传输协议为TCP/UDP),server2和server3为真实服务器j
在server1中安装ipvsadm,用于管理LVS的策略规则,从而调度用户访问
添加一个对外访问的虚拟IP:172.25.7.100即 VIP,提供虚拟服务的ip地址
安装开启http服务
yum install httpd -y
yum install ipvsadm -y
ip addr add 172.25.7.100/24 dev eth0 #添加VIP
书写策略:
ipvsadm -A 添加规则;-t tcp协议;-s 调度;rr 轮循
-a向tcp虚拟服务添加
-r real server真实服务
-g 直连即DR模式
ipvsadm -ln:查看当前连接情况(-ln没有解析,-l有解析,但是速度慢)
Forward:转发方式,当前是路由转发;
Weight:权重;
ActiveConn:当前活跃的连接数;
InActConn:当前不活跃的连接数
将完成的配置保存
ipvsadm-save -n > /etc/sysconfig/ipvsadm 保存策略文件
ipvsadm -C 清楚当前配置
重新启动发现保存的策略文件生效
此时在真机上curl命令卡住不显示内容,但用 ipvsadm -ln:查看当前连接情况,可以看到出现了新的连接
server2和server3安装httpd服务,在http服务的默认发布文件index.html分别写入server2、server3并开启服务
在真机使用curl 172.25.35.2/3可以显示server的发布页面,但curl 172.25.35.100没有输出,这是因为LVS-DR集群类型要求,当用户向vip发起请求时,调度器和真实服务器上必须都要有vip,因此需要给server2和server3添加虚拟IP
此时真机使用curl 172.25.7.100,开始轮训访问server2/server3的http
ARP协议是将IP地址映射为MAC地址的协议,其在协议上使用ARP请求及ARP应答报文来实现
arp -d是删除ARP缓存列表的命令,可以删除所有的ARP缓存,也可以删除指定的ARP缓存
此时使用arp -an可以查看本地ARP缓存的172.25.35.100对应的MAC地址为调度器server1的地址
#真机中
arp -an |grep 100
#server1
ip addr #查看MAC地址
当真机执行arp -d 删除指定虚拟IP的ARP缓存后,将不能得到172.25.35.100的MAC地址。
再次Ping之后又可以得到,但是已经不是调度器的地址(谁先响应就缓存谁的MAC地址)
这里响应的是server3的MAC地址
此时curl 172.25.35.100,只有server3,已经不轮循访问,说明此时客户端向vip发起请求时,并没有经过调度器而是直接到达了真实服务器
要想避免这种情况的发生,我们需要防止客户端直接访问真实服务器,所以我们需要禁掉设备的ARP响应
在server2和server3上安装ARP防火墙arptables——用于管理内核中的ARP包过滤规则表
ARP配置规则
arptable_filter 只有一个表 filter ,不指定 -t 表名时默认就是 filter 表
filter表有三个链,一个是INPUT,表示外面发进来的ARP包;另外一个是OUTPUT,表示本机发出的ARP包;第三个是FORWARD,转发ARP包
-A:向规则链中追加规则
-d:指定要匹配ARP包的目的IP地址
-j:指定满足添加的规则时执行的动作
-s:指定要匹配ARP包的源ip地址
-g:直连
-r:真实服务器地址
在server2/3上设定ARP规则:
当数据包的目的地址是100时就丢弃该数据包,当从本机发送出的数据包IP是100时,mangle转换数据包源地址,伪装源地址IP为172.25.35.2/3
arptables -A INPUT -d 172.25.35.100 -j DROP #在ARP协议中添加规则,指定虚拟IP访问时拒绝
arptables -A OUTPUT -s 172.25.35.100 -j mangle --mangle-ip-s 172.25.35.2 #从虚拟IP发送出去的数据源地址转换为172.25.35.2
arptables-save > /etc/sysconfig/arptables #保存策略到文件中
arptables -F #删除当前配置的策略
systemctl restart arptables.service #重启服务
arptables -nL #查看策略
当真机再次执行arp -d 删除指定的虚拟IP,ping 虚拟IP之后,得到172.25.35.100的MAC地址是server1的MAC地址,此时使用curl 172.25.35.100,可以轮询访问
for i in {1..10}; do curl 172.25.7.100; done; #轮询访问
这样使用LVS会出现一个问题,当真实服务器宕机的时候,客户访问时当LVS匹配到宕机主机时客户端会报错,ipvsadm策略依然可以看到服务器存在,所以引入LVS高可用来解决这个问题
ipvsadm没有健康检测功能,后端服务是否正常需要通过keepalived来检测
server1:
客户访问时当LVS匹配到宕机主机时客户端会报错
此时删掉server1上手动设置的虚拟ip172.25.33.100,ipvsadm -C清除设置的规则
ip addr del 172.25.7.100/24 dev eth0 #删除VIP
ip addr #查看IP
ipvsadm -C #清楚ipvsadm设定的规则
ipvsadm -ln #查看规则
心跳检测keepalived配置完毕后,停止server3的http服务,在server1上查看将检测不到server3,客户端自然也访问不到已经停止运行的服务器,不会出现访问报错,只显示server2访问成功
注意: 如果server1也安装了httpd服务,curl 172.25.33.100不会访问server1的80
配置备用LVS调度器server4
在server4上下载keepalived
将server1的keepalived.conf文件scp传输到server4
在server4上修改BACKUP、优先级(数字越小, 优先级越低)
重启keepalived服务,之后安装ipvsadm(用于管理LVS的策略规则)
查看日志可以看到keepalived状态
当server1停止keepalived服务后,再次查看server4的日志,可以看到此时的server4是MASTER
真机中访问VIP
通过arp -an | grep 100查看MAC地址,对比发现是server4的MAC地址
再次开启server1的 keepalived服务后,因为优先级较高,过滤得到172.25.35.100的MAC地址是server1的MAC地址,此时server4为BACKUP