LVS负载均衡群集
一、LVS概述
1.工作原理
LVS(Linux Virtual Server)是一个用于构建高可用性和可伸缩性网络服务的开源软件,其工作原理如下:
负载均衡器(Load Balancer):
LVS 主要功能是作为一个负载均衡器,将来自客户端的请求分发到多个后端服务器,以达到分担负载、提高可用性和性能的目的。
四种调度算法:
LVS 提供了四种负载均衡调度算法,用于决定将请求发送到哪个后端服务器:
- 轮询调度(Round Robin):按照服务器列表的顺序依次分发请求。
- 加权轮询调度(Weighted Round Robin):根据服务器配置的权重分发请求,权重高的服务器获得更多的请求。
- 最少连接调度(Least Connections):将请求发送到当前连接数最少的服务器。
- 基于局部性的最少连接调度(Locality-Based Least Connections):根据客户端 IP 和服务器之间的连接状态来决定发送请求的服务器,以减少网络延迟。
网络地址转换(Network Address Translation,NAT):
LVS 通常使用 IP 负载均衡技术,其中负载均衡器将客户端请求的目标 IP 地址修改为一个后端服务器的 IP 地址,并将响应从后端服务器返回给客户端。这种方式隐藏了后端服务器的实际 IP 地址,增强了安全性和可伸缩性。
监控和故障检测:
LVS 负载均衡器通常与心跳监控(如Keepalived或者自定义脚本)结合使用,定期检测后端服务器的可用性。如果某个服务器宕机或者无法响应,负载均衡器将自动将其从池中移除,以避免将请求发送到不可用的服务器。
高可用性:
LVS 本身可以通过配置多个负载均衡器实现高可用性架构,利用浮动 IP 或者虚拟 IP 技术来确保即使一个负载均衡器故障,服务也能继续可用。
总之,LVS 通过将负载分发到多个服务器并处理后端服务器的故障,实现了高性能、高可用性和可伸缩性的网络服务架构。
2.LVS 的三种工作模式
NAT模式
调度器仅作为客户端的访问入口,节点服务器的响应消息是直接返回给客户端的,不需要经过调度器。
但是由于节点服务器需要部署在不同位置的公网环境中,需要具有独立的公网IP,调度器与节点服务器是通过专用的IP隧道实现相互通信的,因此IP隧道模式的成本较高、安全性较低,且IP隧道需要额外的封装和解封装,性能会受到一定的影响。
DR 模式(direct routing)
调度器仅作为客户端的访问入口,节点服务器的响应消息是直接返回给客户端的,不需要经过调度器。(与NAT模式的区别)
节点服务器与调度器是部署在同一个物理网络内,因此不需要建立专用的IP隧道。(与TUN模式的区别)
DR模式是企业首选的LVS模式。
TUN模式
调度器仅作为客户端的访问入口,节点服务器的响应消息是直接返回给客户端的,不需要经过调度器。
但是由于节点服务器需要部署在不同位置的公网环境中,需要具有独立的公网IP,调度器与节点服务器是通过专用的IP隧道实现相互通信的,因此IP隧道模式的成本较高、安全性较低,且IP隧道需要额外的封装和解封装,性能会受到一定的影响。
3.LVS
rr 轮询 wrr 加权轮询 sh 源地址哈希 dh 目的地址哈希 lc 最小连接 wlc 加权最小连接 lblc 基于地址的最小连接0
固定调度算法:rr、wrr、dh、sh
rr:轮询算法,将请求依次分配给不同的rs节点,即RS节点中均摊分配。适合于RS所有节点处理性能接近的情况。
wrr:加权轮询调度,一句不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值低的RS更多,相同权值的RS得到相同数目的连接数。
dh:目的地址哈希调度(destination hashing)以目的地址为关键字查找一个静态hash表来获得所需RS。
sh:源地址哈希调度(source hashing)以源地址为关键字查找一个静态hash表来获得需要的RS。
动态调度算法:wlc、lc、lblc
wlc:加权最小连接数调度,架设各台RS的权值依次为Wi,当前tcp连接数依次为Ti,依次去Ti/Wi为最小的RS作为下一个分配的RS。
lc:最小连接数调度(least-connection),ipvs表存储了所有活动的连接。LB会比较连接请求放到当前连接最少的RS。
lblc:基于地址的最小连接数(locality-based least-connection),将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。
4.ipvsadm工具
yum install -y ipvsadm
ipvsadm工具的功能
LVS群集创建与管理:
- 创建虚拟服务器
- 添加、删除服务器节点
- 查看群集及节点情况
- 保存负载分配策略
ipvsadm工具选项
-A: 添加虚拟服务器 -D: 删除整个虚拟服务器 -s: 指定负载调度算法(轮询: rr、加权轮询: wrr、最少连接: lc、加权最少连接: wlc) -a: 添加真实服务器(节点服务器) -d: 删除某一个节点 -t: 指定VIP地址及TCP端口 -r: 指定RIP地址及TCP端口 -m: 表示使用NAT群集模式 -g: 表示使用DR模式 -i: 表示使用TUN模式 一w: 设置权重(权重为0时表示暂停节点) -p 60: 表示保持长连接60秒 -l: 列表查看 LVS虚拟服务器(默认为查看所有) -n: 以数字形式显示地址、端口等信息,常与"-l“选项组合使用。ipvsadm -ln
二、LVS-NAT模式
1.LVS-NAT模式配置思路
1)配置 NFS 共享存储;
2)节点服务器安装 Web 服务,注意:默认网关要指向 调度器的IP地址,测试的时候关闭连接保持;
3)调度服务器要开启 IP路由转发 功能和设置 SNAT 等 iptables 规则,安装 ipvsadm 工具,配置虚拟服务器和真实节点服务器相关配置;
4)客户端测试的时候网关要指向 调度器的IP地址。
2.部署实例
调度器:内网关 ens33:192.168.100.254;外网关ens36:12.0.0.254
Web节点服务器1:192.168.100.146
Web节点服务器2:192.168.100.150
NFS服务器:192.168.100.140
客户端:12.0.0.10
3. 配置 NFS 共享存储
systemctl disable firewalld.service --now setenforce 0 yum install -y nfs-utils rpcbind systemctl start rpcbind nfs mkdir /opt/test1 /opt/test2 chmod 777 /opt/test1 /opt/test2 echo "This is test1 web" > /opt/test1/index.html echo "This is test2 web" > /opt/test2/index.html
#nfs vim /etc/exports /usr/share *(ro,sync) /opt/test1 192.168.2.0/24(rw,sync) /opt/test2 192.168.2.0/24(rw,sync)
systemctl start nfs
exportfs -rv #发布共享 showmount -e
4.配置web服务器
#web1 systemctl disable firewalld setenforce 0 yum install -y httpd systemctl start httpd yum install -y nfs-utils rpcbind systemctl start rpcbind mount.nfs 192.168.100.140:/opt/test1 /var/www/html [root@web1 ~]# vim /etc/fstab #末行写入,设置自动挂载 192.168.100.140:/opt/test1 /var/www/html nfs defaults,_netdev 0 0
#web2 mount.nfs 192.168.122.88:/opt/test2 /var/www/html vim /etc/fstab #末行写入,设置自动挂载 192.168.122.88:/opt/test2 /var/www/html nfs defaults,netdev 0 0
5. 配置负载调度器
配置SNAT转发规则
#开启路由转发 vim /etc/sysctl.conf #末行写入 net.ipv4.ip_forward = 1 sysctl -p iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens36 -j SNAT --to-source 12.0.0.254
安装ipvsadm管理工具
yum install -y ipvsadm #启动服务前需保存负载分配策略 ipvsadm-save > /etc/sysconfig/ipvsadm systemctl start ipvsadm
配置负载分配策略(NAT模式只要在服务器上配置,节点服务器不需要特殊配置)
ipvsadm -C #清除原有策略 #添加策略 ipvsadm -A -t 12.0.0.254:80 -s rr ipvsadm -a -t 12.0.0.254:80 -r 192.168.100.146:80 -m -w 1 ipvsadm -a -t 12.0.0.254:80 -r 192.168.100.150:80 -m -w 1 ipvsadm #启用策略 ipvsadm -ln #查看节点状态,Masq代表NAT模式 ipvsadm-save > /etc/sysconfig/ipvsadm #保存策略
--clear -C clear the whole table --add-service -A add virtual service with options --tcp-service -t service-address service-address is host[:port] --add-server -a add real server with options --scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq, the default scheduler is wlc. --real-server -r server-address server-address is host (and port) --masquerading -m masquerading (NAT) --weight -w weight capacity of real server
6. 访问测试
curl 12.0.0.254
三、LVS-DR模式
1.DR模式的特点
1)Director Server和Real Server必须在同一个物理网络中;
2)Real Server可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过互联网对RIP进行直接访问;
3)Director Server作为群集的访问入口,但不作为网关使用;
4)所有的请求报文经由Real Server,但回复响应报文不能经过Director Server;
5)Real Server的网关不允许指向Director Server IP,即Real Server发送的数据包不允许经过Director Server;
6)Real Server上的lo接口配置VIP的IP地址。
2.LVS-DR中的ARP问题及解决方法
ARP问题1-相同IP
#原因 在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址。 在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱。
#解决思路及方法 当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播。 只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播。 对节点服务器进行处理,使其不响应针对VIP的ARP请求。 使用虚接口lo:0承载VIP地址; 设置内核参数arp_ignore=1(系统只响应目的IP为本地IP的ARP请求)。
arp_ignore参数控制了内核对ARP请求的响应行为,其值范围为0到8,每个值定义了不同的响应策略: arp_ignore = 0:内核将对所有ARP请求进行响应,不论请求目标IP地址是否匹配本地网络接口。 arp_ignore = 1:内核仅对那些请求目标IP地址匹配本地网络接口的ARP请求进行响应。这意味着系统会忽略所有目标IP地址不匹配本地网络接口的ARP请求。 arp_ignore = 2:内核仅在目标IP地址既匹配本地网络接口的IP地址,又匹配从哪个接口接收到的ARP请求时,才进行响应。 arp_ignore = 3:内核将对本地子网的ARP请求进行响应。 arp_ignore = 4到8:这些值提供了更细粒度的控制,用于高级网络配置和特定需求场景。
ARP问题2-响应报文的源IP
#原因
ARP请求中的源IP地址:
在默认情况下,Linux内核在发送ARP请求时会使用IP包的源IP地址作为ARP请求包中的源IP地址。
在LVS DR模式下,Real Server返回的数据包的源IP地址是VIP(虚拟IP地址),但是这些数据包是通过Real Server的实际网络接口(例如ens33)发送出去的。
ARP表项冲突:
路由器根据ARP表项,会将新的请求报文转发给Real Server。如果Real Server发送的ARP请求使用了VIP作为源IP地址,路由器的ARP表项可能会错误地映射VIP到Real Server的MAC地址。
这种情况下,当客户端尝试访问VIP时,路由器会将流量发送到Real Server而不是Director,导致Director的VIP失效,从而影响LVS的正常工作。
#解决方法 对节点服务器进行处理,设置内核参数arp_announce=2(系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址)
arp_announce参数可以取不同的值,每个值都有特定的行为: 0: 内核使用任何本地地址,即使它不是发送ARP请求的接口的最佳地址。这是默认的行为。 1: 内核尝试选择发送ARP请求的接口上的最佳本地地址。如果没有找到合适的地址,它会使用任何本地地址。 2: 内核严格选择发送ARP请求的接口上的最佳本地地址,并且只使用该接口上的地址。这是最严格的方法,确保ARP请求中的源IP地址与发送接口的地址一致。
预防方法
修改/etc/sysctl.conf文件,末行添加如下内容:
net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 #arp_ignore = 1 #防止网关路由器发送ARP广播时,调度器和节点服务器都进行相应,导致ARP缓存表的紊乱,不对非本地物理网卡IP的ARP请求进行响应,因为VIP是承载在lo:0。 #arp_announce = 2 #系统不使用响应数据包的源IP地址(VIP)来作为本机进行ARP请求报文的源IP地址,而使用发送报文的物理网卡IP地址作为ARP请求报文的源IP地址,这样可以防止网关路由器接收到源IP地址为VIP的ARP请求报文后又更新ARP缓存表,导致外网再发送请求时,数据包到不了调度器。
3.部署实例
调度器:192.168.100.254
Web节点服务器1:192.168.100.146
Web节点服务器2:192.168.100.150
NFS服务器:192.168.100.140
VIP:192.168.100.199
4.配置负载调度器
配置虚拟IP地址
cd /etc/sysconfig/network-scripts cp ifcfg-ens33 ifcfg-ens33:0 #若是隧道模式,复制为ifcfg-tun10 vim ifcfg-ens33:0 DEVICE="ens33:0" BOOTPROTO="static" ONBOOT="yes" IPADDR=192.168.100.199 NETMASK=255.255.255.0
调整/proc响应参数
#调整/proc响应参数 对于 DR 群集模式来说,由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭 Linux 内核的重定向参数响应。
#服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能
vim /etc/sysctl.conf #末行写入以下内容 net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.ens33.send_redirects = 0 sysctl -p
配置负载分配策略
ipvsadm-save >/etc/sysconfig/ipvsadm systemctl start ipvsadm ipvsadm -C #添加策略,若隧道模式,-g替换为-i ipvsadm -A -t 192.168.100.199:80 -s rr ipvsadm -a -t 192.168.100.199:80 -r 192.168.100.146:80 -g ipvsadm -a -t 192.168.100.199:80 -r 192.168.100.150:80 -g #保存策略并查看 ipvsadm ipvsadm -ln
--gatewaying -g gatewaying (direct routing) (default)
5.配置节点服务器
配置虚拟IP地址(VIP:192.168.2.199)
此地址仅用作发送Web响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发)。
因此使用虚接口lo:0来承载VIP地址,并为本机添加一条路由记录,将访问VIP的数据限制在本地,以避免通信紊乱。
cd /etc/sysconfig/network-scripts #配置lo:0 cp ifcfg-lo ifcfg-lo:0 vim ifcfg-lo:0
DEVICE="lo:0"
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=192.168.100.188
NETMASK=255.255.255.255
#注意:子网掩码必须全为1 ifup lo:0 ifconfig lo:0 route add -host 192.168.100.199 dev lo:0 #临时添加 vim /etc/rc.local #末行添加,加入开机自启动 /sbin/route add -host 192.168.100.199 dev lo:0 chmod +x /etc/rc.d/rc.local
调整内核的ARP响应参数以组织更新VIP的MAC地址,避免发生冲突
vim /etc/sysctl.conf net.ipv4.conf.lo.arp_ignore = 1 #系统只响应目的IP为本地IP的ARP请求 net.ipv4.conf.lo.arp_announce = 2 #系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 sysctl -p
6.浏览器访问测试