当前位置: 首页 > Linux

【负载均衡LVS系列2】——LVS基本配置

时间:2023-04-06 22:51:13 Linux

系列1文章简要介绍了LVS的五种常见工作模式,然后主要介绍了LVS的工作原理。IPVSADM和IPVSLVS负责四层负载均衡调度。当我们要定义集群的调度规则时,需要用到一个管理工具,它就是ipvsadm。ipvsadm定义的规则最终是通过IPVS实现的,也就是说ipvsadm是IPVS的管理工具,ipvsadm工作在用户空间,IPVS工作在内核空间。两者之间的关系就像iptables和netfliter。IPVS支持TCP/UDP协议,会从TCPSYNC包开始对一个TCP连接的所有数据包建立状态跟踪机制,以保证一个TCP连接中的所有数据包都能到达同一个后端。因此,IPVS基于TCP状态机进行控制和管理,只感知TCP头,不查看TCP负载;因此,对于IPVS后端服务器集群还有一个假设,即所有后端都具有相同的应用层服务功能,但由于IPVS可以为后端设置权重,因此各个后端的服务能力可以不同。`IPVS(IPVirtualServer)发展历史:早在2.2内核中,IPVS就以内核补丁的形式出现。从2.4.23版本开始,IPVS软件是合并到Linux内核中的内核补丁的通用版本集合。从2.4.24开始,IPVS成为Linux官方标准内核的一部分,作为Netfilter的一个模块存在。Client访问服务时,会访问VIP及其对应的端口,所以LVS收到的请求报文先经过PREROUTING链,然后再进行。路由判断,因为此时的DIP是VIP,也就是设备IP(配置在网卡接口上),所以请求报文会经过INPUT链。此时如果IPVS发现消息访问的VIP和端口符合定义的规则,IPVS会根据定义的规则和算法直接将消息发送到POSTROUTING链,最后将消息从LVS发送到后端RS。IPVSADM用法我们以LVS的DR模式为例。安装ipvsadm后,在dispatcher上执行如下命令:ipvsadm-A-tVIP:port-srripvsadm-a-tVIP:port-rRIP1-gipvsadm-a-tVIP:port-rRIP2-g//本例配置如下//ipvsadm-A-t192.168.0.100:80-srr//ipvsadm-a-t192.168.0.100:80-r192.168.0.4-g//ipvsadm-a-t192.168。0.100:80-r192.168.0.5-gipvsadm-A-tVIP:port-srr-A选项是添加虚拟服务器记录,即创建LVS集群-t标识创建的LVS集群服务为tcp协议,VIP:port标识集群服务IP和端口号-s调度含义,后面的参数是指定的调度算法,包括rr,wrr,lc,wlc,lblc,lblcr,dh,sh,sed,nq,默认是wlc,其中rr是Round-Robin的缩写,代表循环算法。所以在创建了一个LVS服务集群之后,我们需要设置具体的后端RS,调度算法等信息同上-r用于指定要添加的RIP(RS对应IP)-g表示LVS工作模式为DR模式,-i为TUN模式,-m为NAT模式配置后我们使用ipvsadm-ln查看有效规则,但要注意一点。如果规则没有提前保存,设备重启后配置会消失,所以我们需要在配置后使用serviceipvsadmsave保存命令,重启后使用serviceipvsadmreload加载规则。另外可以使用-S将LVS规则保存在指定文件中,使用-R重新加载ipvsadm-S>fileipvsadm-RRemoteAddress:PortForwardWeightActiveConnInActConnTCP192.168.0.100:80rr->192.168.0.4:80Route100->192.168.0.5:80Route100//ipvsadm规则生成[root@LVS~]#ifconfigens33:0192.168.0.100/32upReal服务器配置首先部署http服务。这里使用nginx。由于接收到的数据包的目的IP是VIP,所以需要在lo中添加一个VIP,因为RSVIP并不是用来通信的,这里必须设置/32位掩码![root@RealServer1~]#rpm-ivhhttp://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm[root@RealServer1~]#yuminstallnginx-y[root@RealServer1~]#nginx//启动nginx[root@RealServer1~]#vi/usr/share/nginx/html/index.html//改为RealServer1192.168.0.4[root@RealServer1~]#curl127.0.0.1RealServer1192.168.0.4//至此已经部署了http服务[root@RealServer1~]#ifconfiglo:0192.168.0.100/32up//将vip添加到lo:0,掩码为/32此时,你会误以为配置完成,集群可以正常服务了,但是当客户端实际测试的时候,你会发现ARP请求VIP时,LVS、RS1、RS2都会响应,导致负载均衡不生效。[root@Client~]#arping-Iens33192.168.0.100ARPING192.168.0.100from192.168.0.3ens33Unicastreplyfrom192.168.0.100[00:0C:29:AF:6B:F7]1.778msUnicastreplyfrom192.1029:0:AC:67:31]来自192.168.0.100[00:0C:29:BD:38:DA]的1.852ms单播回复来自192.168.0.100[00:0C:29:BD:38:DA]]1.860ms单播的回复replyfrom192.168.0.100[00:0C:29:BD:38:DA]1.860ms//会发现有3个设备响应ARP请求,最后是00:0C:29:BD:38:DA(RS1)[root@Client~]#arping-Iens33192.168.0.2ARPING192.168.0.2from192.168.0.3ens33Unicastreplyfrom192.168.0.2[00:0C:29:AF:6B:F7]1.500ms[root@Client~]#arping-Iens33192.168.0.4ARPING192.168.0.4from192.168.0.3ens33Unicastreplyfrom192.168.0.4[00:0C:29:BD:38:DA]1.609ms[root@Client~]#arping-Iens33192.168.05。ARPING192.168.0.5from192.168.0.3ens33Unicastreplyfrom192.168.0.5[00:0C:29:AC:67:31]1.603ms//三个设备分别是LVS、RS1、RS2,因为RSlo已经配置好了VIP,由于arp_ignore默认为0,设备默认会响应VIP对应的ARP请求。配置说明参考Linux内核参数arp_ignore和arp_announcearp_ignore。在DR模式下,每个RS必须添加一个VIP到lo。由于arp_ignore默认为0,所以每个RS都会响应VIP对应的ARP请求。此时Client无法在LVS上正确获取VIP所在网卡的mac。虽然请求包到达其中一个RS,RS可以正常响应,但是由于包绕过了LVS,没有起到负载均衡的作用,所以在流量大的时候容易出现瓶颈。因此在DR模式下需要将arp_ignore参数设置为1。arp_announce每个设备都会维护自己的ARP表。当收到未知IP地址的arp请求时,会将对端的IP和MAC记录添加到本地arp表中;当收到一个已知IP地址(地址已经记录在arp表中)的arp请求时,它会根据arp请求中的源MAC刷新自己的arp表。因此在DR模式下arp_announce参数必须设置为2。[root@RealServer1~]#echo"1">/proc/sys/net/ipv4/conf/all/arp_ignore[root@RealServer1~]#echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignore[root@RealServer1~]#echo"2">/proc/sys/net/ipv4/conf/all/arp_announce[root@RealServer1~]#echo"2">/proc/sys/net/ipv4/conf/lo/arp_announceClient测试配置RealServer1和RealServer2的arp_ignore和arp_announce后,在Client上测试服务[root@Client~]#arping-Iens33192.168.0.100ARPING192.168.0.100from192.168.0.3ens33Unicast.10.10from1600:0C:29:AF:6B:F7]1.301ms单播回复来自192.168.0.100[00:0C:29:AF:6B:F7]0.827ms单播回复来自192.168.0.100[00:0C:29:AF:6B:F7]0.887msUnicastreplyfrom192.168.0.100[00:0C:29:AF:6B:F7]0.801ms//响应LVS的ARP请求[root@Client~]#curl192.168.0.100RealServer2192.168.0.5[root@Client~]#curl192.168.0.100RealServer1192.168.0.4[root@Client~]#curl192.168.0.100RealServer2192.168.0.5[root@Client~]#curl192.168.0.100RealServer1192.168RealServer1/byServer21:1pollingresponserequest至此我们手动配置了一个基本的DR-LVS集群,但是缺点也很明显:配置较多,ipvs规则固定难维护,如果后端RS失效,还是会分配,也就是说,没有后端检测到单个LVS,单点故障概率高,所以后续引入keepalived-LVS集群来解决上述问题。参考文章LVS官方文档ipvsadm命令讲解LVS调度算法Linux内核参数arp_ignore和arp_announce